diff --git a/.github/workflows/buf-pull-request.yml b/.github/workflows/buf-pull-request.yml index 11c7bae50e..ec58046a07 100644 --- a/.github/workflows/buf-pull-request.yml +++ b/.github/workflows/buf-pull-request.yml @@ -1,12 +1,12 @@ name: Protobuf on: # Exclude feature branches, only run if the PR is targeting main. - pull_request_target: - types: - - opened + pull_request: branches: - "main" jobs: + # Ensure there are no breaking changes to the protocol specs, + # by running the "buf lint" action against the changes in this PR. lint: name: Lint protobuf runs-on: ubuntu-latest @@ -16,7 +16,6 @@ jobs: with: buf_api_token: ${{ secrets.BUF_TOKEN }} github_token: ${{ secrets.GITHUB_TOKEN }} - # input: 'proto' - uses: bufbuild/buf-lint-action@v1 with: @@ -44,10 +43,11 @@ jobs: # The 'main' branch of the GitHub repository that defines the module. against: "https://github.com/${GITHUB_REPOSITORY}.git#branch=main,subdir=proto" + # Run our bespoke tooling for codegen, consuming the protocol buffer definitions + # and emitting generated code. Afterward, there should be no uncommitted changes. protobuf-fresh: name: Compile protobuf specs to rust code runs-on: buildjet-16vcpu-ubuntu-2204 - # runs-on: ubuntu-latest steps: - name: Checkout the source code uses: actions/checkout@v4 diff --git a/.github/workflows/deploy-preview.yml b/.github/workflows/deploy-preview.yml index dd28f12c29..4222cf0531 100644 --- a/.github/workflows/deploy-preview.yml +++ b/.github/workflows/deploy-preview.yml @@ -71,14 +71,3 @@ jobs: - name: bounce grpcui run: kubectl rollout restart deployment grpcui-preview - - - name: bounce osiris - run: kubectl rollout restart deployment osiris-preview - - # We only run one (1) relayer instance, and re-deploy it as part of the preview update. - # The other end of the configured path is the long-running testnet. - # We ignore errors on the bounce, because we may have removed the deployment out of band: - # we're still working on reliable packet relaying between test chains. - - name: bounce relayer - run: |- - kubectl rollout restart deployment relayer-preview || true diff --git a/.github/workflows/deploy-testnet.yml b/.github/workflows/deploy-testnet.yml index 9bc91adab1..8019000003 100644 --- a/.github/workflows/deploy-testnet.yml +++ b/.github/workflows/deploy-testnet.yml @@ -64,18 +64,6 @@ jobs: - name: bounce grpcui run: kubectl rollout restart deployment grpcui-testnet - - name: bounce osiris - shell: bash - run: |- - export PENUMBRA_VERSION='${{ github.event.inputs.image_tag || github.ref_name }}' - # Set the exact version for the current testnet for Osiris, so deps match. - kubectl set image deployments \ - -l "app.kubernetes.io/instance=osiris-testnet" \ - "osiris=ghcr.io/penumbra-zone/osiris:penumbra-${PENUMBRA_VERSION}" - # Wait for rollout to complete. Will block until pods are marked Ready. - kubectl rollout status deployment \ - -l "app.kubernetes.io/instance=osiris-testnet" - - name: bounce galileo shell: bash run: |- diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml index f9c0a2c4b4..37062e81ff 100644 --- a/.github/workflows/rust.yml +++ b/.github/workflows/rust.yml @@ -16,7 +16,7 @@ jobs: - name: Load rust cache uses: astriaorg/buildjet-rust-cache@v2.5.1 - name: Run cargo check, failing on warnings - run: cargo check --release + run: cargo check --release --all-targets env: # The `-D warnings` option causes an error on warnings; # we must duplicate the rustflags from `.cargo/config.toml`. diff --git a/Cargo.lock b/Cargo.lock index 634a997073..0fed768011 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -596,13 +596,13 @@ dependencies = [ [[package]] name = "async-global-executor" -version = "2.4.0" +version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b4353121d5644cdf2beb5726ab752e79a8db1ebb52031770ec47db31d245526" +checksum = "05b1b633a2115cd122d73b955eadd9916c18c8f510ec9cd1686404c60ad1c29c" dependencies = [ "async-channel 2.1.1", "async-executor", - "async-io 2.2.1", + "async-io 2.2.2", "async-lock 3.2.0", "blocking", "futures-lite 2.1.0", @@ -648,9 +648,9 @@ dependencies = [ [[package]] name = "async-io" -version = "2.2.1" +version = "2.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6d3b15875ba253d1110c740755e246537483f152fa334f91abd7fe84c88b3ff" +checksum = "6afaa937395a620e33dc6a742c593c01aced20aa376ffb0f628121198578ccc7" dependencies = [ "async-lock 3.2.0", "cfg-if", @@ -719,7 +719,7 @@ version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9e47d90f65a225c4527103a8d747001fc56e375203592b25ad103e1ca13124c5" dependencies = [ - "async-io 2.2.1", + "async-io 2.2.2", "async-lock 2.8.0", "atomic-waker", "cfg-if", @@ -1514,6 +1514,7 @@ dependencies = [ "pbjson 0.5.1", "pin-project", "prost", + "regex", "rocksdb", "serde", "sha2 0.10.8", @@ -2462,9 +2463,9 @@ dependencies = [ [[package]] name = "eyre" -version = "0.6.10" +version = "0.6.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8bbb8258be8305fb0237d7b295f47bb24ff1b136a535f473baf40e70468515aa" +checksum = "80f656be11ddf91bd709454d15d5bd896fbaf4cc3314e69349e4d1569f5b46cd" dependencies = [ "indenter", "once_cell", @@ -3260,14 +3261,15 @@ dependencies = [ [[package]] name = "ibc-proto" -version = "0.39.1" +version = "0.40.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8a8b1356652b9f160f5a010dd6b084675b8a28e163bf2b41ca5abecf27d9701" +checksum = "4222cfac37f21da28292db0f2673fdb8455284895891ff09979680243efb9a20" dependencies = [ "base64 0.21.5", "bytes", "flex-error", "ics23", + "informalsystems-pbjson 0.7.0", "prost", "serde", "subtle-encoding", @@ -3277,9 +3279,9 @@ dependencies = [ [[package]] name = "ibc-types" -version = "0.10.0" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd0a8726baeff64a88d7cbfdba30ecc72f43a4c4f666c62be5ad1e13db16dc42" +checksum = "345e31ea9be7b5b3e98bcd8a2a3b2376d2ab8663d455ba6ac83e53c1048510d6" dependencies = [ "ibc-types-core-channel", "ibc-types-core-client", @@ -3295,9 +3297,9 @@ dependencies = [ [[package]] name = "ibc-types-core-channel" -version = "0.10.0" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "929ed12868a24aee42ad216da8ce644b3197da8a2a99d232325315cc83b95bac" +checksum = "7dca175f7e461227e22b1978eb65445a4013c233845c2c6aabde5abace557a81" dependencies = [ "anyhow", "bytes", @@ -3328,9 +3330,9 @@ dependencies = [ [[package]] name = "ibc-types-core-client" -version = "0.10.0" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be5f2c8a94eba2a1b893254c6e1fed5eaea4d2b782a244c09a9fca6ce327d3d3" +checksum = "35cb6d632bf050c1891fb9c3958b6ec119cc0e3861954f6f87b332f8687f8d51" dependencies = [ "anyhow", "bytes", @@ -3355,9 +3357,9 @@ dependencies = [ [[package]] name = "ibc-types-core-commitment" -version = "0.10.0" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07db7e1100ef3ceab4e9218eae3b999b7e728b377fedbe575419a16dbf97b8ce" +checksum = "e57ec19137bd7f35724bb130770d695533e67224c0ff5cb98c30ad591f392377" dependencies = [ "anyhow", "bytes", @@ -3390,9 +3392,9 @@ dependencies = [ [[package]] name = "ibc-types-core-connection" -version = "0.10.0" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d891d04932818c943ad26e31e24327089589669e9bbd9eeeadd922fe1c5ec3d0" +checksum = "f86f9467e70cf1236af7c5d0d475983a2ebcc02622c5ccefb30263f33747ebb5" dependencies = [ "anyhow", "bytes", @@ -3420,9 +3422,9 @@ dependencies = [ [[package]] name = "ibc-types-domain-type" -version = "0.10.0" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c4aa0ca354ac01399b72b2e338224f49709163416c880a1510b15f3e5461cb4" +checksum = "0ac16371dda10031cb6824352cfaf830da98acc5feacb025e6330f6eb048fd4a" dependencies = [ "anyhow", "bytes", @@ -3431,9 +3433,9 @@ dependencies = [ [[package]] name = "ibc-types-identifier" -version = "0.10.0" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "045d626ba8fd79a0d22c19b55470f19741ef5aab43f47eb3659a1757f965cc66" +checksum = "99892ea17faa9b38ac172ed996be8f7a1b28f5020729634c52af7c5e1dc24c0a" dependencies = [ "displaydoc", "serde", @@ -3442,9 +3444,9 @@ dependencies = [ [[package]] name = "ibc-types-lightclients-tendermint" -version = "0.10.0" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22e016b4520121e1917d4fbb35aa353864c0ec88225652d581a408f59ebd0736" +checksum = "fbfb501b8c9c97d54b6368ff70ac0804af94a0668805e822bb303cc76f6f1aa0" dependencies = [ "anyhow", "bytes", @@ -3479,9 +3481,9 @@ dependencies = [ [[package]] name = "ibc-types-path" -version = "0.10.0" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db4c25c82d976ead3dd925bb4fabdcf7862e9305ef2ffc50c8a9ba9463b1e005" +checksum = "7121ab67e172915d20d9bdebcb54fb41e940461ddcd37cd108e233df2f898bb9" dependencies = [ "bytes", "derive_more", @@ -3502,9 +3504,9 @@ dependencies = [ [[package]] name = "ibc-types-timestamp" -version = "0.10.0" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "773c0b6f0cc6d9cec8b04e78fd9fcafbea14ce56ce36d0b4cf5386e4dd171c93" +checksum = "e9f46394de8d492afc1bc43b83bddeffe086c93270b7f89fddf04f046adbaeba" dependencies = [ "bytes", "displaydoc", @@ -3521,9 +3523,9 @@ dependencies = [ [[package]] name = "ibc-types-transfer" -version = "0.10.0" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "139137fac90c907ccaed4b191844f71347c29ff93e9adf724e5dfc0595b1a60a" +checksum = "c9352195987055fde11c32c1f5ed238e452d96b1fa021d642c3c2b12c05963dc" dependencies = [ "displaydoc", "serde", @@ -3551,7 +3553,7 @@ dependencies = [ "anyhow", "bytes", "hex", - "informalsystems-pbjson", + "informalsystems-pbjson 0.6.0", "prost", "ripemd", "serde", @@ -3722,6 +3724,16 @@ dependencies = [ "serde", ] +[[package]] +name = "informalsystems-pbjson" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aa4a0980c8379295100d70854354e78df2ee1c6ca0f96ffe89afeb3140e3a3d" +dependencies = [ + "base64 0.21.5", + "serde", +] + [[package]] name = "inout" version = "0.1.3" @@ -4662,9 +4674,9 @@ dependencies = [ "penumbra-app", "penumbra-asset", "penumbra-chain", + "penumbra-community-pool", "penumbra-compact-block", "penumbra-custody", - "penumbra-dao", "penumbra-dex", "penumbra-fee", "penumbra-governance", @@ -4692,6 +4704,7 @@ dependencies = [ "serde_json", "serde_with 1.14.0", "sha2 0.9.9", + "simple-base64", "tempfile", "tendermint", "tokio", @@ -4923,8 +4936,8 @@ dependencies = [ "parking_lot 0.12.1", "penumbra-asset", "penumbra-chain", + "penumbra-community-pool", "penumbra-compact-block", - "penumbra-dao", "penumbra-dex", "penumbra-distributions", "penumbra-fee", @@ -4939,6 +4952,7 @@ dependencies = [ "penumbra-stake", "penumbra-tct", "penumbra-transaction", + "penumbra-txhash", "prost", "rand_chacha 0.3.1", "rand_core 0.6.4", @@ -5029,7 +5043,7 @@ dependencies = [ "num-bigint", "once_cell", "penumbra-asset", - "penumbra-dao", + "penumbra-community-pool", "penumbra-dex", "penumbra-fee", "penumbra-governance", @@ -5071,6 +5085,7 @@ dependencies = [ "penumbra-num", "penumbra-proto", "penumbra-tct", + "penumbra-txhash", "serde", "sha2 0.9.9", "tendermint", @@ -5079,6 +5094,39 @@ dependencies = [ "tracing", ] +[[package]] +name = "penumbra-community-pool" +version = "0.64.1" +dependencies = [ + "anyhow", + "ark-ff", + "async-trait", + "base64 0.20.0", + "blake2b_simd 0.5.11", + "cnidarium", + "cnidarium-component", + "futures", + "hex", + "metrics", + "once_cell", + "pbjson-types", + "penumbra-asset", + "penumbra-chain", + "penumbra-keys", + "penumbra-num", + "penumbra-proto", + "penumbra-sct", + "penumbra-shielded-pool", + "penumbra-txhash", + "prost", + "serde", + "sha2 0.10.8", + "tendermint", + "tendermint-light-client-verifier", + "tokio", + "tracing", +] + [[package]] name = "penumbra-compact-block" version = "0.64.1" @@ -5095,7 +5143,7 @@ dependencies = [ "im", "metrics", "penumbra-chain", - "penumbra-dao", + "penumbra-community-pool", "penumbra-dex", "penumbra-fee", "penumbra-governance", @@ -5138,6 +5186,7 @@ dependencies = [ "penumbra-keys", "penumbra-proto", "penumbra-transaction", + "penumbra-txhash", "prost", "rand_core 0.6.4", "serde", @@ -5149,38 +5198,6 @@ dependencies = [ "tracing", ] -[[package]] -name = "penumbra-dao" -version = "0.64.1" -dependencies = [ - "anyhow", - "ark-ff", - "async-trait", - "base64 0.20.0", - "blake2b_simd 0.5.11", - "cnidarium", - "cnidarium-component", - "futures", - "hex", - "metrics", - "once_cell", - "pbjson-types", - "penumbra-asset", - "penumbra-chain", - "penumbra-keys", - "penumbra-num", - "penumbra-proto", - "penumbra-sct", - "penumbra-shielded-pool", - "prost", - "serde", - "sha2 0.10.8", - "tendermint", - "tendermint-light-client-verifier", - "tokio", - "tracing", -] - [[package]] name = "penumbra-dex" version = "0.64.1" @@ -5220,6 +5237,7 @@ dependencies = [ "penumbra-sct", "penumbra-shielded-pool", "penumbra-tct", + "penumbra-txhash", "poseidon377", "proptest", "prost", @@ -5321,13 +5339,14 @@ dependencies = [ "decaf377 0.5.0", "decaf377-rdsa", "futures", + "ibc-types", "im", "metrics", "once_cell", "pbjson-types", "penumbra-asset", "penumbra-chain", - "penumbra-dao", + "penumbra-community-pool", "penumbra-distributions", "penumbra-fee", "penumbra-ibc", @@ -5339,6 +5358,7 @@ dependencies = [ "penumbra-shielded-pool", "penumbra-stake", "penumbra-tct", + "penumbra-txhash", "proptest", "proptest-derive", "rand 0.8.5", @@ -5376,6 +5396,7 @@ dependencies = [ "penumbra-keys", "penumbra-num", "penumbra-proto", + "penumbra-txhash", "prost", "serde", "serde_json", @@ -5554,7 +5575,7 @@ dependencies = [ "blake2b_simd 0.5.11", "criterion 0.4.0", "decaf377 0.5.0", - "penumbra-dao", + "penumbra-community-pool", "penumbra-dex", "penumbra-governance", "penumbra-proof-params", @@ -5665,6 +5686,7 @@ dependencies = [ "penumbra-proto", "penumbra-sct", "penumbra-tct", + "penumbra-txhash", "poseidon377", "proptest", "prost", @@ -5706,7 +5728,7 @@ dependencies = [ "once_cell", "penumbra-asset", "penumbra-chain", - "penumbra-dao", + "penumbra-community-pool", "penumbra-distributions", "penumbra-keys", "penumbra-num", @@ -5715,6 +5737,7 @@ dependencies = [ "penumbra-sct", "penumbra-shielded-pool", "penumbra-tct", + "penumbra-txhash", "proptest", "rand_chacha 0.3.1", "rand_core 0.6.4", @@ -5883,7 +5906,7 @@ dependencies = [ "pbjson-types", "penumbra-asset", "penumbra-chain", - "penumbra-dao", + "penumbra-community-pool", "penumbra-dex", "penumbra-fee", "penumbra-governance", @@ -5896,6 +5919,7 @@ dependencies = [ "penumbra-shielded-pool", "penumbra-stake", "penumbra-tct", + "penumbra-txhash", "poseidon377", "proptest", "proptest-derive", @@ -5911,6 +5935,18 @@ dependencies = [ "wasm-bindgen-test", ] +[[package]] +name = "penumbra-txhash" +version = "0.64.1" +dependencies = [ + "anyhow", + "blake2b_simd 0.5.11", + "hex", + "penumbra-proto", + "penumbra-tct", + "serde", +] + [[package]] name = "penumbra-view" version = "0.64.1" @@ -5935,8 +5971,8 @@ dependencies = [ "penumbra-app", "penumbra-asset", "penumbra-chain", + "penumbra-community-pool", "penumbra-compact-block", - "penumbra-dao", "penumbra-dex", "penumbra-distributions", "penumbra-fee", @@ -7618,6 +7654,12 @@ dependencies = [ "rand_core 0.6.4", ] +[[package]] +name = "simple-base64" +version = "0.23.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6385ef05b7bbfddaa8bf6306d059adac087990d659576c73b7da802d9a6ce91f" + [[package]] name = "sized-chunks" version = "0.6.5" @@ -9281,9 +9323,9 @@ checksum = "dff9641d1cd4be8d1a070daf9e3773c5f67e78b4d9d42263020c057706765c04" [[package]] name = "winnow" -version = "0.5.26" +version = "0.5.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b67b5f0a4e7a27a64c651977932b9dc5667ca7fc31ac44b03ed37a0cf42fdfff" +checksum = "6c830786f7720c2fd27a1a0e27a709dbd3c4d009b56d098fc742d4f4eab91fe2" dependencies = [ "memchr", ] diff --git a/Cargo.toml b/Cargo.toml index 3311dc4b5f..2c316d8b5f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -20,11 +20,12 @@ members = [ "crates/core/num", "crates/core/keys", "crates/core/asset", + "crates/core/txhash", "crates/core/component/chain", "crates/core/component/shielded-pool", "crates/core/component/governance", "crates/core/component/ibc", - "crates/core/component/dao", + "crates/core/component/community-pool", "crates/core/component/dex", "crates/core/component/sct", "crates/core/component/fee", diff --git a/crates/bench/Cargo.toml b/crates/bench/Cargo.toml index 52d113d12a..2e4680085b 100644 --- a/crates/bench/Cargo.toml +++ b/crates/bench/Cargo.toml @@ -16,8 +16,8 @@ decaf377 = { version = "0.5", features = ["r1cs"] } # Crates.io deps ark-ec = "0.4.2" -ark-ff = {version = "0.4", default-features = false} -ark-std = {version = "0.4", default-features = false} +ark-ff = { version = "0.4", default-features = false } +ark-std = { version = "0.4", default-features = false } ark-serialize = "0.4" serde = { version = "1", features = ["derive"] } once_cell = "1.8" @@ -26,9 +26,9 @@ rand = "0.8" # only needed because ark-ff doesn't display correctly num-bigint = "0.4" tracing = "0.1" -ark-groth16 = {version = "0.4", default-features = false} +ark-groth16 = { version = "0.4", default-features = false } ark-snark = "0.4" -ark-r1cs-std = {version = "0.4", default-features = false} +ark-r1cs-std = { version = "0.4", default-features = false } ark-relations = "0.4" sha2 = "0.10.1" bech32 = "0.8.1" @@ -37,7 +37,7 @@ bech32 = "0.8.1" penumbra-tct = { path = "../crypto/tct/", features = ["r1cs"] } criterion = { version = "0.4", features = ["html_reports"] } penumbra-dex = { path = "../core/component/dex/" } -penumbra-dao = { path = "../core/component/dao/" } +penumbra-community-pool = { path = "../core/component/community-pool/" } penumbra-stake = { path = "../core/component/stake/" } penumbra-shielded-pool = { path = "../core/component/shielded-pool/" } penumbra-governance = { path = "../core/component/governance/" } @@ -52,16 +52,25 @@ penumbra-proof-params = { path = "../crypto/proof-params", features = [ ] } [build-dependencies] -regex = {version = "1", optional=true } -reqwest = {version ="0.11.14", optional=true, features = ["blocking", "json"] } -serde_json = {version = "1", optional = true} -sha2 = {version = "0.10.6", optional=true} -hex = {version = "0.4.3", optional=true} +regex = { version = "1", optional = true } +reqwest = { version = "0.11.14", optional = true, features = [ + "blocking", + "json", +] } +serde_json = { version = "1", optional = true } +sha2 = { version = "0.10.6", optional = true } +hex = { version = "0.4.3", optional = true } anyhow = "1" [features] download-proving-keys = ["regex", "reqwest", "serde_json", "sha2", "hex"] -parallel = ["ark-ff/parallel", "decaf377/parallel", "ark-groth16/parallel", "ark-std/parallel", "ark-r1cs-std/parallel"] +parallel = [ + "ark-ff/parallel", + "decaf377/parallel", + "ark-groth16/parallel", + "ark-std/parallel", + "ark-r1cs-std/parallel", +] [[bench]] name = "nullifier_derivation" @@ -88,5 +97,5 @@ name = "swap_claim" harness = false [[bench]] -name = "undelegate_claim" +name = "convert" harness = false diff --git a/crates/bench/benches/convert.rs b/crates/bench/benches/convert.rs new file mode 100644 index 0000000000..0f8d3cf704 --- /dev/null +++ b/crates/bench/benches/convert.rs @@ -0,0 +1,75 @@ +use ark_ff::UniformRand; +use ark_relations::r1cs::{ + ConstraintSynthesizer, ConstraintSystem, OptimizationGoal, SynthesisMode, +}; +use decaf377::{Fq, Fr}; +use penumbra_asset::{Balance, Value, STAKING_TOKEN_ASSET_ID}; +use penumbra_num::{fixpoint::U128x128, Amount}; +use penumbra_proof_params::{DummyWitness, CONVERT_PROOF_PROVING_KEY}; +use penumbra_shielded_pool::{ + ConvertCircuit, ConvertProof, ConvertProofPrivate, ConvertProofPublic, +}; + +use criterion::{criterion_group, criterion_main, Criterion}; +use rand_core::OsRng; + +fn prove(r: Fq, s: Fq, public: ConvertProofPublic, private: ConvertProofPrivate) { + let _proof = ConvertProof::prove(r, s, &CONVERT_PROOF_PROVING_KEY, public, private) + .expect("can generate proof"); +} + +fn dummy_instance() -> (ConvertProofPublic, ConvertProofPrivate) { + let amount = Amount::from(1u64); + let balance_blinding = Fr::from(1); + let from = *STAKING_TOKEN_ASSET_ID; + let to = *STAKING_TOKEN_ASSET_ID; + let rate = U128x128::from(1u64); + let balance = Balance::from(Value { + asset_id: to, + amount, + }) - Balance::from(Value { + asset_id: from, + amount, + }); + let balance_commitment = balance.commit(balance_blinding); + ( + ConvertProofPublic { + from, + to, + rate, + balance_commitment, + }, + ConvertProofPrivate { + amount, + balance_blinding, + }, + ) +} + +fn convert_proving_time(c: &mut Criterion) { + let (public, private) = dummy_instance(); + + let r = Fq::rand(&mut OsRng); + let s = Fq::rand(&mut OsRng); + + c.bench_function("convert proving", |b| { + b.iter(|| prove(r, s, public.clone(), private.clone())) + }); + + // Also print out the number of constraints. + let circuit = ConvertCircuit::with_dummy_witness(); + + let cs = ConstraintSystem::new_ref(); + cs.set_optimization_goal(OptimizationGoal::Constraints); + cs.set_mode(SynthesisMode::Setup); + + circuit + .generate_constraints(cs.clone()) + .expect("can generate constraints"); + cs.finalize(); + let num_constraints = cs.num_constraints(); + println!("Number of constraints: {}", num_constraints); +} + +criterion_group!(benches, convert_proving_time); +criterion_main!(benches); diff --git a/crates/bench/benches/delegator_vote.rs b/crates/bench/benches/delegator_vote.rs index b15b7ac0d7..7517a5128c 100644 --- a/crates/bench/benches/delegator_vote.rs +++ b/crates/bench/benches/delegator_vote.rs @@ -6,10 +6,12 @@ use ark_relations::r1cs::{ }; use decaf377::{Fq, Fr}; use decaf377_rdsa::{SpendAuth, VerificationKey}; -use penumbra_asset::{balance, Value}; -use penumbra_governance::{DelegatorVoteCircuit, DelegatorVoteProof}; -use penumbra_keys::keys::{Bip44Path, NullifierKey, SeedPhrase, SpendKey}; -use penumbra_proof_params::DELEGATOR_VOTE_PROOF_PROVING_KEY; +use penumbra_asset::Value; +use penumbra_governance::{ + DelegatorVoteCircuit, DelegatorVoteProof, DelegatorVoteProofPrivate, DelegatorVoteProofPublic, +}; +use penumbra_keys::keys::{Bip44Path, SeedPhrase, SpendKey}; +use penumbra_proof_params::{DummyWitness, DELEGATOR_VOTE_PROOF_PROVING_KEY}; use penumbra_sct::Nullifier; use penumbra_shielded_pool::Note; use penumbra_tct as tct; @@ -18,36 +20,10 @@ use criterion::{criterion_group, criterion_main, Criterion}; use rand_core::OsRng; #[allow(clippy::too_many_arguments)] -fn prove( - r: Fq, - s: Fq, - state_commitment_proof: tct::Proof, - note: Note, - spend_auth_randomizer: Fr, - ak: VerificationKey, - nk: NullifierKey, - anchor: tct::Root, - balance_commitment: balance::Commitment, - nullifier: Nullifier, - rk: VerificationKey, - start_position: tct::Position, -) { - let _proof = DelegatorVoteProof::prove( - r, - s, - &DELEGATOR_VOTE_PROOF_PROVING_KEY, - state_commitment_proof, - note, - spend_auth_randomizer, - ak, - nk, - anchor, - balance_commitment, - nullifier, - rk, - start_position, - ) - .expect("can create proof"); +fn prove(r: Fq, s: Fq, public: DelegatorVoteProofPublic, private: DelegatorVoteProofPrivate) { + let _proof = + DelegatorVoteProof::prove(r, s, &DELEGATOR_VOTE_PROOF_PROVING_KEY, public, private) + .expect("can create proof"); } fn delegator_vote_proving_time(c: &mut Criterion) { @@ -73,7 +49,7 @@ fn delegator_vote_proving_time(c: &mut Criterion) { let v_blinding = Fr::from(0i32); let balance_commitment = value_to_send.commit(v_blinding); let rk: VerificationKey = rsk.into(); - let nf = Nullifier::derive(&nk, state_commitment_proof.position(), ¬e_commitment); + let nullifier = Nullifier::derive(&nk, state_commitment_proof.position(), ¬e_commitment); sct.end_epoch().unwrap(); let first_note_commitment = Note::generate(&mut OsRng, &sender, value_to_send).commit(); @@ -83,40 +59,28 @@ fn delegator_vote_proving_time(c: &mut Criterion) { let r = Fq::rand(&mut OsRng); let s = Fq::rand(&mut OsRng); - - c.bench_function("delegator proving", |b| { - b.iter(|| { - prove( - r, - s, - state_commitment_proof.clone(), - note.clone(), - spend_auth_randomizer, - ak, - nk, - anchor, - balance_commitment, - nf, - rk, - start_position, - ) - }) - }); - - // Also print out the number of constraints. - let circuit = DelegatorVoteCircuit::new( + let public = DelegatorVoteProofPublic { + anchor, + balance_commitment, + nullifier, + rk, + start_position, + }; + let private = DelegatorVoteProofPrivate { state_commitment_proof, note, v_blinding, spend_auth_randomizer, ak, nk, - anchor, - balance_commitment, - nf, - rk, - start_position, - ); + }; + + c.bench_function("delegator proving", |b| { + b.iter(|| prove(r, s, public.clone(), private.clone())) + }); + + // Also print out the number of constraints. + let circuit = DelegatorVoteCircuit::with_dummy_witness(); let cs = ConstraintSystem::new_ref(); cs.set_optimization_goal(OptimizationGoal::Constraints); diff --git a/crates/bench/benches/nullifier_derivation.rs b/crates/bench/benches/nullifier_derivation.rs index 713961125b..52ece2ac7a 100644 --- a/crates/bench/benches/nullifier_derivation.rs +++ b/crates/bench/benches/nullifier_derivation.rs @@ -5,24 +5,24 @@ use ark_relations::r1cs::{ }; use decaf377::Fq; use penumbra_asset::Value; -use penumbra_keys::keys::{Bip44Path, NullifierKey, SeedPhrase, SpendKey}; -use penumbra_proof_params::NULLIFIER_DERIVATION_PROOF_PROVING_KEY; +use penumbra_keys::keys::{Bip44Path, SeedPhrase, SpendKey}; +use penumbra_proof_params::{DummyWitness, NULLIFIER_DERIVATION_PROOF_PROVING_KEY}; use penumbra_sct::Nullifier; -use penumbra_shielded_pool::{Note, Rseed}; +use penumbra_shielded_pool::{ + Note, NullifierDerivationProofPrivate, NullifierDerivationProofPublic, Rseed, +}; use penumbra_shielded_pool::{NullifierDerivationCircuit, NullifierDerivationProof}; use penumbra_tct as tct; use criterion::{criterion_group, criterion_main, Criterion}; use rand_core::OsRng; -fn prove(position: tct::Position, note: Note, nk: NullifierKey, nullifier: Nullifier) { +fn prove(public: NullifierDerivationProofPublic, private: NullifierDerivationProofPrivate) { let _proof = NullifierDerivationProof::prove( &mut OsRng, &NULLIFIER_DERIVATION_PROOF_PROVING_KEY, - position, - note, - nk, - nullifier, + public, + private, ) .expect("Can generate proof"); } @@ -47,14 +47,18 @@ fn nullifier_derivation_proving_time(c: &mut Criterion) { sct.insert(tct::Witness::Keep, note_commitment).unwrap(); let state_commitment_proof = sct.witness(note_commitment).unwrap(); let position = state_commitment_proof.position(); + let public = NullifierDerivationProofPublic { + position, + note_commitment, + nullifier, + }; + let private = NullifierDerivationProofPrivate { nk }; c.bench_function("nullifier derivation proving", |b| { - b.iter(|| prove(position, note.clone(), nk, nullifier)) + b.iter(|| prove(public.clone(), private.clone())) }); - // Also print out the number of constraints. - let circuit = NullifierDerivationCircuit::new(position, note.commit(), nk, nullifier); - + let circuit = NullifierDerivationCircuit::with_dummy_witness(); let cs = ConstraintSystem::new_ref(); cs.set_optimization_goal(OptimizationGoal::Constraints); cs.set_mode(SynthesisMode::Setup); diff --git a/crates/bench/benches/output.rs b/crates/bench/benches/output.rs index ea1d905c34..32ec3220b3 100644 --- a/crates/bench/benches/output.rs +++ b/crates/bench/benches/output.rs @@ -7,32 +7,20 @@ use ark_relations::r1cs::{ use decaf377::{Fq, Fr}; use decaf377_fmd as fmd; use decaf377_ka as ka; -use penumbra_asset::{balance, Balance, Value}; +use penumbra_asset::{Balance, Value}; use penumbra_keys::{keys::Diversifier, Address}; -use penumbra_proof_params::OUTPUT_PROOF_PROVING_KEY; -use penumbra_shielded_pool::{note, Note, OutputCircuit, OutputProof, Rseed}; +use penumbra_proof_params::{DummyWitness, OUTPUT_PROOF_PROVING_KEY}; +use penumbra_shielded_pool::{ + output::{OutputProofPrivate, OutputProofPublic}, + Note, OutputCircuit, OutputProof, Rseed, +}; use criterion::{criterion_group, criterion_main, Criterion}; use rand_core::OsRng; -fn prove( - r: Fq, - s: Fq, - note: Note, - v_blinding: Fr, - balance_commitment: balance::Commitment, - note_commitment: note::StateCommitment, -) { - let _proof = OutputProof::prove( - r, - s, - &OUTPUT_PROOF_PROVING_KEY, - note, - v_blinding, - balance_commitment, - note_commitment, - ) - .expect("can generate proof"); +fn prove(r: Fq, s: Fq, public: OutputProofPublic, private: OutputProofPrivate) { + let _proof = OutputProof::prove(r, s, &OUTPUT_PROOF_PROVING_KEY, public, private) + .expect("can generate proof"); } fn output_proving_time(c: &mut Criterion) { @@ -49,28 +37,28 @@ fn output_proving_time(c: &mut Criterion) { let value_to_send = Value::from_str("1upenumbra").expect("valid value"); let note = Note::from_parts(address, value_to_send, Rseed([1u8; 32])).expect("can make a note"); - let v_blinding = Fr::from(1); - let balance_commitment = (-Balance::from(value_to_send)).commit(v_blinding); + let balance_blinding = Fr::from(1); + let balance_commitment = (-Balance::from(value_to_send)).commit(balance_blinding); let note_commitment = note.commit(); + let public = OutputProofPublic { + balance_commitment, + note_commitment, + }; + let private = OutputProofPrivate { + note, + balance_blinding, + }; + let r = Fq::rand(&mut OsRng); let s = Fq::rand(&mut OsRng); c.bench_function("output proving", |b| { - b.iter(|| { - prove( - r, - s, - note.clone(), - v_blinding, - balance_commitment, - note_commitment, - ) - }) + b.iter(|| prove(r, s, public.clone(), private.clone())) }); // Also print out the number of constraints. - let circuit = OutputCircuit::new(note, v_blinding, balance_commitment); + let circuit = OutputCircuit::with_dummy_witness(); let cs = ConstraintSystem::new_ref(); cs.set_optimization_goal(OptimizationGoal::Constraints); diff --git a/crates/bench/benches/spend.rs b/crates/bench/benches/spend.rs index b6a9cbdd2b..474f1101ef 100644 --- a/crates/bench/benches/spend.rs +++ b/crates/bench/benches/spend.rs @@ -6,47 +6,20 @@ use ark_relations::r1cs::{ }; use decaf377::{Fq, Fr}; use decaf377_rdsa::{SpendAuth, VerificationKey}; -use penumbra_asset::{balance, Value}; -use penumbra_keys::keys::{Bip44Path, NullifierKey, SeedPhrase, SpendKey}; -use penumbra_proof_params::SPEND_PROOF_PROVING_KEY; +use penumbra_asset::Value; +use penumbra_keys::keys::{Bip44Path, SeedPhrase, SpendKey}; +use penumbra_proof_params::{DummyWitness, SPEND_PROOF_PROVING_KEY}; use penumbra_sct::Nullifier; -use penumbra_shielded_pool::{Note, SpendCircuit, SpendProof}; +use penumbra_shielded_pool::{Note, SpendCircuit, SpendProof, SpendProofPrivate, SpendProofPublic}; use penumbra_tct as tct; use criterion::{criterion_group, criterion_main, Criterion}; use rand_core::OsRng; #[allow(clippy::too_many_arguments)] -fn prove( - r: Fq, - s: Fq, - state_commitment_proof: tct::Proof, - note: Note, - v_blinding: Fr, - spend_auth_randomizer: Fr, - ak: VerificationKey, - nk: NullifierKey, - anchor: tct::Root, - balance_commitment: balance::Commitment, - nullifier: Nullifier, - rk: VerificationKey, -) { - let _proof = SpendProof::prove( - r, - s, - &SPEND_PROOF_PROVING_KEY, - state_commitment_proof, - note, - v_blinding, - spend_auth_randomizer, - ak, - nk, - anchor, - balance_commitment, - nullifier, - rk, - ) - .expect("can create proof"); +fn prove(r: Fq, s: Fq, public: SpendProofPublic, private: SpendProofPrivate) { + let _proof = SpendProof::prove(r, s, &SPEND_PROOF_PROVING_KEY, public, private) + .expect("can create proof"); } fn spend_proving_time(c: &mut Criterion) { @@ -76,39 +49,27 @@ fn spend_proving_time(c: &mut Criterion) { let r = Fq::rand(&mut OsRng); let s = Fq::rand(&mut OsRng); - - c.bench_function("spend proving", |b| { - b.iter(|| { - prove( - r, - s, - state_commitment_proof.clone(), - note.clone(), - v_blinding, - spend_auth_randomizer, - ak, - nk, - anchor, - balance_commitment, - nf, - rk, - ) - }) - }); - - // Also print out the number of constraints. - let circuit = SpendCircuit::new( + let public = SpendProofPublic { + anchor, + balance_commitment, + nullifier: nf, + rk, + }; + let private = SpendProofPrivate { state_commitment_proof, note, v_blinding, spend_auth_randomizer, ak, nk, - anchor, - balance_commitment, - nf, - rk, - ); + }; + + c.bench_function("spend proving", |b| { + b.iter(|| prove(r, s, public.clone(), private.clone())) + }); + + // Also print out the number of constraints. + let circuit = SpendCircuit::with_dummy_witness(); let cs = ConstraintSystem::new_ref(); cs.set_optimization_goal(OptimizationGoal::Constraints); diff --git a/crates/bench/benches/swap.rs b/crates/bench/benches/swap.rs index 564f40232e..fcc290ec5a 100644 --- a/crates/bench/benches/swap.rs +++ b/crates/bench/benches/swap.rs @@ -3,41 +3,23 @@ use ark_relations::r1cs::{ ConstraintSynthesizer, ConstraintSystem, OptimizationGoal, SynthesisMode, }; use decaf377::{Fq, Fr}; -use penumbra_asset::{asset, balance, Balance, Value}; +use penumbra_asset::{asset, Balance, Value}; use penumbra_dex::{ - swap::proof::{SwapCircuit, SwapProof}, - swap::SwapPlaintext, + swap::proof::{SwapCircuit, SwapProof, SwapProofPublic}, + swap::{proof::SwapProofPrivate, SwapPlaintext}, TradingPair, }; use penumbra_fee::Fee; use penumbra_keys::keys::{Bip44Path, SeedPhrase, SpendKey}; use penumbra_num::Amount; -use penumbra_proof_params::SWAP_PROOF_PROVING_KEY; -use penumbra_tct as tct; +use penumbra_proof_params::{DummyWitness, SWAP_PROOF_PROVING_KEY}; use criterion::{criterion_group, criterion_main, Criterion}; use rand_core::OsRng; -fn prove( - r: Fq, - s: Fq, - swap_plaintext: SwapPlaintext, - fee_blinding: Fr, - balance_commitment: balance::Commitment, - swap_commitment: tct::StateCommitment, - fee_commitment: balance::Commitment, -) { - let _proof = SwapProof::prove( - r, - s, - &SWAP_PROOF_PROVING_KEY, - swap_plaintext, - fee_blinding, - balance_commitment, - swap_commitment, - fee_commitment, - ) - .expect("can generate proof"); +fn prove(r: Fq, s: Fq, public: SwapProofPublic, private: SwapProofPrivate) { + let _proof = SwapProof::prove(r, s, &SWAP_PROOF_PROVING_KEY, public, private) + .expect("can generate proof"); } fn swap_proving_time(c: &mut Criterion) { @@ -63,7 +45,8 @@ fn swap_proving_time(c: &mut Criterion) { fee, claim_address, ); - let fee_commitment = swap_plaintext.claim_fee.commit(Fr::from(0u64)); + let fee_blinding = Fr::from(0u64); + let fee_commitment = swap_plaintext.claim_fee.commit(fee_blinding); let swap_commitment = swap_plaintext.swap_commitment(); let value_1 = Value { @@ -84,31 +67,25 @@ fn swap_proving_time(c: &mut Criterion) { balance -= value_fee; let balance_commitment = balance.commit(Fr::from(0u64)); + let public = SwapProofPublic { + balance_commitment, + swap_commitment, + fee_commitment, + }; + let private = SwapProofPrivate { + fee_blinding, + swap_plaintext, + }; + let r = Fq::rand(&mut OsRng); let s = Fq::rand(&mut OsRng); c.bench_function("swap proving", |b| { - b.iter(|| { - prove( - r, - s, - swap_plaintext.clone(), - Fr::from(0u64), - balance_commitment, - swap_commitment, - fee_commitment, - ) - }) + b.iter(|| prove(r, s, public.clone(), private.clone())) }); // Also print out the number of constraints. - let circuit = SwapCircuit::new( - swap_plaintext, - Fr::from(0u64), - balance_commitment, - swap_commitment, - fee_commitment, - ); + let circuit = SwapCircuit::with_dummy_witness(); let cs = ConstraintSystem::new_ref(); cs.set_optimization_goal(OptimizationGoal::Constraints); diff --git a/crates/bench/benches/swap_claim.rs b/crates/bench/benches/swap_claim.rs index fc382736da..e6b5c6fcfb 100644 --- a/crates/bench/benches/swap_claim.rs +++ b/crates/bench/benches/swap_claim.rs @@ -6,13 +6,13 @@ use decaf377::Fq; use penumbra_asset::asset; use penumbra_dex::{ swap::SwapPlaintext, - swap_claim::{SwapClaimCircuit, SwapClaimProof}, + swap_claim::{SwapClaimCircuit, SwapClaimProof, SwapClaimProofPrivate, SwapClaimProofPublic}, BatchSwapOutputData, TradingPair, }; use penumbra_fee::Fee; -use penumbra_keys::keys::{Bip44Path, NullifierKey, SeedPhrase, SpendKey}; +use penumbra_keys::keys::{Bip44Path, SeedPhrase, SpendKey}; use penumbra_num::Amount; -use penumbra_proof_params::SWAPCLAIM_PROOF_PROVING_KEY; +use penumbra_proof_params::{DummyWitness, SWAPCLAIM_PROOF_PROVING_KEY}; use penumbra_sct::Nullifier; use penumbra_tct as tct; @@ -20,40 +20,9 @@ use criterion::{criterion_group, criterion_main, Criterion}; use rand_core::OsRng; #[allow(clippy::too_many_arguments)] -fn prove( - r: Fq, - s: Fq, - swap_plaintext: SwapPlaintext, - state_commitment_proof: tct::Proof, - nk: NullifierKey, - anchor: tct::Root, - nullifier: Nullifier, - lambda_1: Amount, - lambda_2: Amount, - note_blinding_1: Fq, - note_blinding_2: Fq, - note_commitment_1: tct::StateCommitment, - note_commitment_2: tct::StateCommitment, - output_data: BatchSwapOutputData, -) { - let _proof = SwapClaimProof::prove( - r, - s, - &SWAPCLAIM_PROOF_PROVING_KEY, - swap_plaintext, - state_commitment_proof, - nk, - anchor, - nullifier, - lambda_1, - lambda_2, - note_blinding_1, - note_blinding_2, - note_commitment_1, - note_commitment_2, - output_data, - ) - .expect("can create proof"); +fn prove(r: Fq, s: Fq, public: SwapClaimProofPublic, private: SwapClaimProofPrivate) { + let _proof = SwapClaimProof::prove(r, s, &SWAPCLAIM_PROOF_PROVING_KEY, public, private) + .expect("can create proof"); } fn swap_claim_proving_time(c: &mut Criterion) { @@ -80,7 +49,7 @@ fn swap_claim_proving_time(c: &mut Criterion) { fee, claim_address, ); - let fee = swap_plaintext.clone().claim_fee; + let claim_fee = swap_plaintext.clone().claim_fee; let mut sct = tct::Tree::new(); let swap_commitment = swap_plaintext.swap_commitment(); sct.insert(tct::Witness::Keep, swap_commitment).unwrap(); @@ -111,32 +80,15 @@ fn swap_claim_proving_time(c: &mut Criterion) { let note_commitment_1 = output_1_note.commit(); let note_commitment_2 = output_2_note.commit(); - let r = Fq::rand(&mut OsRng); - let s = Fq::rand(&mut OsRng); - - c.bench_function("swap claim proving", |b| { - b.iter(|| { - prove( - r, - s, - swap_plaintext.clone(), - state_commitment_proof.clone(), - nk, - anchor, - nullifier, - lambda_1, - lambda_2, - note_blinding_1, - note_blinding_2, - note_commitment_1, - note_commitment_2, - output_data, - ) - }) - }); - - // Also print out the number of constraints. - let circuit = SwapClaimCircuit::new( + let public = SwapClaimProofPublic { + anchor, + nullifier, + claim_fee, + output_data, + note_commitment_1, + note_commitment_2, + }; + let private = SwapClaimProofPrivate { swap_plaintext, state_commitment_proof, nk, @@ -144,13 +96,17 @@ fn swap_claim_proving_time(c: &mut Criterion) { lambda_2, note_blinding_1, note_blinding_2, - anchor, - nullifier, - fee, - output_data, - note_commitment_1, - note_commitment_2, - ); + }; + + let r = Fq::rand(&mut OsRng); + let s = Fq::rand(&mut OsRng); + + c.bench_function("swap claim proving", |b| { + b.iter(|| prove(r, s, public.clone(), private.clone())) + }); + + // Also print out the number of constraints. + let circuit = SwapClaimCircuit::with_dummy_witness(); let cs = ConstraintSystem::new_ref(); cs.set_optimization_goal(OptimizationGoal::Constraints); diff --git a/crates/bench/benches/undelegate_claim.rs b/crates/bench/benches/undelegate_claim.rs deleted file mode 100644 index 768ced68a1..0000000000 --- a/crates/bench/benches/undelegate_claim.rs +++ /dev/null @@ -1,91 +0,0 @@ -use ark_ff::UniformRand; -use ark_relations::r1cs::{ - ConstraintSynthesizer, ConstraintSystem, OptimizationGoal, SynthesisMode, -}; -use decaf377::{Fq, Fr}; -use decaf377_rdsa as rdsa; -use penumbra_asset::{asset, balance}; -use penumbra_num::Amount; -use penumbra_proof_params::UNDELEGATECLAIM_PROOF_PROVING_KEY; -use penumbra_stake::{ - IdentityKey, Penalty, UnbondingToken, UndelegateClaimCircuit, UndelegateClaimProof, -}; - -use criterion::{criterion_group, criterion_main, Criterion}; -use rand_core::OsRng; - -fn prove( - r: Fq, - s: Fq, - unbonding_amount: Amount, - balance_blinding: Fr, - balance_commitment: balance::Commitment, - unbonding_id: asset::Id, - penalty: Penalty, -) { - let _proof = UndelegateClaimProof::prove( - r, - s, - &UNDELEGATECLAIM_PROOF_PROVING_KEY, - unbonding_amount, - balance_blinding, - balance_commitment, - unbonding_id, - penalty, - ) - .expect("can generate proof"); -} - -fn undelegate_claim_proving_time(c: &mut Criterion) { - let sk = rdsa::SigningKey::new_from_field(Fr::from(1u32)); - let validator_identity = IdentityKey((&sk).into()); - let unbonding_amount = Amount::from(1u32); - - let balance_blinding = Fr::from(0u32); - let start_epoch_index = 1; - let unbonding_token = UnbondingToken::new(validator_identity, start_epoch_index); - let unbonding_id = unbonding_token.id(); - let penalty = Penalty::from_bps_squared(1u64); - let balance = penalty.balance_for_claim(unbonding_id, unbonding_amount); - let balance_commitment = balance.commit(balance_blinding); - - let r = Fq::rand(&mut OsRng); - let s = Fq::rand(&mut OsRng); - - c.bench_function("undelegate claim proving", |b| { - b.iter(|| { - prove( - r, - s, - unbonding_amount, - balance_blinding, - balance_commitment, - unbonding_id, - penalty, - ) - }) - }); - - // Also print out the number of constraints. - let circuit = UndelegateClaimCircuit::new( - unbonding_amount, - balance_blinding, - balance_commitment, - unbonding_id, - penalty, - ); - - let cs = ConstraintSystem::new_ref(); - cs.set_optimization_goal(OptimizationGoal::Constraints); - cs.set_mode(SynthesisMode::Setup); - - circuit - .generate_constraints(cs.clone()) - .expect("can generate constraints"); - cs.finalize(); - let num_constraints = cs.num_constraints(); - println!("Number of constraints: {}", num_constraints); -} - -criterion_group!(benches, undelegate_claim_proving_time); -criterion_main!(benches); diff --git a/crates/bin/pcli/Cargo.toml b/crates/bin/pcli/Cargo.toml index 0f98adfde2..4db18b797c 100644 --- a/crates/bin/pcli/Cargo.toml +++ b/crates/bin/pcli/Cargo.toml @@ -16,31 +16,41 @@ default = ["std", "parallel", "download-proving-keys"] download-proving-keys = ["penumbra-proof-params/download-proving-keys"] sct-divergence-check = ["penumbra-view/sct-divergence-check"] std = ["ark-ff/std", "ibc-types/std"] -parallel = ["penumbra-proof-params/parallel", "decaf377/parallel", "penumbra-shielded-pool/parallel", "penumbra-dex/parallel", "penumbra-governance/parallel", "penumbra-stake/parallel", "penumbra-transaction/parallel", "penumbra-wallet/parallel", "penumbra-proof-setup/parallel"] +parallel = [ + "penumbra-proof-params/parallel", + "decaf377/parallel", + "penumbra-shielded-pool/parallel", + "penumbra-dex/parallel", + "penumbra-governance/parallel", + "penumbra-stake/parallel", + "penumbra-transaction/parallel", + "penumbra-wallet/parallel", + "penumbra-proof-setup/parallel", +] [dependencies] # Workspace dependencies -penumbra-proto = { path = "../../proto", features = ["rpc"] } -penumbra-tct = { path = "../../crypto/tct" } -penumbra-num = { path = "../../core/num", default-features=false } -penumbra-asset = { path = "../../core/asset", default-features=false } -penumbra-keys = { path = "../../core/keys", default-features=false } -penumbra-chain = { path = "../../core/component/chain", default-features = false } +penumbra-proto = { path = "../../proto", features = ["rpc"] } +penumbra-tct = { path = "../../crypto/tct" } +penumbra-num = { path = "../../core/num", default-features = false } +penumbra-asset = { path = "../../core/asset", default-features = false } +penumbra-keys = { path = "../../core/keys", default-features = false } +penumbra-chain = { path = "../../core/component/chain", default-features = false } penumbra-shielded-pool = { path = "../../core/component/shielded-pool", default-features = false } -penumbra-governance = { path = "../../core/component/governance", default-features = false } -penumbra-stake = { path = "../../core/component/stake", default-features = false } -penumbra-sct = { path = "../../core/component/sct", default-features = false } -penumbra-fee = { path = "../../core/component/fee", default-features = false } -penumbra-dex = { path = "../../core/component/dex", default-features = false } -penumbra-dao = { path = "../../core/component/dao", default-features = false } -penumbra-ibc = { path = "../../core/component/ibc", default-features = false } +penumbra-governance = { path = "../../core/component/governance", default-features = false } +penumbra-stake = { path = "../../core/component/stake", default-features = false } +penumbra-sct = { path = "../../core/component/sct", default-features = false } +penumbra-fee = { path = "../../core/component/fee", default-features = false } +penumbra-dex = { path = "../../core/component/dex", default-features = false } +penumbra-community-pool = { path = "../../core/component/community-pool", default-features = false } +penumbra-ibc = { path = "../../core/component/ibc", default-features = false } penumbra-compact-block = { path = "../../core/component/compact-block", default-features = false } -penumbra-transaction = { path = "../../core/transaction", features = ["clap"] } -penumbra-proof-setup = { path = "../../crypto/proof-setup" } -penumbra-app = { path = "../../core/app" } -penumbra-wallet = { path = "../../wallet" } -penumbra-custody = { path = "../../custody" } -penumbra-view = { path = "../../view" } +penumbra-transaction = { path = "../../core/transaction", features = ["clap"] } +penumbra-proof-setup = { path = "../../crypto/proof-setup" } +penumbra-app = { path = "../../core/app" } +penumbra-wallet = { path = "../../wallet" } +penumbra-custody = { path = "../../custody" } +penumbra-view = { path = "../../view" } # Penumbra dependencies decaf377 = { version = "0.5" } @@ -49,9 +59,9 @@ tendermint = { version = "0.34.0", features = ["rust-crypto"] } jmt = "0.9" # External dependencies -ibc-types = { version = "0.10.0", features = ["std", "with_serde"] } +ibc-types = { version = "0.11.0", features = ["std", "with_serde"] } -ibc-proto = { version = "0.39.0" } +ibc-proto = { version = "0.40.0" } ark-ff = { version = "0.4", default-features = false } atty = "0.2" ed25519-consensus = "2" @@ -60,6 +70,7 @@ async-stream = "0.2" bincode = "1.3.3" blake2b_simd = "0.5" base64 = "0.21" +simple-base64 = "0.23" bytes = "1" comfy-table = "5" directories = "4.0.1" @@ -100,7 +111,7 @@ assert_cmd = "2.0" predicates = "2.1" tempfile = "3.3.0" regex = "1.6.0" -penumbra-governance = { path = "../../core/component/governance", default-features = false } +penumbra-governance = { path = "../../core/component/governance", default-features = false } penumbra-proof-params = { path = "../../crypto/proof-params", features = [ "bundled-proving-keys", "download-proving-keys", diff --git a/crates/bin/pcli/src/command.rs b/crates/bin/pcli/src/command.rs index f6d5611268..7759cc3c79 100644 --- a/crates/bin/pcli/src/command.rs +++ b/crates/bin/pcli/src/command.rs @@ -1,24 +1,23 @@ -mod ceremony; -mod debug; -mod init; -mod query; -mod threshold; -mod tx; -mod utils; -mod validator; -mod view; - pub use debug::DebugCmd; pub use init::InitCmd; pub use query::QueryCmd; pub use threshold::ThresholdCmd; pub use tx::TxCmd; pub use validator::ValidatorCmd; -pub use view::transaction_hashes::TransactionHashesCmd; pub use view::ViewCmd; use self::ceremony::CeremonyCmd; +mod ceremony; +mod debug; +mod init; +mod query; +mod threshold; +mod tx; +mod utils; +mod validator; +mod view; + // Note on display_order: // // The value is between 0 and 999 (the default). Sorting of subcommands is done diff --git a/crates/bin/pcli/src/command/ceremony.rs b/crates/bin/pcli/src/command/ceremony.rs index 6e808653f2..b6fff90bdf 100644 --- a/crates/bin/pcli/src/command/ceremony.rs +++ b/crates/bin/pcli/src/command/ceremony.rs @@ -1,5 +1,9 @@ -use crate::App; use anyhow::{anyhow, Context, Result}; +use rand_core::OsRng; +use tokio::sync::mpsc; +use tokio_stream::wrappers::ReceiverStream; +use url::Url; + use penumbra_asset::Value; use penumbra_keys::{keys::AddressIndex, Address}; use penumbra_num::Amount; @@ -19,10 +23,8 @@ use penumbra_proto::{ }; use penumbra_transaction::memo::MemoPlaintext; use penumbra_view::Planner; -use rand_core::OsRng; -use tokio::sync::mpsc; -use tokio_stream::wrappers::ReceiverStream; -use url::Url; + +use crate::App; fn max_message_size(phase: u8) -> usize { match phase { @@ -52,10 +54,10 @@ async fn handle_bid(app: &mut App, to: Address, from: AddressIndex, bid: &str) - return Ok(()); } - let memo_plaintext = MemoPlaintext { - return_address: app.config.full_viewing_key.payment_address(from).0, - text: "E PLURIBUS UNUM".to_owned(), - }; + let memo_plaintext = MemoPlaintext::new( + app.config.full_viewing_key.payment_address(from).0, + "E PLURIBUS UNUM".into(), + )?; let mut planner = Planner::new(OsRng); planner.set_gas_prices(gas_prices); @@ -66,7 +68,6 @@ async fn handle_bid(app: &mut App, to: Address, from: AddressIndex, bid: &str) - app.view .as_mut() .context("view service must be initialized")?, - app.config.full_viewing_key.wallet_id(), from, ) .await diff --git a/crates/bin/pcli/src/command/query.rs b/crates/bin/pcli/src/command/query.rs index 110bc792f0..49c6a6e835 100644 --- a/crates/bin/pcli/src/command/query.rs +++ b/crates/bin/pcli/src/command/query.rs @@ -1,4 +1,4 @@ -use anyhow::{Context, Result}; +use anyhow::{anyhow, Context, Result}; mod shielded_pool; use shielded_pool::ShieldedPool; @@ -10,8 +10,8 @@ mod dex; use dex::DexCmd; mod governance; use governance::GovernanceCmd; -mod dao; -use dao::DaoCmd; +mod community_pool; +use community_pool::CommunityPoolCmd; mod validator; pub(super) use validator::ValidatorCmd; mod ibc_query; @@ -52,19 +52,40 @@ pub enum QueryCmd { /// Queries information about governance proposals. #[clap(subcommand)] Governance(GovernanceCmd), - /// Queries information about the DAO. + /// Queries information about the Community Pool. #[clap(subcommand)] - Dao(DaoCmd), + CommunityPool(CommunityPoolCmd), /// Queries information about the decentralized exchange. #[clap(subcommand)] Dex(DexCmd), /// Queries information about IBC. #[clap(subcommand)] Ibc(IbcCmd), + /// Subscribes to a filtered stream of state changes. + Watch { + /// The regex to filter keys in verifiable storage. + /// + /// The empty string matches all keys; the pattern $^ matches no keys. + #[clap(long, default_value = "")] + key_regex: String, + /// The regex to filter keys in nonverifiable storage. + /// + /// The empty string matches all keys; the pattern $^ matches no keys. + #[clap(long, default_value = "")] + nv_key_regex: String, + }, } impl QueryCmd { pub async fn exec(&self, app: &mut App) -> Result<()> { + if let QueryCmd::Watch { + key_regex, + nv_key_regex, + } = self + { + return watch(key_regex.clone(), nv_key_regex.clone(), app).await; + } + // Special-case: this is a Tendermint query if let QueryCmd::Tx(tx) = self { return tx.exec(app).await; @@ -86,8 +107,8 @@ impl QueryCmd { return governance.exec(app).await; } - if let QueryCmd::Dao(dao) = self { - return dao.exec(app).await; + if let QueryCmd::CommunityPool(cp) = self { + return cp.exec(app).await; } if let QueryCmd::Ibc(ibc) = self { @@ -100,7 +121,8 @@ impl QueryCmd { | QueryCmd::Validator(_) | QueryCmd::Dex(_) | QueryCmd::Governance(_) - | QueryCmd::Dao(_) + | QueryCmd::CommunityPool(_) + | QueryCmd::Watch { .. } | QueryCmd::Ibc(_) => { unreachable!("query handled in guard"); } @@ -131,13 +153,14 @@ impl QueryCmd { pub fn offline(&self) -> bool { match self { - QueryCmd::Dex { .. } | QueryCmd::Dao { .. } => false, + QueryCmd::Dex { .. } | QueryCmd::CommunityPool { .. } => false, QueryCmd::Tx { .. } | QueryCmd::Chain { .. } | QueryCmd::Validator { .. } | QueryCmd::ShieldedPool { .. } | QueryCmd::Governance { .. } | QueryCmd::Key { .. } + | QueryCmd::Watch { .. } | QueryCmd::Ibc(_) => true, } } @@ -153,7 +176,8 @@ impl QueryCmd { | QueryCmd::Validator { .. } | QueryCmd::Dex { .. } | QueryCmd::Governance { .. } - | QueryCmd::Dao { .. } + | QueryCmd::CommunityPool { .. } + | QueryCmd::Watch { .. } | QueryCmd::Ibc(_) => { unreachable!("query is special cased") } @@ -162,3 +186,57 @@ impl QueryCmd { Ok(()) } } + +// this code (not just this function, the whole module) is pretty shitty, +// but that's maybe okay for the moment. it exists to consume the rpc. +async fn watch(key_regex: String, nv_key_regex: String, app: &mut App) -> Result<()> { + use penumbra_proto::cnidarium::v1alpha1::{ + query_service_client::QueryServiceClient, watch_response as wr, + }; + let mut client = QueryServiceClient::new(app.pd_channel().await?); + + let req = penumbra_proto::cnidarium::v1alpha1::WatchRequest { + key_regex, + nv_key_regex, + }; + + tracing::debug!(?req); + + let mut stream = client.watch(req).await?.into_inner(); + + while let Some(rsp) = stream.message().await? { + match rsp.entry { + Some(wr::Entry::Kv(kv)) => { + if kv.deleted { + println!("{} KV {} -> DELETED", rsp.version, kv.key); + } else { + println!( + "{} KV {} -> {}", + rsp.version, + kv.key, + simple_base64::encode(&kv.value) + ); + } + } + Some(wr::Entry::NvKv(nv_kv)) => { + let key = simple_base64::encode(&nv_kv.key); + + if nv_kv.deleted { + println!("{} NVKV {} -> DELETED", rsp.version, key); + } else { + println!( + "{} NVKV {} -> {}", + rsp.version, + key, + simple_base64::encode(&nv_kv.value) + ); + } + } + None => { + return Err(anyhow!("server returned None event")); + } + } + } + + Ok(()) +} diff --git a/crates/bin/pcli/src/command/query/dao.rs b/crates/bin/pcli/src/command/query/community_pool.rs similarity index 72% rename from crates/bin/pcli/src/command/query/dao.rs rename to crates/bin/pcli/src/command/query/community_pool.rs index 8605165a07..3846046306 100644 --- a/crates/bin/pcli/src/command/query/dao.rs +++ b/crates/bin/pcli/src/command/query/community_pool.rs @@ -3,25 +3,25 @@ use anyhow::{Context, Result}; use futures::TryStreamExt; use penumbra_asset::Value; use penumbra_proto::{ - core::component::dao::v1alpha1::DaoAssetBalancesRequest, - penumbra::core::component::dao::v1alpha1::query_service_client::QueryServiceClient as DaoQueryServiceClient, + core::component::community_pool::v1alpha1::CommunityPoolAssetBalancesRequest, + penumbra::core::component::community_pool::v1alpha1::query_service_client::QueryServiceClient as CommunityPoolQueryServiceClient, }; use penumbra_view::ViewClient; use std::io::{stdout, Write}; #[derive(Debug, clap::Subcommand)] -pub enum DaoCmd { - /// Get the balance in the DAO, or the balance of a specific asset. +pub enum CommunityPoolCmd { + /// Get the balance in the Community Pool, or the balance of a specific asset. Balance { /// Get only the balance of the specified asset. asset: Option, }, } -impl DaoCmd { +impl CommunityPoolCmd { pub async fn exec(&self, app: &mut App) -> Result<()> { match self { - DaoCmd::Balance { asset } => self.print_balance(app, asset).await, + CommunityPoolCmd::Balance { asset } => self.print_balance(app, asset).await, } } @@ -37,10 +37,10 @@ impl DaoCmd { } }); - let mut client = DaoQueryServiceClient::new(app.pd_channel().await?); + let mut client = CommunityPoolQueryServiceClient::new(app.pd_channel().await?); let chain_id = app.view().app_params().await?.chain_params.chain_id; let balances = client - .dao_asset_balances(DaoAssetBalancesRequest { + .community_pool_asset_balances(CommunityPoolAssetBalancesRequest { chain_id, asset_ids: asset_id.map_or_else(std::vec::Vec::new, |id| vec![id.into()]), }) @@ -48,7 +48,7 @@ impl DaoCmd { .into_inner() .try_collect::>() .await - .context("cannot process dao balance data")?; + .context("cannot process Community Pool balance data")?; let asset_cache = app.view().assets().await?; let mut writer = stdout(); diff --git a/crates/bin/pcli/src/command/query/ibc_query.rs b/crates/bin/pcli/src/command/query/ibc_query.rs index b825a9dbbc..aedf05f393 100644 --- a/crates/bin/pcli/src/command/query/ibc_query.rs +++ b/crates/bin/pcli/src/command/query/ibc_query.rs @@ -117,7 +117,8 @@ impl IbcCmd { IbcCmd::Channel { port, channel_id } => { // TODO channel lookup should be updated to use the ibc query logic. // https://docs.rs/ibc-proto/0.36.1/ibc_proto/ibc/core/channel/v1/query_client/struct.QueryClient.html#method.channel - let key = format!("channelEnds/ports/{port}/channels/channel-{channel_id}"); + let key = + format!("ibc-data/channelEnds/ports/{port}/channels/channel-{channel_id}"); let value = client .key_value(KeyValueRequest { key, diff --git a/crates/bin/pcli/src/command/tx.rs b/crates/bin/pcli/src/command/tx.rs index be3eb1a37b..88f6433f95 100644 --- a/crates/bin/pcli/src/command/tx.rs +++ b/crates/bin/pcli/src/command/tx.rs @@ -9,7 +9,19 @@ use std::{ use anyhow::{Context, Result}; use ark_ff::UniformRand; use decaf377::{Fq, Fr}; -use ibc_types::core::{channel::ChannelId, client::Height as IbcHeight}; +use ibc_proto::ibc::core::client::v1::{ + query_client::QueryClient as IbcClientQueryClient, QueryClientStateRequest, +}; +use ibc_proto::ibc::core::connection::v1::query_client::QueryClient as IbcConnectionQueryClient; +use ibc_proto::ibc::core::{ + channel::v1::{query_client::QueryClient as IbcChannelQueryClient, QueryChannelRequest}, + connection::v1::QueryConnectionRequest, +}; +use ibc_types::core::{ + channel::{ChannelId, PortId}, + client::Height as IbcHeight, +}; +use ibc_types::lightclients::tendermint::client_state::ClientState as TendermintClientState; use rand_core::OsRng; use regex::Regex; @@ -129,9 +141,9 @@ pub enum TxCmd { /// Submit or withdraw a governance proposal. #[clap(display_order = 500, subcommand)] Proposal(ProposalCmd), - /// Deposit funds into the DAO. + /// Deposit funds into the Community Pool. #[clap(display_order = 600)] - DaoDeposit { + CommunityPoolDeposit { /// The amounts to send, written as typed values 1.87penumbra, 12cubes, etc. values: Vec, /// Only spend funds originally received by the given account. @@ -179,8 +191,8 @@ pub enum TxCmd { /// height, e.g. `5-1000000` means "chain revision 5, block height of 1000000". /// You must know the chain id of the counterparty chain beforehand, e.g. `osmosis-testnet-5`, /// to know the revision number. - #[clap(long, default_value = "0-0", display_order = 100)] - timeout_height: IbcHeight, + #[clap(long, display_order = 100)] + timeout_height: Option, /// Timestamp, specified in epoch time, after which the withdrawal will be considered /// invalid if not already relayed. #[clap(long, default_value = "0", display_order = 150)] @@ -240,7 +252,7 @@ impl TxCmd { TxCmd::UndelegateClaim { .. } => false, TxCmd::Vote { .. } => false, TxCmd::Proposal(proposal_cmd) => proposal_cmd.offline(), - TxCmd::DaoDeposit { .. } => false, + TxCmd::CommunityPoolDeposit { .. } => false, TxCmd::Position(lp_cmd) => lp_cmd.offline(), TxCmd::Withdraw { .. } => false, } @@ -280,10 +292,8 @@ impl TxCmd { .payment_address((*from).into()) .0; - let memo_plaintext = MemoPlaintext { - return_address, - text: memo.clone().unwrap_or_default(), - }; + let memo_plaintext = + MemoPlaintext::new(return_address, memo.clone().unwrap_or_default())?; let mut planner = Planner::new(OsRng); planner.set_gas_prices(gas_prices); @@ -296,14 +306,13 @@ impl TxCmd { app.view .as_mut() .context("view service must be initialized")?, - app.config.full_viewing_key.wallet_id(), AddressIndex::new(*from), ) .await .context("can't build send transaction")?; app.build_and_submit_transaction(plan).await?; } - TxCmd::DaoDeposit { values, source } => { + TxCmd::CommunityPoolDeposit { values, source } => { let values = values .iter() .map(|v| v.parse()) @@ -312,14 +321,13 @@ impl TxCmd { let mut planner = Planner::new(OsRng); planner.set_gas_prices(gas_prices); for value in values { - planner.dao_deposit(value); + planner.community_pool_deposit(value); } let plan = planner .plan( app.view .as_mut() .context("view service must be initialized")?, - app.config.full_viewing_key.wallet_id(), AddressIndex::new(*source), ) .await?; @@ -327,7 +335,6 @@ impl TxCmd { } TxCmd::Sweep => loop { let plans = plan::sweep( - app.config.full_viewing_key.wallet_id(), app.view .as_mut() .context("view service must be initialized")?, @@ -381,9 +388,8 @@ impl TxCmd { ); planner.swap(input, into.id(), estimated_claim_fee, claim_address)?; - let wallet_id = app.config.full_viewing_key.wallet_id(); let plan = planner - .plan(app.view(), wallet_id, AddressIndex::new(*source)) + .plan(app.view(), AddressIndex::new(*source)) .await .context("can't plan swap transaction")?; @@ -402,7 +408,7 @@ impl TxCmd { // Fetch the SwapRecord with the claimable swap. let swap_record = app .view() - .swap_by_commitment(wallet_id, swap_plaintext.swap_commitment()) + .swap_by_commitment(swap_plaintext.swap_commitment()) .await?; let asset_cache = app.view().assets().await?; @@ -425,8 +431,6 @@ impl TxCmd { .format(&asset_cache), ); - let wallet_id = app.config.full_viewing_key.wallet_id(); - let params = app .view .as_mut() @@ -445,7 +449,7 @@ impl TxCmd { proof_blinding_r: Fq::rand(&mut OsRng), proof_blinding_s: Fq::rand(&mut OsRng), }) - .plan(app.view(), wallet_id, AddressIndex::new(*source)) + .plan(app.view(), AddressIndex::new(*source)) .await .context("can't plan swap claim")?; @@ -474,10 +478,9 @@ impl TxCmd { let mut planner = Planner::new(OsRng); planner.set_gas_prices(gas_prices); - let wallet_id = app.config.full_viewing_key.wallet_id().clone(); let plan = planner .delegate(unbonded_amount.value(), rate_data) - .plan(app.view(), wallet_id, AddressIndex::new(*source)) + .plan(app.view(), AddressIndex::new(*source)) .await .context("can't plan delegation")?; @@ -518,7 +521,6 @@ impl TxCmd { app.view .as_mut() .context("view service must be initialized")?, - app.config.full_viewing_key.wallet_id(), AddressIndex::new(*source), ) .await @@ -527,15 +529,13 @@ impl TxCmd { app.build_and_submit_transaction(plan).await?; } TxCmd::UndelegateClaim {} => { - let wallet_id = app.config.full_viewing_key.wallet_id(); // this should be optional? or saved in the client statefully? - let channel = app.pd_channel().await?; let view: &mut dyn ViewClient = app .view .as_mut() .context("view service must be initialized")?; - let current_height = view.status(wallet_id).await?.full_sync_height; + let current_height = view.status().await?.full_sync_height; let mut client = ChainQueryServiceClient::new(channel.clone()); let current_epoch = client .epoch_by_height(EpochByHeightRequest { @@ -549,7 +549,7 @@ impl TxCmd { // Query the view client for the list of undelegations that are ready to be claimed. // We want to claim them into the same address index that currently holds the tokens. - let notes = view.unspent_notes_by_address_and_asset(wallet_id).await?; + let notes = view.unspent_notes_by_address_and_asset().await?; for (address_index, notes_by_asset) in notes.into_iter() { for (token, notes) in @@ -617,7 +617,6 @@ impl TxCmd { app.view .as_mut() .context("view service must be initialized")?, - app.config.full_viewing_key.wallet_id(), address_index, ) .await?; @@ -649,7 +648,6 @@ impl TxCmd { app.view .as_mut() .context("view service must be initialized")?, - app.config.full_viewing_key.wallet_id(), AddressIndex::new(*source), ) .await?; @@ -668,7 +666,6 @@ impl TxCmd { app.view .as_mut() .context("view service must be initialized")?, - app.config.full_viewing_key.wallet_id(), AddressIndex::new(*source), ) .await?; @@ -748,7 +745,6 @@ impl TxCmd { app.view .as_mut() .context("view service must be initialized")?, - app.config.full_viewing_key.wallet_id(), AddressIndex::new(*source), ) .await?; @@ -813,7 +809,6 @@ impl TxCmd { app.view .as_mut() .context("view service must be initialized")?, - app.config.full_viewing_key.wallet_id(), AddressIndex::new(*source), ) .await?; @@ -836,7 +831,6 @@ impl TxCmd { app.view .as_mut() .context("view service must be initialized")?, - app.config.full_viewing_key.wallet_id(), source, ) .await?; @@ -858,13 +852,75 @@ impl TxCmd { .full_viewing_key .ephemeral_address(OsRng, AddressIndex::from(*source)); + let timeout_height = match timeout_height { + Some(h) => h.clone(), + None => { + // look up the height for the counterparty and add 2 days of block time + // (assuming 10 seconds per block) to it + + // look up the client state from the channel by looking up channel id -> connection id -> client state + let mut ibc_channel_client = + IbcChannelQueryClient::new(app.pd_channel().await?); + + let req = QueryChannelRequest { + port_id: PortId::transfer().to_string(), + channel_id: format!("channel-{}", channel), + }; + + let channel = ibc_channel_client + .channel(req) + .await? + .into_inner() + .channel + .ok_or_else(|| anyhow::anyhow!("channel not found"))?; + + let connection_id = channel.connection_hops[0].clone(); + + let mut ibc_connection_client = + IbcConnectionQueryClient::new(app.pd_channel().await?); + + let req = QueryConnectionRequest { + connection_id: connection_id.clone(), + }; + let connection = ibc_connection_client + .connection(req) + .await? + .into_inner() + .connection + .ok_or_else(|| anyhow::anyhow!("connection not found"))?; + + let mut ibc_client_client = + IbcClientQueryClient::new(app.pd_channel().await?); + let req = QueryClientStateRequest { + client_id: connection.client_id, + }; + let client_state = ibc_client_client + .client_state(req) + .await? + .into_inner() + .client_state + .ok_or_else(|| anyhow::anyhow!("client state not found"))?; + + let tm_client_state = TendermintClientState::try_from(client_state)?; + + let last_update_height = tm_client_state.latest_height; + + // 10 seconds per block, 2 days + let timeout_n_blocks = ((24 * 60 * 60) / 10) * 2; + + IbcHeight { + revision_number: last_update_height.revision_number, + revision_height: last_update_height.revision_height + timeout_n_blocks, + } + } + }; + // get the current time on the local machine let current_time_u64_ms = SystemTime::now() .duration_since(UNIX_EPOCH) .expect("Time went backwards") .as_nanos() as u64; - let timeout_height = *timeout_height; let mut timeout_timestamp = *timeout_timestamp; if timeout_timestamp == 0u64 { // add 2 days to current time @@ -909,7 +965,6 @@ impl TxCmd { app.view .as_mut() .context("view service must be initialized")?, - app.config.full_viewing_key.wallet_id(), AddressIndex::new(*source), ) .await?; @@ -929,7 +984,6 @@ impl TxCmd { app.view .as_mut() .context("view service must be initialized")?, - app.config.full_viewing_key.wallet_id(), AddressIndex::new(*source), ) .await?; @@ -970,7 +1024,6 @@ impl TxCmd { app.view .as_mut() .context("view service must be initialized")?, - app.config.full_viewing_key.wallet_id(), AddressIndex::new(*source), ) .await?; @@ -1047,7 +1100,6 @@ impl TxCmd { app.view .as_mut() .context("view service must be initialized")?, - app.config.full_viewing_key.wallet_id(), AddressIndex::new(*source), ) .await?; @@ -1100,7 +1152,6 @@ impl TxCmd { app.view .as_mut() .context("view service must be initialized")?, - app.config.full_viewing_key.wallet_id(), AddressIndex::new(*source), ) .await?; diff --git a/crates/bin/pcli/src/command/tx/proposal.rs b/crates/bin/pcli/src/command/tx/proposal.rs index 15d5e22d0e..81971d9e79 100644 --- a/crates/bin/pcli/src/command/tx/proposal.rs +++ b/crates/bin/pcli/src/command/tx/proposal.rs @@ -12,7 +12,7 @@ pub enum ProposalCmd { /// The file to output the template to. #[clap(long, global = true)] file: Option, - /// The kind of the proposal to template [one of: signaling, emergency, parameter-change, or dao-spend]. + /// The kind of the proposal to template [one of: signaling, emergency, parameter-change, or community-pool-spend]. #[clap(subcommand)] kind: ProposalKindCmd, }, @@ -62,8 +62,8 @@ pub enum ProposalKindCmd { Emergency, /// Generate a template for a parameter change proposal. ParameterChange, - /// Generate a template for a DAO spend proposal. - DaoSpend { + /// Generate a template for a Community Pool spend proposal. + CommunityPoolSpend { /// The transaction plan to include in the proposal, in JSON format. /// /// If not specified, the default empty transaction plan will be included, to be replaced @@ -87,7 +87,7 @@ impl ProposalKindCmd { old: Box::new(app_params.as_changed_params()), new: Box::new(ChangedAppParameters { chain_params: None, - dao_params: None, + community_pool_params: None, ibc_params: None, stake_params: None, fee_params: None, @@ -95,9 +95,9 @@ impl ProposalKindCmd { distributions_params: None, }), }, - ProposalKindCmd::DaoSpend { transaction_plan } => { + ProposalKindCmd::CommunityPoolSpend { transaction_plan } => { if let Some(file) = transaction_plan { - ProposalPayload::DaoSpend { + ProposalPayload::CommunityPoolSpend { transaction_plan: serde_json::from_reader( std::fs::File::open(file).with_context(|| { format!("Failed to open transaction plan file {:?}", file) @@ -108,7 +108,7 @@ impl ProposalKindCmd { })?, } } else { - ProposalPayload::DaoSpend { + ProposalPayload::CommunityPoolSpend { transaction_plan: TransactionPlan::default().encode_to_vec(), } } diff --git a/crates/bin/pcli/src/command/tx/replicate.rs b/crates/bin/pcli/src/command/tx/replicate.rs index cc4cd5e870..277243e67f 100644 --- a/crates/bin/pcli/src/command/tx/replicate.rs +++ b/crates/bin/pcli/src/command/tx/replicate.rs @@ -1,10 +1,10 @@ -use crate::{warning, App}; +use std::io::Write; use std::path::PathBuf; -use crate::dex_utils; -use crate::dex_utils::replicate::debug; use anyhow::{anyhow, bail, Context, Result}; use dialoguer::Confirm; +use rand_core::OsRng; + use penumbra_asset::Value; use penumbra_dex::{lp::position::Position, DirectedUnitPair}; use penumbra_keys::keys::AddressIndex; @@ -16,8 +16,10 @@ use penumbra_proto::{ view::v1alpha1::GasPricesRequest, }; use penumbra_view::{Planner, ViewClient}; -use rand_core::OsRng; -use std::io::Write; + +use crate::dex_utils; +use crate::dex_utils::replicate::debug; +use crate::{warning, App}; /// Queries the chain for a transaction by hash. #[derive(Debug, clap::Subcommand)] @@ -168,7 +170,6 @@ impl ConstantProduct { app.view .as_mut() .context("view service must be initialized")?, - app.config.full_viewing_key.wallet_id(), AddressIndex::new(self.source), ) .await?; diff --git a/crates/bin/pcli/src/command/validator.rs b/crates/bin/pcli/src/command/validator.rs index df45808642..cc2b771043 100644 --- a/crates/bin/pcli/src/command/validator.rs +++ b/crates/bin/pcli/src/command/validator.rs @@ -156,9 +156,7 @@ impl ValidatorCmd { }; // Construct a new transaction and include the validator definition. - let wallet_id = app.config.full_viewing_key.wallet_id(); let plan = plan::validator_definition( - wallet_id, app.view .as_mut() .context("view service must be initialized")?, @@ -212,10 +210,7 @@ impl ValidatorCmd { // Construct a new transaction and include the validator definition. let fee = Fee::from_staking_token_amount((*fee).into()); - let wallet_id = app.config.full_viewing_key.wallet_id(); - let plan = plan::validator_vote( - wallet_id, app.view .as_mut() .context("view service must be initialized")?, @@ -286,7 +281,7 @@ impl ValidatorCmd { address, rate_bps: 100, }, - FundingStream::ToDao { rate_bps: 100 }, + FundingStream::ToCommunityPool { rate_bps: 100 }, ])?, sequence_number: 0, } diff --git a/crates/bin/pcli/src/command/view/balance.rs b/crates/bin/pcli/src/command/view/balance.rs index b6bfe7f420..3f7e774a39 100644 --- a/crates/bin/pcli/src/command/view/balance.rs +++ b/crates/bin/pcli/src/command/view/balance.rs @@ -1,8 +1,10 @@ use anyhow::Result; use comfy_table::{presets, Table}; + use penumbra_keys::FullViewingKey; use penumbra_sct::CommitmentSource; use penumbra_view::ViewClient; + #[derive(Debug, clap::Args)] pub struct BalanceCmd { #[clap(long)] @@ -15,16 +17,14 @@ impl BalanceCmd { false } - pub async fn exec(&self, fvk: &FullViewingKey, view: &mut V) -> Result<()> { + pub async fn exec(&self, _fvk: &FullViewingKey, view: &mut V) -> Result<()> { let asset_cache = view.assets().await?; // Initialize the table let mut table = Table::new(); table.load_preset(presets::NOTHING); - let notes = view - .unspent_notes_by_account_and_asset(fvk.wallet_id()) - .await?; + let notes = view.unspent_notes_by_account_and_asset().await?; if self.by_note { table.set_header(vec!["Account", "Value", "Source"]); @@ -100,7 +100,7 @@ fn format_source(source: &CommitmentSource) -> String { CommitmentSource::FundingStreamReward { epoch_index } => { format!("Funding Stream (Epoch {})", epoch_index) } - CommitmentSource::DaoOutput => format!("DaoOutput"), + CommitmentSource::CommunityPoolOutput => format!("CommunityPoolOutput"), CommitmentSource::Ics20Transfer { packet_seq, channel_id, diff --git a/crates/bin/pcli/src/command/view/staked.rs b/crates/bin/pcli/src/command/view/staked.rs index b1d4cbc965..6cf5cafc34 100644 --- a/crates/bin/pcli/src/command/view/staked.rs +++ b/crates/bin/pcli/src/command/view/staked.rs @@ -3,6 +3,8 @@ use std::collections::BTreeMap; use anyhow::Result; use comfy_table::{presets, Table}; use futures::TryStreamExt; +use tonic::transport::Channel; + use penumbra_asset::{Value, STAKING_TOKEN_ASSET_ID}; use penumbra_keys::FullViewingKey; use penumbra_proto::core::component::stake::v1alpha1::{ @@ -10,7 +12,6 @@ use penumbra_proto::core::component::stake::v1alpha1::{ }; use penumbra_stake::{validator, DelegationToken}; use penumbra_view::ViewClient; -use tonic::transport::Channel; #[derive(Debug, clap::Parser)] pub struct StakedCmd {} @@ -22,7 +23,7 @@ impl StakedCmd { pub async fn exec( &self, - full_viewing_key: &FullViewingKey, + _fvk: &FullViewingKey, view_client: &mut impl ViewClient, pd_channel: Channel, ) -> Result<()> { @@ -43,10 +44,7 @@ impl StakedCmd { .map(TryInto::try_into) .collect::, _>>()?; - let wallet_id = full_viewing_key.wallet_id(); - let notes = view_client - .unspent_notes_by_asset_and_address(wallet_id) - .await?; + let notes = view_client.unspent_notes_by_asset_and_address().await?; let mut total = 0u128; let mut table = Table::new(); diff --git a/crates/bin/pcli/src/command/view/tx.rs b/crates/bin/pcli/src/command/view/tx.rs index 00a6a149d3..06516787d9 100644 --- a/crates/bin/pcli/src/command/view/tx.rs +++ b/crates/bin/pcli/src/command/view/tx.rs @@ -419,21 +419,27 @@ impl TxCmd { ), ] } - penumbra_transaction::ActionView::DaoDeposit(_) => { - ["Dao Deposit".to_string(), "".to_string()] + penumbra_transaction::ActionView::CommunityPoolDeposit(_) => { + ["CommunityPool Deposit".to_string(), "".to_string()] } - penumbra_transaction::ActionView::DaoSpend(_) => { - ["Dao Spend".to_string(), "".to_string()] + penumbra_transaction::ActionView::CommunityPoolSpend(_) => { + ["CommunityPool Spend".to_string(), "".to_string()] } - penumbra_transaction::ActionView::DaoOutput(_) => { - ["Dao Output".to_string(), "".to_string()] + penumbra_transaction::ActionView::CommunityPoolOutput(_) => { + ["CommunityPool Output".to_string(), "".to_string()] } }); } metadata_table.add_row(vec![ "Transaction Fee", - &tx_info.view.body_view.fee.value().format(&asset_cache), + &tx_info + .view + .body_view + .transaction_parameters + .fee + .value() + .format(&asset_cache), ]); let memo_view = tx_info.view.body_view.memo_view; diff --git a/crates/bin/pcli/src/main.rs b/crates/bin/pcli/src/main.rs index 5433a4365c..562973997c 100644 --- a/crates/bin/pcli/src/main.rs +++ b/crates/bin/pcli/src/main.rs @@ -1,11 +1,16 @@ #![deny(clippy::unwrap_used)] #![allow(clippy::clone_on_copy)] + use std::fs; use anyhow::{Context, Result}; use clap::Parser; -use config::PcliConfig; use futures::StreamExt; + +use box_grpc_svc::BoxGrpcService; +use command::*; +use config::PcliConfig; +use opt::Opt; use penumbra_proto::{ custody::v1alpha1::custody_protocol_service_client::CustodyProtocolServiceClient, view::v1alpha1::view_protocol_service_client::ViewProtocolServiceClient, @@ -21,11 +26,6 @@ mod opt; mod terminal; mod warning; -use opt::Opt; - -use box_grpc_svc::BoxGrpcService; -use command::*; - const CONFIG_FILE_NAME: &str = "config.toml"; const VIEW_FILE_NAME: &str = "pcli-view.sqlite"; @@ -45,11 +45,9 @@ impl App { } async fn sync(&mut self) -> Result<()> { - let mut status_stream = ViewClient::status_stream( - self.view.as_mut().expect("view service initialized"), - self.config.full_viewing_key.wallet_id(), - ) - .await?; + let mut status_stream = + ViewClient::status_stream(self.view.as_mut().expect("view service initialized")) + .await?; // Pull out the first message from the stream, which has the current state, and use // it to set up a progress bar. diff --git a/crates/bin/pcli/src/network.rs b/crates/bin/pcli/src/network.rs index 86af3aff24..0f8eef5025 100644 --- a/crates/bin/pcli/src/network.rs +++ b/crates/bin/pcli/src/network.rs @@ -3,7 +3,7 @@ use penumbra_proto::{ util::tendermint_proxy::v1alpha1::tendermint_proxy_service_client::TendermintProxyServiceClient, DomainType, }; -use penumbra_transaction::{plan::TransactionPlan, Id as TransactionId, Transaction}; +use penumbra_transaction::{plan::TransactionPlan, txhash::TransactionId, Transaction}; use penumbra_view::ViewClient; use std::future::Future; use tonic::transport::{Channel, ClientTlsConfig}; diff --git a/crates/bin/pcli/tests/proof.rs b/crates/bin/pcli/tests/proof.rs index 67f295ee87..1e7e029f65 100644 --- a/crates/bin/pcli/tests/proof.rs +++ b/crates/bin/pcli/tests/proof.rs @@ -5,25 +5,34 @@ use ark_ff::UniformRand; use decaf377::{Fq, Fr}; use decaf377_rdsa::{SigningKey, SpendAuth, VerificationKey}; use penumbra_asset::{asset, Balance, Value}; +use penumbra_dex::swap::proof::{SwapProofPrivate, SwapProofPublic}; +use penumbra_dex::swap_claim::{SwapClaimProofPrivate, SwapClaimProofPublic}; use penumbra_dex::{ swap::proof::SwapProof, swap::SwapPlaintext, swap_claim::proof::SwapClaimProof, BatchSwapOutputData, TradingPair, }; use penumbra_fee::Fee; -use penumbra_governance::DelegatorVoteProof; +use penumbra_governance::{ + DelegatorVoteProof, DelegatorVoteProofPrivate, DelegatorVoteProofPublic, +}; use penumbra_keys::keys::{Bip44Path, SeedPhrase, SpendKey}; use penumbra_num::Amount; use penumbra_proof_params::{ - DELEGATOR_VOTE_PROOF_PROVING_KEY, DELEGATOR_VOTE_PROOF_VERIFICATION_KEY, - NULLIFIER_DERIVATION_PROOF_PROVING_KEY, NULLIFIER_DERIVATION_PROOF_VERIFICATION_KEY, - OUTPUT_PROOF_PROVING_KEY, OUTPUT_PROOF_VERIFICATION_KEY, SPEND_PROOF_PROVING_KEY, - SPEND_PROOF_VERIFICATION_KEY, SWAPCLAIM_PROOF_PROVING_KEY, SWAPCLAIM_PROOF_VERIFICATION_KEY, - SWAP_PROOF_PROVING_KEY, SWAP_PROOF_VERIFICATION_KEY, UNDELEGATECLAIM_PROOF_PROVING_KEY, - UNDELEGATECLAIM_PROOF_VERIFICATION_KEY, + CONVERT_PROOF_PROVING_KEY, CONVERT_PROOF_VERIFICATION_KEY, DELEGATOR_VOTE_PROOF_PROVING_KEY, + DELEGATOR_VOTE_PROOF_VERIFICATION_KEY, NULLIFIER_DERIVATION_PROOF_PROVING_KEY, + NULLIFIER_DERIVATION_PROOF_VERIFICATION_KEY, OUTPUT_PROOF_PROVING_KEY, + OUTPUT_PROOF_VERIFICATION_KEY, SPEND_PROOF_PROVING_KEY, SPEND_PROOF_VERIFICATION_KEY, + SWAPCLAIM_PROOF_PROVING_KEY, SWAPCLAIM_PROOF_VERIFICATION_KEY, SWAP_PROOF_PROVING_KEY, + SWAP_PROOF_VERIFICATION_KEY, }; use penumbra_sct::Nullifier; +use penumbra_shielded_pool::output::{OutputProofPrivate, OutputProofPublic}; use penumbra_shielded_pool::Note; -use penumbra_shielded_pool::{NullifierDerivationProof, OutputProof, SpendProof}; +use penumbra_shielded_pool::{ + NullifierDerivationProof, NullifierDerivationProofPrivate, NullifierDerivationProofPublic, + OutputProof, SpendProof, SpendProofPrivate, SpendProofPublic, +}; +use penumbra_stake::undelegate_claim::{UndelegateClaimProofPrivate, UndelegateClaimProofPublic}; use penumbra_stake::{IdentityKey, Penalty, UnbondingToken, UndelegateClaimProof}; use penumbra_tct as tct; use rand_core::OsRng; @@ -56,33 +65,33 @@ fn spend_proof_parameters_vs_current_spend_circuit() { let mut sct = tct::Tree::new(); sct.insert(tct::Witness::Keep, note_commitment).unwrap(); let anchor = sct.root(); - let note_commitment_proof = sct.witness(note_commitment).unwrap(); + let state_commitment_proof = sct.witness(note_commitment).unwrap(); let v_blinding = Fr::rand(&mut OsRng); let balance_commitment = value_to_send.commit(v_blinding); let rk: VerificationKey = rsk.into(); - let nf = Nullifier::derive(&nk, 0.into(), ¬e_commitment); + let nullifier = Nullifier::derive(&nk, 0.into(), ¬e_commitment); // Random elements to provide ZK (see Section 3.2 Groth16 paper, bottom of page 17) let blinding_r = Fq::rand(&mut OsRng); let blinding_s = Fq::rand(&mut OsRng); - let proof = SpendProof::prove( - blinding_r, - blinding_s, - pk, - note_commitment_proof, + let public = SpendProofPublic { + anchor, + balance_commitment, + nullifier, + rk, + }; + let private = SpendProofPrivate { + state_commitment_proof, note, v_blinding, spend_auth_randomizer, ak, nk, - anchor, - balance_commitment, - nf, - rk, - ) - .expect("can create proof"); + }; + let proof = SpendProof::prove(blinding_r, blinding_s, pk, public.clone(), private) + .expect("can create proof"); - let proof_result = proof.verify(vk, anchor, balance_commitment, nf, rk); + let proof_result = proof.verify(vk, public); assert!(proof_result.is_ok()); } @@ -130,24 +139,25 @@ fn delegator_vote_proof_parameters_vs_current_delegator_vote_circuit() { let blinding_r = Fq::rand(&mut OsRng); let blinding_s = Fq::rand(&mut OsRng); - let proof = DelegatorVoteProof::prove( - blinding_r, - blinding_s, - pk, + let public = DelegatorVoteProofPublic { + anchor, + balance_commitment, + nullifier: nf, + rk, + start_position, + }; + let private = DelegatorVoteProofPrivate { state_commitment_proof, note, + v_blinding: Fr::from(0u64), spend_auth_randomizer, ak, nk, - anchor, - balance_commitment, - nf, - rk, - start_position, - ) - .expect("can create proof"); + }; + let proof = DelegatorVoteProof::prove(blinding_r, blinding_s, pk, public.clone(), private) + .expect("can create proof"); - let proof_result = proof.verify(vk, anchor, balance_commitment, nf, rk, start_position); + let proof_result = proof.verify(vk, public); assert!(proof_result.is_ok()); } @@ -197,21 +207,22 @@ fn swap_proof_parameters_vs_current_swap_circuit() { balance -= value_fee; let balance_commitment = balance.commit(fee_blinding); - let blinding_r = Fq::rand(&mut OsRng); - let blinding_s = Fq::rand(&mut OsRng); - let proof = SwapProof::prove( - blinding_r, - blinding_s, - pk, - swap_plaintext, - fee_blinding, + let public = SwapProofPublic { balance_commitment, swap_commitment, fee_commitment, - ) - .expect("can create proof"); + }; + let private = SwapProofPrivate { + fee_blinding, + swap_plaintext, + }; - let proof_result = proof.verify(vk, balance_commitment, swap_commitment, fee_commitment); + let blinding_r = Fq::rand(&mut OsRng); + let blinding_s = Fq::rand(&mut OsRng); + let proof = SwapProof::prove(blinding_r, blinding_s, pk, public.clone(), private) + .expect("can create proof"); + + let proof_result = proof.verify(vk, public); assert!(proof_result.is_ok()); } @@ -246,7 +257,7 @@ fn swap_claim_parameters_vs_current_swap_claim_circuit() { fee, claim_address, ); - let fee = swap_plaintext.clone().claim_fee; + let claim_fee = swap_plaintext.clone().claim_fee; let mut sct = tct::Tree::new(); let swap_commitment = swap_plaintext.swap_commitment(); sct.insert(tct::Witness::Keep, swap_commitment).unwrap(); @@ -277,37 +288,31 @@ fn swap_claim_parameters_vs_current_swap_claim_circuit() { let note_commitment_1 = output_1_note.commit(); let note_commitment_2 = output_2_note.commit(); - let blinding_r = Fq::rand(&mut rng); - let blinding_s = Fq::rand(&mut rng); - - let proof = SwapClaimProof::prove( - blinding_r, - blinding_s, - pk, + let public = SwapClaimProofPublic { + anchor, + nullifier, + claim_fee, + output_data, + note_commitment_1, + note_commitment_2, + }; + let private = SwapClaimProofPrivate { swap_plaintext, state_commitment_proof, nk, - anchor, - nullifier, lambda_1, lambda_2, note_blinding_1, note_blinding_2, - note_commitment_1, - note_commitment_2, - output_data, - ) - .expect("can create proof"); + }; - let proof_result = proof.verify( - vk, - anchor, - nullifier, - fee, - output_data, - note_commitment_1, - note_commitment_2, - ); + let blinding_r = Fq::rand(&mut rng); + let blinding_s = Fq::rand(&mut rng); + + let proof = SwapClaimProof::prove(blinding_r, blinding_s, pk, public.clone(), private) + .expect("can create proof"); + + let proof_result = proof.verify(vk, public); assert!(proof_result.is_ok()); } @@ -317,41 +322,46 @@ fn output_proof_parameters_vs_current_output_circuit() { let pk = &*OUTPUT_PROOF_PROVING_KEY; let vk = &*OUTPUT_PROOF_VERIFICATION_KEY; - let mut rng = OsRng; - - let seed_phrase = SeedPhrase::generate(OsRng); - let sk_recipient = SpendKey::from_seed_phrase_bip44(seed_phrase, &Bip44Path::new(0)); - let fvk_recipient = sk_recipient.full_viewing_key(); - let ivk_recipient = fvk_recipient.incoming(); - let (dest, _dtk_d) = ivk_recipient.payment_address(0u32.into()); - - let value_to_send = Value { - amount: 1u64.into(), - asset_id: asset::Cache::with_known_assets() - .get_unit("upenumbra") - .unwrap() - .id(), + let (public, private) = { + let mut rng = OsRng; + + let seed_phrase = SeedPhrase::generate(OsRng); + let sk_recipient = SpendKey::from_seed_phrase_bip44(seed_phrase, &Bip44Path::new(0)); + let fvk_recipient = sk_recipient.full_viewing_key(); + let ivk_recipient = fvk_recipient.incoming(); + let (dest, _dtk_d) = ivk_recipient.payment_address(0u32.into()); + + let value_to_send = Value { + amount: 1u64.into(), + asset_id: asset::Cache::with_known_assets() + .get_unit("upenumbra") + .unwrap() + .id(), + }; + let balance_blinding = Fr::rand(&mut OsRng); + + let note = Note::generate(&mut rng, &dest, value_to_send); + let note_commitment = note.commit(); + let balance_commitment = (-Balance::from(value_to_send)).commit(balance_blinding); + + let public = OutputProofPublic { + balance_commitment, + note_commitment, + }; + let private = OutputProofPrivate { + note, + balance_blinding, + }; + + (public, private) }; - let v_blinding = Fr::rand(&mut OsRng); - - let note = Note::generate(&mut rng, &dest, value_to_send); - let note_commitment = note.commit(); - let balance_commitment = (-Balance::from(value_to_send)).commit(v_blinding); let blinding_r = Fq::rand(&mut OsRng); let blinding_s = Fq::rand(&mut OsRng); - let proof = OutputProof::prove( - blinding_r, - blinding_s, - pk, - note, - v_blinding, - balance_commitment, - note_commitment, - ) - .expect("can create proof"); + let proof = OutputProof::prove(blinding_r, blinding_s, pk, public.clone(), private) + .expect("can create proof"); - let proof_result = proof.verify(vk, balance_commitment, note_commitment); + let proof_result = proof.verify(vk, public); assert!(proof_result.is_ok()); } @@ -387,52 +397,62 @@ fn nullifier_derivation_parameters_vs_current_nullifier_derivation_circuit() { let position = state_commitment_proof.position(); let nullifier = Nullifier::derive(&nk, state_commitment_proof.position(), ¬e_commitment); - let proof = - NullifierDerivationProof::prove(&mut rng, pk, position, note.clone(), nk, nullifier) - .expect("can create proof"); + let public = NullifierDerivationProofPublic { + position, + note_commitment, + nullifier, + }; + let private = NullifierDerivationProofPrivate { nk }; + let proof = NullifierDerivationProof::prove(&mut rng, pk, public.clone(), private) + .expect("can create proof"); - let proof_result = proof.verify(vk, position, note.commit(), nullifier); + let proof_result = proof.verify(vk, public); assert!(proof_result.is_ok()); } #[test] fn undelegate_claim_parameters_vs_current_undelegate_claim_circuit() { - let pk = &*UNDELEGATECLAIM_PROOF_PROVING_KEY; - let vk = &*UNDELEGATECLAIM_PROOF_VERIFICATION_KEY; + let pk = &*CONVERT_PROOF_PROVING_KEY; + let vk = &*CONVERT_PROOF_VERIFICATION_KEY; let mut rng = OsRng; - let sk = SigningKey::new_from_field(Fr::from(1u8)); - let balance_blinding = Fr::from(1u8); - let value1_amount = 1u64; - let penalty_amount = 1u64; - let validator_identity = IdentityKey((&sk).into()); - let unbonding_amount = Amount::from(value1_amount); - - let start_epoch_index = 1; - let unbonding_token = UnbondingToken::new(validator_identity, start_epoch_index); - let unbonding_id = unbonding_token.id(); - let penalty = Penalty::from_bps_squared(penalty_amount); - let balance = penalty.balance_for_claim(unbonding_id, unbonding_amount); - let balance_commitment = balance.commit(balance_blinding); + let (public, private) = { + let sk = SigningKey::new_from_field(Fr::from(1u8)); + let balance_blinding = Fr::from(1u8); + let value1_amount = 1u64; + let penalty_amount = 1u64; + let validator_identity = IdentityKey((&sk).into()); + let unbonding_amount = Amount::from(value1_amount); + + let start_epoch_index = 1; + let unbonding_token = UnbondingToken::new(validator_identity, start_epoch_index); + let unbonding_id = unbonding_token.id(); + let penalty = Penalty::from_bps_squared(penalty_amount); + let balance = penalty.balance_for_claim(unbonding_id, unbonding_amount); + let balance_commitment = balance.commit(balance_blinding); + + ( + UndelegateClaimProofPublic { + balance_commitment, + unbonding_id, + penalty, + }, + UndelegateClaimProofPrivate { + unbonding_amount, + balance_blinding, + }, + ) + }; let blinding_r = Fq::rand(&mut rng); let blinding_s = Fq::rand(&mut rng); - let proof = UndelegateClaimProof::prove( - blinding_r, - blinding_s, - pk, - unbonding_amount, - balance_blinding, - balance_commitment, - unbonding_id, - penalty, - ) - .expect("can create proof"); + let proof = UndelegateClaimProof::prove(blinding_r, blinding_s, pk, public.clone(), private) + .expect("can create proof"); - let proof_result = proof.verify(vk, balance_commitment, unbonding_id, penalty); + let proof_result = proof.verify(vk, public); assert!(proof_result.is_ok()); } diff --git a/crates/bin/pclientd/Cargo.toml b/crates/bin/pclientd/Cargo.toml index b8c30046ef..5dd1608e9a 100644 --- a/crates/bin/pclientd/Cargo.toml +++ b/crates/bin/pclientd/Cargo.toml @@ -63,8 +63,8 @@ directories = "4.0.1" tempfile = "3.3.0" assert_cmd = "2.0" base64 = "0.20" -ibc-types = { version = "0.10.0" } -ibc-proto = { version = "0.39.0", default-features = false, features = ["server"] } +ibc-types = { version = "0.11.0" } +ibc-proto = { version = "0.40.0", default-features = false, features = ["server"] } penumbra-proof-params = { path = "../../crypto/proof-params", features = [ "bundled-proving-keys", "download-proving-keys", diff --git a/crates/bin/pclientd/tests/network_integration.rs b/crates/bin/pclientd/tests/network_integration.rs index 940a25017e..ffdafd88bf 100644 --- a/crates/bin/pclientd/tests/network_integration.rs +++ b/crates/bin/pclientd/tests/network_integration.rs @@ -6,8 +6,13 @@ //! where no tokens have been delegated, and the address with index 0 //! was distributedp 1cube. +use std::process::Command as StdCommand; + use assert_cmd::cargo::CommandCargoExt; use futures::StreamExt; +use tempfile::tempdir; +use tokio::process::Command as TokioCommand; + use pclientd::PclientdConfig; use penumbra_asset::{asset, Value, STAKING_TOKEN_ASSET_ID}; use penumbra_custody::soft_kms; @@ -23,9 +28,6 @@ use penumbra_proto::{ }, }; use penumbra_view::ViewClient; -use std::process::Command as StdCommand; -use tempfile::tempdir; -use tokio::process::Command as TokioCommand; fn generate_config() -> anyhow::Result { Ok(PclientdConfig { @@ -83,7 +85,7 @@ async fn transaction_send_flow() -> anyhow::Result<()> { // 4. Use the view protocol to wait for it to sync. let mut status_stream = (&mut view_client as &mut dyn ViewClient) - .status_stream(test_keys::FULL_VIEWING_KEY.wallet_id()) + .status_stream() .await?; while let Some(item) = status_stream.as_mut().next().await.transpose()? { tracing::debug!(?item); @@ -220,7 +222,7 @@ async fn swap_claim_flow() -> anyhow::Result<()> { // 4. Use the view protocol to wait for it to sync. let mut status_stream = (&mut view_client as &mut dyn ViewClient) - .status_stream(test_keys::FULL_VIEWING_KEY.wallet_id()) + .status_stream() .await?; while let Some(item) = status_stream.as_mut().next().await.transpose()? { tracing::debug!(?item); @@ -317,7 +319,7 @@ async fn swap_claim_flow() -> anyhow::Result<()> { // 6. Use the view protocol to wait for it to sync. let mut status_stream = (&mut view_client as &mut dyn ViewClient) - .status_stream(test_keys::FULL_VIEWING_KEY.wallet_id()) + .status_stream() .await?; while let Some(item) = status_stream.as_mut().next().await.transpose()? { tracing::debug!(?item); @@ -325,10 +327,7 @@ async fn swap_claim_flow() -> anyhow::Result<()> { // Ensure we can fetch the SwapRecord with the claimable swap. let _swap_record = (&mut view_client as &mut dyn ViewClient) - .swap_by_commitment( - test_keys::FULL_VIEWING_KEY.wallet_id(), - swap_plaintext.swap_commitment(), - ) + .swap_by_commitment(swap_plaintext.swap_commitment()) .await?; // 7. Prepare the swap claim diff --git a/crates/bin/pd/Cargo.toml b/crates/bin/pd/Cargo.toml index 2e255104de..c3bb959c80 100644 --- a/crates/bin/pd/Cargo.toml +++ b/crates/bin/pd/Cargo.toml @@ -59,9 +59,9 @@ tendermint-config = "0.34.0" tendermint-proto = "0.34.0" tendermint = "0.34.0" tendermint-light-client-verifier = "0.34.0" -ibc-types = { version = "0.10.0" } +ibc-types = { version = "0.11.0" } -ibc-proto = { version = "0.39.0", default-features = false, features = [ +ibc-proto = { version = "0.40.0", default-features = false, features = [ "server", ] } prost = "0.12.3" diff --git a/crates/bin/pd/src/main.rs b/crates/bin/pd/src/main.rs index b8a1314cd3..555ff551d8 100644 --- a/crates/bin/pd/src/main.rs +++ b/crates/bin/pd/src/main.rs @@ -6,6 +6,7 @@ use std::{net::SocketAddr, path::PathBuf}; use console_subscriber::ConsoleLayer; use metrics_tracing_context::{MetricsLayer, TracingContextLayer}; use metrics_util::layers::Stack; +use std::error::Error; use anyhow::Context; use clap::{Parser, Subcommand}; @@ -245,11 +246,12 @@ enum TestnetCommand { #[tokio::main] async fn main() -> anyhow::Result<()> { + // Validate options immediately. + let opt = Opt::parse(); + // Instantiate tracing layers. // The MetricsLayer handles enriching metrics output with labels from tracing spans. let metrics_layer = MetricsLayer::new(); - // The ConsoleLayer enables collection of data for `tokio-console`. - let console_layer = ConsoleLayer::builder().with_default_env().spawn(); // The `FmtLayer` is used to print to the console. let fmt_layer = tracing_subscriber::fmt::layer() .with_ansi(atty::is(atty::Stream::Stdout)) @@ -257,14 +259,15 @@ async fn main() -> anyhow::Result<()> { // The `EnvFilter` layer is used to filter events based on `RUST_LOG`. let filter_layer = EnvFilter::try_from_default_env().or_else(|_| EnvFilter::try_new("info"))?; - let opt = Opt::parse(); - // Register the tracing subscribers, conditionally enabling tokio console support let registry = tracing_subscriber::registry() .with(filter_layer) .with(fmt_layer) .with(metrics_layer); if opt.tokio_console { + // The ConsoleLayer enables collection of data for `tokio-console`. + // The `spawn` call will panic if AddrInUse, so we only spawn if enabled. + let console_layer = ConsoleLayer::builder().with_default_env().spawn(); registry.with(console_layer).init(); } else { registry.init(); @@ -280,15 +283,22 @@ async fn main() -> anyhow::Result<()> { cometbft_addr, enable_expensive_rpc, } => { - tracing::info!( - ?abci_bind, - ?grpc_bind, - ?grpc_auto_https, - ?metrics_bind, - %cometbft_addr, - ?enable_expensive_rpc, - "starting pd" - ); + // Unpack grpc bind option, defaulting to localhost, but setting 0.0.0.0:443 + // if auto https is enabled. We unpack the option outside of the conditional + // below, in order to report the bind address in error handling. + let grpc_bind = if grpc_bind.is_some() { + grpc_bind.unwrap_or( + "0.0.0.0:443" + .parse() + .context("failed to parse grpc_bind address")?, + ) + } else { + grpc_bind.unwrap_or( + "127.0.0.1:8080" + .parse() + .context("failed to parse grpc_bind address")?, + ) + }; // Ensure we have all necessary parts in the URL if !url_has_necessary_parts(&cometbft_addr) { @@ -310,6 +320,16 @@ async fn main() -> anyhow::Result<()> { .await .context("Unable to initialize RocksDB storage")?; + tracing::info!( + ?abci_bind, + ?grpc_bind, + ?grpc_auto_https, + ?metrics_bind, + %cometbft_addr, + ?enable_expensive_rpc, + "starting pd" + ); + use penumbra_tower_trace::trace::request_span; let consensus = tower::ServiceBuilder::new() @@ -468,11 +488,6 @@ async fn main() -> anyhow::Result<()> { let mut acme_cache = pd_home.clone(); acme_cache.push("rustls_acme_cache"); - let grpc_bind = grpc_bind.unwrap_or( - "0.0.0.0:443" - .parse() - .context("failed to parse grpc_bind address")?, - ); let bound_listener = TcpListener::bind(grpc_bind) .await .context(format!("Failed to bind HTTPS listener on {}", grpc_bind))?; @@ -493,11 +508,6 @@ async fn main() -> anyhow::Result<()> { .spawn(grpc_server.serve_with_incoming(tls_incoming)) .expect("failed to spawn grpc server") } else { - let grpc_bind = grpc_bind.unwrap_or( - "127.0.0.1:8080" - .parse() - .context("failed to parse grpc_bind address")?, - ); tokio::task::Builder::new() .name("grpc_server") .spawn(grpc_server.serve(grpc_bind)) @@ -514,7 +524,14 @@ async fn main() -> anyhow::Result<()> { penumbra_dex::component::metrics::DEX_BUCKETS, )? .build() - .expect("failed to build prometheus recorder"); + .map_err(|_| { + let msg = format!( + "failed to build prometheus recorder; make sure {} is available", + &metrics_bind + ); + tracing::error!("{}", msg); + anyhow::anyhow!(msg) + })?; Stack::new(recorder) // Adding the `TracingContextLayer` will add labels from the tracing span to metrics. @@ -529,11 +546,38 @@ async fn main() -> anyhow::Result<()> { pd::register_metrics(); - // TODO: better error reporting - // We error out if a service errors, rather than keep running + // We error out if a service errors, rather than keep running. + // A special attempt is made to detect whether binding to target socket failed; + // if so, we report that error explicitly, otherwise we fall back to reporting + // whatever the error was. tokio::select! { - x = abci_server => x?.map_err(|e| anyhow::anyhow!(e))?, - x = grpc_server => x?.map_err(|e| anyhow::anyhow!(e))?, + x = abci_server => x?.map_err(|e| { + // The display impl on the ABCI error is sufficiently informative, + // so we don't need special handling of the failed-to-bind case. + let msg = format!("abci server on {} failed: {}", abci_bind, e); + tracing::error!("{}", msg); + anyhow::anyhow!(msg) + } + )?, + + x = grpc_server => x?.map_err(|e| { + let mut msg = format!("grpc server on {} failed: {}", grpc_bind, e); + // Detect if we have a bind error. We need to unpack nested errors, from + // tonic -> hyper -> std. Otherwise, only "transport error" is reported, + // which isn't informative enough to take action. + if let Some(e) = e.source() { + if let Some(e) = e.source() { + if let Some(e) = e.downcast_ref::() { + if e.kind().to_string().contains("address in use") { + msg = format!("grpc bind socket already in use: {}", grpc_bind); + } + } + } + } + tracing::error!("{}", msg); + anyhow::anyhow!(msg) + } + )?, }; } diff --git a/crates/cnidarium/Cargo.toml b/crates/cnidarium/Cargo.toml index d8b735d5ab..1e770b2478 100644 --- a/crates/cnidarium/Cargo.toml +++ b/crates/cnidarium/Cargo.toml @@ -25,7 +25,7 @@ metrics = { version = "0.19.0", optional = true } parking_lot = "0.12" pin-project = "1.0.12" smallvec = { version = "1.10", features = ["union", "const_generics"] } -ibc-types = { version = "0.10.0", default-features = false, features = ["std"] } +ibc-types = { version = "0.11.0", default-features = false, features = ["std"] } once_cell = "1" # Tendermint/IBC crates @@ -39,7 +39,8 @@ tonic = { version = "0.10", optional = true } prost = { version = "0.12.3", optional = true } serde = { version = "1", optional = true } pbjson = { version = "0.5", optional = true } -ibc-proto = { version = "0.39.0", default-features = false, features = ["serde"], optional = true } +ibc-proto = { version = "0.40.0", default-features = false, features = ["serde"], optional = true } +regex = "1.10.2" [dev-dependencies] tempfile = "3.3.0" diff --git a/crates/cnidarium/src/cache.rs b/crates/cnidarium/src/cache.rs index 1a76c9dd6f..f9817d7716 100644 --- a/crates/cnidarium/src/cache.rs +++ b/crates/cnidarium/src/cache.rs @@ -23,6 +23,16 @@ pub struct Cache { } impl Cache { + /// Inspect the cache of unwritten changes to the verifiable state. + pub fn unwritten_changes(&self) -> &BTreeMap>> { + &self.unwritten_changes + } + + /// Inspect the cache of unwritten changes to the nonverifiable state. + pub fn nonverifiable_changes(&self) -> &BTreeMap, Option>> { + &self.nonverifiable_changes + } + /// Merge the given cache with this one, taking its writes in place of ours. pub fn merge(&mut self, other: Cache) { // One might ask, why does this exist separately from `apply_to`? The @@ -103,4 +113,13 @@ impl Cache { } changes_by_substore } + + pub(crate) fn clone_changes(&self) -> Self { + Self { + unwritten_changes: self.unwritten_changes.clone(), + nonverifiable_changes: self.nonverifiable_changes.clone(), + ephemeral_objects: Default::default(), + events: Default::default(), + } + } } diff --git a/crates/cnidarium/src/gen/penumbra.cnidarium.v1alpha1.rs b/crates/cnidarium/src/gen/penumbra.cnidarium.v1alpha1.rs index 6edd6f9cbc..33b0e9efef 100644 --- a/crates/cnidarium/src/gen/penumbra.cnidarium.v1alpha1.rs +++ b/crates/cnidarium/src/gen/penumbra.cnidarium.v1alpha1.rs @@ -91,6 +91,106 @@ impl ::prost::Name for PrefixValueResponse { ::prost::alloc::format!("penumbra.cnidarium.v1alpha1.{}", Self::NAME) } } +/// Requests a stream of new key-value pairs that have been committed to the state. +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct WatchRequest { + /// A regex for keys in the verifiable storage. + /// + /// Only key-value updates whose keys match this regex will be returned. + /// Note that the empty string matches all keys. + /// To exclude all keys, use the regex "$^", which matches no strings. + #[prost(string, tag = "1")] + pub key_regex: ::prost::alloc::string::String, + /// A regex for keys in the nonverifiable storage. + /// + /// Only key-value updates whose keys match this regex will be returned. + /// Note that the empty string matches all keys. + /// To exclude all keys, use the regex "$^", which matches no strings. + #[prost(string, tag = "2")] + pub nv_key_regex: ::prost::alloc::string::String, +} +impl ::prost::Name for WatchRequest { + const NAME: &'static str = "WatchRequest"; + const PACKAGE: &'static str = "penumbra.cnidarium.v1alpha1"; + fn full_name() -> ::prost::alloc::string::String { + ::prost::alloc::format!("penumbra.cnidarium.v1alpha1.{}", Self::NAME) + } +} +/// A key-value pair that has been committed to the state. +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct WatchResponse { + /// The state version the key-value pair was committed at. + #[prost(uint64, tag = "1")] + pub version: u64, + /// The entry that was committed. + #[prost(oneof = "watch_response::Entry", tags = "5, 6")] + pub entry: ::core::option::Option, +} +/// Nested message and enum types in `WatchResponse`. +pub mod watch_response { + /// Elements of the verifiable storage have string keys. + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct KeyValue { + #[prost(string, tag = "1")] + pub key: ::prost::alloc::string::String, + #[prost(bytes = "vec", tag = "2")] + pub value: ::prost::alloc::vec::Vec, + /// If set to true, the key-value pair was deleted. + /// This allows distinguishing a deleted key-value pair from a key-value pair whose value is empty. + #[prost(bool, tag = "3")] + pub deleted: bool, + } + impl ::prost::Name for KeyValue { + const NAME: &'static str = "KeyValue"; + const PACKAGE: &'static str = "penumbra.cnidarium.v1alpha1"; + fn full_name() -> ::prost::alloc::string::String { + ::prost::alloc::format!( + "penumbra.cnidarium.v1alpha1.WatchResponse.{}", Self::NAME + ) + } + } + /// Elements of the nonverifiable storage have byte keys. + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct NvKeyValue { + #[prost(bytes = "vec", tag = "1")] + pub key: ::prost::alloc::vec::Vec, + #[prost(bytes = "vec", tag = "2")] + pub value: ::prost::alloc::vec::Vec, + /// If set to true, the key-value pair was deleted. + /// This allows distinguishing a deleted key-value pair from a key-value pair whose value is empty. + #[prost(bool, tag = "3")] + pub deleted: bool, + } + impl ::prost::Name for NvKeyValue { + const NAME: &'static str = "NvKeyValue"; + const PACKAGE: &'static str = "penumbra.cnidarium.v1alpha1"; + fn full_name() -> ::prost::alloc::string::String { + ::prost::alloc::format!( + "penumbra.cnidarium.v1alpha1.WatchResponse.{}", Self::NAME + ) + } + } + /// The entry that was committed. + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Oneof)] + pub enum Entry { + #[prost(message, tag = "5")] + Kv(KeyValue), + #[prost(message, tag = "6")] + NvKv(NvKeyValue), + } +} +impl ::prost::Name for WatchResponse { + const NAME: &'static str = "WatchResponse"; + const PACKAGE: &'static str = "penumbra.cnidarium.v1alpha1"; + fn full_name() -> ::prost::alloc::string::String { + ::prost::alloc::format!("penumbra.cnidarium.v1alpha1.{}", Self::NAME) + } +} /// Generated client implementations. #[cfg(feature = "rpc")] pub mod query_service_client { @@ -211,7 +311,6 @@ pub mod query_service_client { } /// General-purpose prefixed key-value state query API, that can be used to query /// arbitrary prefixes in the JMT storage. - /// Returns a stream of `PrefixValueResponse`s. pub async fn prefix_value( &mut self, request: impl tonic::IntoRequest, @@ -242,6 +341,34 @@ pub mod query_service_client { ); self.inner.server_streaming(req, path, codec).await } + /// Subscribes to a stream of key-value updates, with regex filtering on keys. + pub async fn watch( + &mut self, + request: impl tonic::IntoRequest, + ) -> std::result::Result< + tonic::Response>, + tonic::Status, + > { + self.inner + .ready() + .await + .map_err(|e| { + tonic::Status::new( + tonic::Code::Unknown, + format!("Service was not ready: {}", e.into()), + ) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/penumbra.cnidarium.v1alpha1.QueryService/Watch", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert( + GrpcMethod::new("penumbra.cnidarium.v1alpha1.QueryService", "Watch"), + ); + self.inner.server_streaming(req, path, codec).await + } } } /// Generated server implementations. @@ -269,7 +396,6 @@ pub mod query_service_server { + 'static; /// General-purpose prefixed key-value state query API, that can be used to query /// arbitrary prefixes in the JMT storage. - /// Returns a stream of `PrefixValueResponse`s. async fn prefix_value( &self, request: tonic::Request, @@ -277,6 +403,17 @@ pub mod query_service_server { tonic::Response, tonic::Status, >; + /// Server streaming response type for the Watch method. + type WatchStream: tonic::codegen::tokio_stream::Stream< + Item = std::result::Result, + > + + Send + + 'static; + /// Subscribes to a stream of key-value updates, with regex filtering on keys. + async fn watch( + &self, + request: tonic::Request, + ) -> std::result::Result, tonic::Status>; } #[derive(Debug)] pub struct QueryServiceServer { @@ -450,6 +587,53 @@ pub mod query_service_server { }; Box::pin(fut) } + "/penumbra.cnidarium.v1alpha1.QueryService/Watch" => { + #[allow(non_camel_case_types)] + struct WatchSvc(pub Arc); + impl< + T: QueryService, + > tonic::server::ServerStreamingService + for WatchSvc { + type Response = super::WatchResponse; + type ResponseStream = T::WatchStream; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + ::watch(&inner, request).await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = WatchSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.server_streaming(method, req).await; + Ok(res) + }; + Box::pin(fut) + } _ => { Box::pin(async move { Ok( diff --git a/crates/cnidarium/src/gen/penumbra.cnidarium.v1alpha1.serde.rs b/crates/cnidarium/src/gen/penumbra.cnidarium.v1alpha1.serde.rs index b762affecd..c3fb51ff5b 100644 --- a/crates/cnidarium/src/gen/penumbra.cnidarium.v1alpha1.serde.rs +++ b/crates/cnidarium/src/gen/penumbra.cnidarium.v1alpha1.serde.rs @@ -546,3 +546,502 @@ impl<'de> serde::Deserialize<'de> for PrefixValueResponse { deserializer.deserialize_struct("penumbra.cnidarium.v1alpha1.PrefixValueResponse", FIELDS, GeneratedVisitor) } } +impl serde::Serialize for WatchRequest { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let mut len = 0; + if !self.key_regex.is_empty() { + len += 1; + } + if !self.nv_key_regex.is_empty() { + len += 1; + } + let mut struct_ser = serializer.serialize_struct("penumbra.cnidarium.v1alpha1.WatchRequest", len)?; + if !self.key_regex.is_empty() { + struct_ser.serialize_field("keyRegex", &self.key_regex)?; + } + if !self.nv_key_regex.is_empty() { + struct_ser.serialize_field("nvKeyRegex", &self.nv_key_regex)?; + } + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for WatchRequest { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "key_regex", + "keyRegex", + "nv_key_regex", + "nvKeyRegex", + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + KeyRegex, + NvKeyRegex, + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "keyRegex" | "key_regex" => Ok(GeneratedField::KeyRegex), + "nvKeyRegex" | "nv_key_regex" => Ok(GeneratedField::NvKeyRegex), + _ => Err(serde::de::Error::unknown_field(value, FIELDS)), + } + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = WatchRequest; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct penumbra.cnidarium.v1alpha1.WatchRequest") + } + + fn visit_map(self, mut map_: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + let mut key_regex__ = None; + let mut nv_key_regex__ = None; + while let Some(k) = map_.next_key()? { + match k { + GeneratedField::KeyRegex => { + if key_regex__.is_some() { + return Err(serde::de::Error::duplicate_field("keyRegex")); + } + key_regex__ = Some(map_.next_value()?); + } + GeneratedField::NvKeyRegex => { + if nv_key_regex__.is_some() { + return Err(serde::de::Error::duplicate_field("nvKeyRegex")); + } + nv_key_regex__ = Some(map_.next_value()?); + } + } + } + Ok(WatchRequest { + key_regex: key_regex__.unwrap_or_default(), + nv_key_regex: nv_key_regex__.unwrap_or_default(), + }) + } + } + deserializer.deserialize_struct("penumbra.cnidarium.v1alpha1.WatchRequest", FIELDS, GeneratedVisitor) + } +} +impl serde::Serialize for WatchResponse { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let mut len = 0; + if self.version != 0 { + len += 1; + } + if self.entry.is_some() { + len += 1; + } + let mut struct_ser = serializer.serialize_struct("penumbra.cnidarium.v1alpha1.WatchResponse", len)?; + if self.version != 0 { + #[allow(clippy::needless_borrow)] + struct_ser.serialize_field("version", ToString::to_string(&self.version).as_str())?; + } + if let Some(v) = self.entry.as_ref() { + match v { + watch_response::Entry::Kv(v) => { + struct_ser.serialize_field("kv", v)?; + } + watch_response::Entry::NvKv(v) => { + struct_ser.serialize_field("nvKv", v)?; + } + } + } + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for WatchResponse { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "version", + "kv", + "nv_kv", + "nvKv", + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + Version, + Kv, + NvKv, + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "version" => Ok(GeneratedField::Version), + "kv" => Ok(GeneratedField::Kv), + "nvKv" | "nv_kv" => Ok(GeneratedField::NvKv), + _ => Err(serde::de::Error::unknown_field(value, FIELDS)), + } + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = WatchResponse; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct penumbra.cnidarium.v1alpha1.WatchResponse") + } + + fn visit_map(self, mut map_: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + let mut version__ = None; + let mut entry__ = None; + while let Some(k) = map_.next_key()? { + match k { + GeneratedField::Version => { + if version__.is_some() { + return Err(serde::de::Error::duplicate_field("version")); + } + version__ = + Some(map_.next_value::<::pbjson::private::NumberDeserialize<_>>()?.0) + ; + } + GeneratedField::Kv => { + if entry__.is_some() { + return Err(serde::de::Error::duplicate_field("kv")); + } + entry__ = map_.next_value::<::std::option::Option<_>>()?.map(watch_response::Entry::Kv) +; + } + GeneratedField::NvKv => { + if entry__.is_some() { + return Err(serde::de::Error::duplicate_field("nvKv")); + } + entry__ = map_.next_value::<::std::option::Option<_>>()?.map(watch_response::Entry::NvKv) +; + } + } + } + Ok(WatchResponse { + version: version__.unwrap_or_default(), + entry: entry__, + }) + } + } + deserializer.deserialize_struct("penumbra.cnidarium.v1alpha1.WatchResponse", FIELDS, GeneratedVisitor) + } +} +impl serde::Serialize for watch_response::KeyValue { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let mut len = 0; + if !self.key.is_empty() { + len += 1; + } + if !self.value.is_empty() { + len += 1; + } + if self.deleted { + len += 1; + } + let mut struct_ser = serializer.serialize_struct("penumbra.cnidarium.v1alpha1.WatchResponse.KeyValue", len)?; + if !self.key.is_empty() { + struct_ser.serialize_field("key", &self.key)?; + } + if !self.value.is_empty() { + #[allow(clippy::needless_borrow)] + struct_ser.serialize_field("value", pbjson::private::base64::encode(&self.value).as_str())?; + } + if self.deleted { + struct_ser.serialize_field("deleted", &self.deleted)?; + } + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for watch_response::KeyValue { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "key", + "value", + "deleted", + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + Key, + Value, + Deleted, + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "key" => Ok(GeneratedField::Key), + "value" => Ok(GeneratedField::Value), + "deleted" => Ok(GeneratedField::Deleted), + _ => Err(serde::de::Error::unknown_field(value, FIELDS)), + } + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = watch_response::KeyValue; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct penumbra.cnidarium.v1alpha1.WatchResponse.KeyValue") + } + + fn visit_map(self, mut map_: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + let mut key__ = None; + let mut value__ = None; + let mut deleted__ = None; + while let Some(k) = map_.next_key()? { + match k { + GeneratedField::Key => { + if key__.is_some() { + return Err(serde::de::Error::duplicate_field("key")); + } + key__ = Some(map_.next_value()?); + } + GeneratedField::Value => { + if value__.is_some() { + return Err(serde::de::Error::duplicate_field("value")); + } + value__ = + Some(map_.next_value::<::pbjson::private::BytesDeserialize<_>>()?.0) + ; + } + GeneratedField::Deleted => { + if deleted__.is_some() { + return Err(serde::de::Error::duplicate_field("deleted")); + } + deleted__ = Some(map_.next_value()?); + } + } + } + Ok(watch_response::KeyValue { + key: key__.unwrap_or_default(), + value: value__.unwrap_or_default(), + deleted: deleted__.unwrap_or_default(), + }) + } + } + deserializer.deserialize_struct("penumbra.cnidarium.v1alpha1.WatchResponse.KeyValue", FIELDS, GeneratedVisitor) + } +} +impl serde::Serialize for watch_response::NvKeyValue { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let mut len = 0; + if !self.key.is_empty() { + len += 1; + } + if !self.value.is_empty() { + len += 1; + } + if self.deleted { + len += 1; + } + let mut struct_ser = serializer.serialize_struct("penumbra.cnidarium.v1alpha1.WatchResponse.NvKeyValue", len)?; + if !self.key.is_empty() { + #[allow(clippy::needless_borrow)] + struct_ser.serialize_field("key", pbjson::private::base64::encode(&self.key).as_str())?; + } + if !self.value.is_empty() { + #[allow(clippy::needless_borrow)] + struct_ser.serialize_field("value", pbjson::private::base64::encode(&self.value).as_str())?; + } + if self.deleted { + struct_ser.serialize_field("deleted", &self.deleted)?; + } + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for watch_response::NvKeyValue { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "key", + "value", + "deleted", + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + Key, + Value, + Deleted, + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "key" => Ok(GeneratedField::Key), + "value" => Ok(GeneratedField::Value), + "deleted" => Ok(GeneratedField::Deleted), + _ => Err(serde::de::Error::unknown_field(value, FIELDS)), + } + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = watch_response::NvKeyValue; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct penumbra.cnidarium.v1alpha1.WatchResponse.NvKeyValue") + } + + fn visit_map(self, mut map_: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + let mut key__ = None; + let mut value__ = None; + let mut deleted__ = None; + while let Some(k) = map_.next_key()? { + match k { + GeneratedField::Key => { + if key__.is_some() { + return Err(serde::de::Error::duplicate_field("key")); + } + key__ = + Some(map_.next_value::<::pbjson::private::BytesDeserialize<_>>()?.0) + ; + } + GeneratedField::Value => { + if value__.is_some() { + return Err(serde::de::Error::duplicate_field("value")); + } + value__ = + Some(map_.next_value::<::pbjson::private::BytesDeserialize<_>>()?.0) + ; + } + GeneratedField::Deleted => { + if deleted__.is_some() { + return Err(serde::de::Error::duplicate_field("deleted")); + } + deleted__ = Some(map_.next_value()?); + } + } + } + Ok(watch_response::NvKeyValue { + key: key__.unwrap_or_default(), + value: value__.unwrap_or_default(), + deleted: deleted__.unwrap_or_default(), + }) + } + } + deserializer.deserialize_struct("penumbra.cnidarium.v1alpha1.WatchResponse.NvKeyValue", FIELDS, GeneratedVisitor) + } +} diff --git a/crates/cnidarium/src/gen/proto_descriptor.bin.no_lfs b/crates/cnidarium/src/gen/proto_descriptor.bin.no_lfs index 5f11bb6b3b..75fa7cbc00 100644 Binary files a/crates/cnidarium/src/gen/proto_descriptor.bin.no_lfs and b/crates/cnidarium/src/gen/proto_descriptor.bin.no_lfs differ diff --git a/crates/cnidarium/src/rpc.rs b/crates/cnidarium/src/rpc.rs index aab2097acb..b348cf60a6 100644 --- a/crates/cnidarium/src/rpc.rs +++ b/crates/cnidarium/src/rpc.rs @@ -23,14 +23,17 @@ use std::pin::Pin; use crate::read::StateRead; use crate::rpc::proto::v1alpha1::{ - key_value_response::Value, query_service_server::QueryService, KeyValueRequest, - KeyValueResponse, PrefixValueRequest, PrefixValueResponse, + key_value_response::Value, query_service_server::QueryService, watch_response as wr, + KeyValueRequest, KeyValueResponse, PrefixValueRequest, PrefixValueResponse, WatchRequest, + WatchResponse, }; use futures::{StreamExt, TryStreamExt}; +use tokio_stream::wrappers::ReceiverStream; use tonic::Status; use tracing::instrument; use crate::Storage; + #[tonic::async_trait] impl QueryService for Server { #[instrument(skip(self, request))] @@ -105,4 +108,84 @@ impl QueryService for Server { .boxed(), )) } + + type WatchStream = ReceiverStream>; + + #[instrument(skip(self, request))] + async fn watch( + &self, + request: tonic::Request, + ) -> Result, Status> { + let request = request.into_inner(); + tracing::debug!(?request); + + const MAX_REGEX_LEN: usize = 1024; + + let key_regex = regex::RegexBuilder::new(&request.key_regex) + .size_limit(MAX_REGEX_LEN) + .build() + .map_err(|e| Status::invalid_argument(format!("invalid key_regex: {}", e)))?; + + // Use the `bytes` regex to allow matching byte strings. + let nv_key_regex = regex::bytes::RegexBuilder::new(&request.key_regex) + .size_limit(MAX_REGEX_LEN) + .unicode(false) + .build() + .map_err(|e| Status::invalid_argument(format!("invalid nv_key_regex: {}", e)))?; + + let (tx, rx) = tokio::sync::mpsc::channel::>(10); + + tokio::spawn(watch_changes( + self.storage.clone(), + key_regex, + nv_key_regex, + tx, + )); + + Ok(tonic::Response::new(ReceiverStream::new(rx))) + } +} + +async fn watch_changes( + storage: Storage, + key_regex: regex::Regex, + nv_key_regex: regex::bytes::Regex, + tx: tokio::sync::mpsc::Sender>, +) -> anyhow::Result<()> { + let mut changes_rx = storage.subscribe_changes(); + loop { + // Wait for a new set of changes, reporting an error if we don't get one. + if let Err(e) = changes_rx.changed().await { + tx.send(Err(tonic::Status::internal(e.to_string()))).await?; + } + let (version, changes) = changes_rx.borrow_and_update().clone(); + + for (key, value) in changes.unwritten_changes().iter() { + if key_regex.is_match(key) { + tx.send(Ok(WatchResponse { + version, + entry: Some(wr::Entry::Kv(wr::KeyValue { + key: key.clone(), + value: value.as_ref().cloned().unwrap_or_default(), + deleted: value.is_none(), + })), + })) + .await?; + } + } + + for (key, value) in changes.nonverifiable_changes().iter() { + if nv_key_regex.is_match(key) { + tx.send(Ok(WatchResponse { + version, + entry: Some(wr::Entry::NvKv(wr::NvKeyValue { + key: key.clone(), + value: value.as_ref().cloned().unwrap_or_default(), + deleted: value.is_none(), + })), + })) + .await?; + } + } + } } diff --git a/crates/cnidarium/src/storage.rs b/crates/cnidarium/src/storage.rs index 71ab6e8e07..12450e5af6 100644 --- a/crates/cnidarium/src/storage.rs +++ b/crates/cnidarium/src/storage.rs @@ -35,8 +35,9 @@ impl std::fmt::Debug for Storage { // A private inner element to prevent the `TreeWriter` implementation // from leaking outside of this crate. struct Inner { - tx_dispatcher: watch::Sender, - tx_state: Arc>, + dispatcher_tx: watch::Sender<(Snapshot, (jmt::Version, Arc))>, + snapshot_rx: watch::Receiver, + changes_rx: watch::Receiver<(jmt::Version, Arc)>, snapshots: RwLock, multistore_config: MultistoreConfig, #[allow(dead_code)] @@ -187,29 +188,32 @@ impl Storage { // Setup a dispatcher task that acts as an intermediary between the storage // and the rest of the system. Its purpose is to forward new snapshots to // subscribers. + // // If we were to send snapshots directly to subscribers, a slow subscriber could // hold a lock on the watch channel for too long, and block the consensus-critical // commit logic, which needs to acquire a write lock on the watch channel. - // dispatcher channel (internal): - // - `tx_dispatcher` is used by storage to signal that a new snapshot is available. - // - `rx_dispatcher` is used by the dispatcher to receive new snapshots. - // snapshot channel (external): - // - `tx_state` is used by the dispatcher to signal new snapshots to the rest of the system. - // - `rx_state` is used by various components to subscribe to new snapshots. - let (tx_state, _) = watch::channel(latest_snapshot.clone()); - let (tx_dispatcher, mut rx_dispatcher) = watch::channel(latest_snapshot); - - let tx_state = Arc::new(tx_state); - let tx_state2 = tx_state.clone(); + // + // Instead, we "proxy" through a dispatcher task that copies values from one + // channel to the other, ensuring that if an API consumer misuses the watch + // channels, it will only affect other subscribers, not the commit logic. + + let (snapshot_tx, snapshot_rx) = watch::channel(latest_snapshot.clone()); + // Note: this will never be seen by consumers, since we mark the current value as seen + // before returning the receiver. + let dummy_cache = (u64::MAX, Arc::new(Cache::default())); + let (changes_tx, changes_rx) = watch::channel(dummy_cache.clone()); + let (tx_dispatcher, mut rx_dispatcher) = watch::channel((latest_snapshot, dummy_cache)); + let jh_dispatcher = tokio::spawn(async move { tracing::info!("snapshot dispatcher task has started"); // If the sender is dropped, the task will terminate. while rx_dispatcher.changed().await.is_ok() { tracing::debug!("dispatcher has received a new snapshot"); - let snapshot = rx_dispatcher.borrow_and_update().clone(); + let (snapshot, changes) = rx_dispatcher.borrow_and_update().clone(); // [`watch::Sender::send`] only returns an error if there are no // receivers, so we can safely ignore the result here. - let _ = tx_state2.send(snapshot); + let _ = snapshot_tx.send(snapshot); + let _ = changes_tx.send(changes); } tracing::info!("dispatcher task has terminated") }); @@ -219,8 +223,9 @@ impl Storage { // the task will stop when the sender is dropped. However, certain // test scenarios require us to wait that all resources are released. jh_dispatcher: Some(jh_dispatcher), - tx_dispatcher, - tx_state, + dispatcher_tx: tx_dispatcher, + snapshot_rx, + changes_rx, multistore_config, snapshots, db: shared_db, @@ -240,10 +245,20 @@ impl Storage { /// Returns a [`watch::Receiver`] that can be used to subscribe to new state versions. pub fn subscribe(&self) -> watch::Receiver { - // Calling subscribe() here to create a new receiver ensures - // that all previous values are marked as seen, and the user - // of the receiver will only be notified of *subsequent* values. - self.0.tx_state.subscribe() + let mut rx = self.0.snapshot_rx.clone(); + // Mark the current value as seen, so that the user of the receiver + // will only be notified of *subsequent* values. + rx.borrow_and_update(); + rx + } + + /// Returns a [`watch::Receiver`] that can be used to subscribe to state changes. + pub fn subscribe_changes(&self) -> watch::Receiver<(jmt::Version, Arc)> { + let mut rx = self.0.changes_rx.clone(); + // Mark the current value as seen, so that the user of the receiver + // will only be notified of *subsequent* values. + rx.borrow_and_update(); + rx } /// Returns a new [`Snapshot`] on top of the latest version of the tree. @@ -291,6 +306,9 @@ impl Storage { perform_migration: bool, ) -> Result { tracing::debug!(new_jmt_version = ?version, "committing state delta"); + // Save a copy of the changes to send to subscribers later. + let changes = Arc::new(cache.clone_changes()); + let mut changes_by_substore = cache.shard_by_prefix(&self.0.multistore_config); let mut substore_roots = Vec::new(); let mut multistore_versions = @@ -443,7 +461,10 @@ impl Storage { // Send fails if the channel is closed (i.e., if there are no receivers); // in this case, we should ignore the error, we have no one to notify. - let _ = self.0.tx_dispatcher.send(latest_snapshot); + let _ = self + .0 + .dispatcher_tx + .send((latest_snapshot, (version, changes))); Ok(global_root_hash) } diff --git a/crates/core/app/Cargo.toml b/crates/core/app/Cargo.toml index be776bfd3a..94647ce6f2 100644 --- a/crates/core/app/Cargo.toml +++ b/crates/core/app/Cargo.toml @@ -14,6 +14,7 @@ penumbra-tct = { path = "../../crypto/tct" } penumbra-proof-params = { path = "../../crypto/proof-params" } penumbra-asset = { path = "../asset" } penumbra-keys = { path = "../keys" } +penumbra-txhash = { path = "../txhash" } penumbra-num = { path = "../num" } penumbra-chain = { path = "../component/chain", features = ["component"] } penumbra-shielded-pool = { path = "../component/shielded-pool", features = [ @@ -23,7 +24,7 @@ penumbra-stake = { path = "../component/stake" } penumbra-governance = { path = "../component/governance" } penumbra-sct = { path = "../component/sct" } penumbra-fee = { path = "../component/fee" } -penumbra-dao = { path = "../component/dao" } +penumbra-community-pool = { path = "../component/community-pool" } penumbra-dex = { path = "../component/dex" } penumbra-ibc = { path = "../component/ibc", features = ["component"] } penumbra-distributions = { path = "../component/distributions" } @@ -65,8 +66,8 @@ parking_lot = "0.12" tendermint = "0.34.0" tendermint-proto = "0.34.0" tendermint-light-client-verifier = "0.34.0" -ibc-types = { version = "0.10.0", default-features = false } -ibc-proto = { version = "0.39.0", default-features = false, features = [ +ibc-types = { version = "0.11.0", default-features = false } +ibc-proto = { version = "0.40.0", default-features = false, features = [ "server", ] } diff --git a/crates/core/app/src/action_handler/actions.rs b/crates/core/app/src/action_handler/actions.rs index 9970cf1eab..d7d2b48ef0 100644 --- a/crates/core/app/src/action_handler/actions.rs +++ b/crates/core/app/src/action_handler/actions.rs @@ -3,10 +3,10 @@ use std::sync::Arc; use anyhow::Result; use async_trait::async_trait; use cnidarium::{StateRead, StateWrite}; -use penumbra_chain::TransactionContext; use penumbra_ibc::component::StateReadExt as _; use penumbra_shielded_pool::component::Ics20Transfer; use penumbra_transaction::Action; +use penumbra_txhash::TransactionContext; mod submit; @@ -48,9 +48,9 @@ impl ActionHandler for Action { .await } Action::Ics20Withdrawal(action) => action.check_stateless(()).await, - Action::DaoSpend(action) => action.check_stateless(()).await, - Action::DaoOutput(action) => action.check_stateless(()).await, - Action::DaoDeposit(action) => action.check_stateless(()).await, + Action::CommunityPoolSpend(action) => action.check_stateless(()).await, + Action::CommunityPoolOutput(action) => action.check_stateless(()).await, + Action::CommunityPoolDeposit(action) => action.check_stateless(()).await, } } @@ -85,9 +85,9 @@ impl ActionHandler for Action { .await } Action::Ics20Withdrawal(action) => action.check_stateful(state).await, - Action::DaoSpend(action) => action.check_stateful(state).await, - Action::DaoOutput(action) => action.check_stateful(state).await, - Action::DaoDeposit(action) => action.check_stateful(state).await, + Action::CommunityPoolSpend(action) => action.check_stateful(state).await, + Action::CommunityPoolOutput(action) => action.check_stateful(state).await, + Action::CommunityPoolDeposit(action) => action.check_stateful(state).await, } } @@ -120,9 +120,9 @@ impl ActionHandler for Action { .await } Action::Ics20Withdrawal(action) => action.execute(state).await, - Action::DaoSpend(action) => action.execute(state).await, - Action::DaoOutput(action) => action.execute(state).await, - Action::DaoDeposit(action) => action.execute(state).await, + Action::CommunityPoolSpend(action) => action.execute(state).await, + Action::CommunityPoolOutput(action) => action.execute(state).await, + Action::CommunityPoolDeposit(action) => action.execute(state).await, } } } diff --git a/crates/core/app/src/action_handler/actions/submit.rs b/crates/core/app/src/action_handler/actions/submit.rs index 08db4e98f5..39f8beeac0 100644 --- a/crates/core/app/src/action_handler/actions/submit.rs +++ b/crates/core/app/src/action_handler/actions/submit.rs @@ -1,3 +1,4 @@ +use std::str::FromStr; use std::sync::Arc; use anyhow::{Context, Result}; @@ -6,10 +7,12 @@ use async_trait::async_trait; use cnidarium::{StateDelta, StateRead, StateWrite}; use decaf377::Fq; use decaf377_rdsa::{VerificationKey, VerificationKeyBytes}; +use ibc_types::core::client::ClientId; use once_cell::sync::Lazy; use penumbra_asset::STAKING_TOKEN_DENOM; use penumbra_chain::component::StateReadExt as _; -use penumbra_dao::component::StateReadExt as _; +use penumbra_community_pool::component::StateReadExt as _; +use penumbra_ibc::component::ClientStateReadExt; use penumbra_keys::keys::{FullViewingKey, NullifierKey}; use penumbra_proto::DomainType; use penumbra_sct::component::StateReadExt as _; @@ -20,7 +23,7 @@ use penumbra_transaction::Transaction; use penumbra_transaction::{AuthorizationData, WitnessData}; use crate::action_handler::ActionHandler; -use crate::dao_ext::DaoStateWriteExt; +use crate::community_pool_ext::CommunityPoolStateWriteExt; use crate::params::AppParameters; use penumbra_governance::{ component::{StateReadExt as _, StateWriteExt as _}, @@ -86,9 +89,9 @@ impl ActionHandler for ProposalSubmit { .check_valid_update(&new_app_params) .context("invalid change to app parameters")?; } - DaoSpend { transaction_plan } => { + CommunityPoolSpend { transaction_plan } => { // Check to make sure that the transaction plan contains only valid actions for the - // DAO (none of them should require proving to build): + // Community Pool (none of them should require proving to build): use penumbra_transaction::plan::ActionPlan::*; let parsed_transaction_plan = TransactionPlan::decode(&transaction_plan[..]) @@ -98,22 +101,22 @@ impl ActionHandler for ProposalSubmit { match action { Spend(_) | Output(_) | Swap(_) | SwapClaim(_) | DelegatorVote(_) | UndelegateClaim(_) => { - // These actions all require proving, so they are banned from DAO spend + // These actions all require proving, so they are banned from Community Pool spend // proposals to prevent DoS attacks. anyhow::bail!( - "invalid action in DAO spend proposal (would require proving)" + "invalid action in Community Pool spend proposal (would require proving)" ) } Delegate(_) | Undelegate(_) => { // Delegation and undelegation is disallowed due to Undelegateclaim requiring proving. anyhow::bail!( - "invalid action in DAO spend proposal (can't claim outputs of undelegation)" + "invalid action in Community Pool spend proposal (can't claim outputs of undelegation)" ) } ProposalSubmit(_) | ProposalWithdraw(_) | ProposalDepositClaim(_) => { - // These actions manipulate proposals, so they are banned from DAO spend + // These actions manipulate proposals, so they are banned from Community Pool spend // actions because they could cause recursion. - anyhow::bail!("invalid action in DAO spend proposal (not allowed to manipulate proposals from within proposals)") + anyhow::bail!("invalid action in Community Pool spend proposal (not allowed to manipulate proposals from within proposals)") } ValidatorDefinition(_) | IbcAction(_) @@ -122,17 +125,25 @@ impl ActionHandler for ProposalSubmit { | PositionClose(_) | PositionWithdraw(_) | PositionRewardClaim(_) - | DaoSpend(_) - | DaoOutput(_) + | CommunityPoolSpend(_) + | CommunityPoolOutput(_) | Withdrawal(_) - | DaoDeposit(_) => { - // These actions are all valid for DAO spend proposals, because they + | CommunityPoolDeposit(_) => { + // These actions are all valid for Community Pool spend proposals, because they // don't require proving, so they don't represent a DoS vector. } } } } UpgradePlan { .. } => {} + FreezeIbcClient { client_id } => { + let _ = &ClientId::from_str(client_id) + .context("can't decode client id from IBC proposal")?; + } + UnfreezeIbcClient { client_id } => { + let _ = &ClientId::from_str(client_id) + .context("can't decode client id from IBC proposal")?; + } } Ok(()) @@ -172,12 +183,12 @@ impl ActionHandler for ProposalSubmit { ProposalPayload::ParameterChange { .. } => { /* no stateful checks for parameter change (checks are applied when proposal finishes) */ } - ProposalPayload::DaoSpend { transaction_plan } => { - // If DAO spend proposals aren't enabled, then we can't allow them to be submitted - let dao_parameters = state.get_dao_params().await?; + ProposalPayload::CommunityPoolSpend { transaction_plan } => { + // If Community Pool spend proposals aren't enabled, then we can't allow them to be submitted + let community_pool_parameters = state.get_community_pool_params().await?; anyhow::ensure!( - dao_parameters.dao_spend_proposals_enabled, - "DAO spend proposals are not enabled", + community_pool_parameters.community_pool_spend_proposals_enabled, + "Community Pool spend proposals are not enabled", ); // Check that the transaction plan can be built without any witness or auth data and @@ -187,22 +198,38 @@ impl ActionHandler for ProposalSubmit { // obviously going to fail to execute. let parsed_transaction_plan = TransactionPlan::decode(&transaction_plan[..]) .context("transaction plan was malformed")?; - let tx = build_dao_transaction(parsed_transaction_plan.clone()) - .await - .context("failed to build submitted DAO spend transaction plan")?; - tx.check_stateless(()) + let tx = build_community_pool_transaction(parsed_transaction_plan.clone()) .await - .context("submitted DAO spend transaction failed stateless checks")?; + .context("failed to build submitted Community Pool spend transaction plan")?; + tx.check_stateless(()).await.context( + "submitted Community Pool spend transaction failed stateless checks", + )?; tx.check_stateful(state.clone()) .await - .context("submitted DAO spend transaction failed stateful checks")?; + .context("submitted Community Pool spend transaction failed stateful checks")?; tx.execute(StateDelta::new(state)).await.context( - "submitted DAO spend transaction failed to execute in current chain state", + "submitted Community Pool spend transaction failed to execute in current chain state", )?; } ProposalPayload::UpgradePlan { .. } => { // TODO(erwan): no stateful checks for upgrade plan. } + ProposalPayload::FreezeIbcClient { client_id } => { + // Check that the client ID is valid and that there is a corresponding + // client state. If the client state is already frozen, then freezing it + // is a no-op. + let client_id = &ClientId::from_str(client_id) + .map_err(|e| tonic::Status::aborted(format!("invalid client id: {e}")))?; + let _ = state.get_client_state(client_id).await?; + } + ProposalPayload::UnfreezeIbcClient { client_id } => { + // Check that the client ID is valid and that there is a corresponding + // client state. If the client state is not frozen, then unfreezing it + // is a no-op. + let client_id = &ClientId::from_str(client_id) + .map_err(|e| tonic::Status::aborted(format!("invalid client id: {e}")))?; + let _ = state.get_client_state(client_id).await?; + } } Ok(()) @@ -214,19 +241,19 @@ impl ActionHandler for ProposalSubmit { deposit_amount, } = self; - // If the proposal is a DAO spend proposal, we've already built it, but we need to build it + // If the proposal is a Community Pool spend proposal, we've already built it, but we need to build it // again because we can't remember anything from `check_tx_stateful` to `execute`: - if let ProposalPayload::DaoSpend { transaction_plan } = &proposal.payload { + if let ProposalPayload::CommunityPoolSpend { transaction_plan } = &proposal.payload { // Build the transaction again (this time we know it will succeed because it built and // passed all checks in `check_tx_stateful`): let parsed_transaction_plan = TransactionPlan::decode(&transaction_plan[..]) .context("transaction plan was malformed")?; - let tx = build_dao_transaction(parsed_transaction_plan.clone()) + let tx = build_community_pool_transaction(parsed_transaction_plan.clone()) .await - .context("failed to build submitted DAO spend transaction plan in execute step")?; + .context("failed to build submitted Community Pool spend transaction plan in execute step")?; // Cache the built transaction in the state so we can use it later, without rebuilding: - state.put_dao_transaction(proposal.id, tx); + state.put_community_pool_transaction(proposal.id, tx); } // Store the contents of the proposal and generate a fresh proposal id for it @@ -285,20 +312,20 @@ impl ActionHandler for ProposalSubmit { } } -/// The full viewing key used to construct transactions made by the Penumbra DAO. +/// The full viewing key used to construct transactions made by the Penumbra Community Pool. /// /// This full viewing key does not correspond to any known spend key; it is constructed from the /// hashes of two arbitrary strings. -static DAO_FULL_VIEWING_KEY: Lazy = Lazy::new(|| { +static COMMUNITY_POOL_FULL_VIEWING_KEY: Lazy = Lazy::new(|| { // We start with two different personalization strings for the hash function: - let ak_personalization = b"Penumbra_DAO_ak"; - let nk_personalization = b"Penumbra_DAO_nk"; + let ak_personalization = b"Penumbra_CP_ak"; + let nk_personalization = b"Penumbra_CP_nk"; // We pick two different arbitrary strings to hash: let ak_hash_input = - b"This hash input is used to form the `ak` component of the Penumbra DAO's full viewing key."; + b"This hash input is used to form the `ak` component of the Penumbra Community Pool's full viewing key."; let nk_hash_input = - b"This hash input is used to form the `nk` component of the Penumbra DAO's full viewing key."; + b"This hash input is used to form the `nk` component of the Penumbra Community Pool's full viewing key."; // We hash the two strings using their respective personalizations: let ak_hash = blake2b_simd::Params::new() @@ -314,7 +341,7 @@ static DAO_FULL_VIEWING_KEY: Lazy = Lazy::new(|| { .vartime_compress() .0, )) - .expect("penumbra DAO FVK's `ak` must be a valid verification key by construction"); + .expect("penumbra Community Pool FVK's `ak` must be a valid verification key by construction"); // We construct the `nk` component of the full viewing key from the hash of the second string: let nk = NullifierKey(Fq::from_le_bytes_mod_order(nk_hash.as_bytes())); @@ -323,10 +350,12 @@ static DAO_FULL_VIEWING_KEY: Lazy = Lazy::new(|| { FullViewingKey::from_components(ak, nk) }); -async fn build_dao_transaction(transaction_plan: TransactionPlan) -> Result { - let effect_hash = transaction_plan.effect_hash(&DAO_FULL_VIEWING_KEY); +async fn build_community_pool_transaction( + transaction_plan: TransactionPlan, +) -> Result { + let effect_hash = transaction_plan.effect_hash(&COMMUNITY_POOL_FULL_VIEWING_KEY)?; transaction_plan.build( - &DAO_FULL_VIEWING_KEY, + &COMMUNITY_POOL_FULL_VIEWING_KEY, &WitnessData { anchor: penumbra_tct::Tree::new().root(), state_commitment_proofs: Default::default(), @@ -341,9 +370,9 @@ async fn build_dao_transaction(transaction_plan: TransactionPlan) -> Result( let transaction_base_price = current_gas_prices.price(&transaction.gas_cost()); - if transaction.transaction_body().fee.amount() >= transaction_base_price { + if transaction + .transaction_body() + .transaction_parameters + .fee + .amount() + >= transaction_base_price + { Ok(()) } else { Err(anyhow::anyhow!( diff --git a/crates/core/app/src/action_handler/transaction/stateless.rs b/crates/core/app/src/action_handler/transaction/stateless.rs index 1726017b04..282559a9ea 100644 --- a/crates/core/app/src/action_handler/transaction/stateless.rs +++ b/crates/core/app/src/action_handler/transaction/stateless.rs @@ -1,7 +1,8 @@ use std::collections::{BTreeMap, BTreeSet}; use anyhow::{Context, Result}; -use penumbra_transaction::{AuthorizingData, Transaction}; +use penumbra_transaction::Transaction; +use penumbra_txhash::AuthorizingData; #[tracing::instrument(skip(tx))] pub(super) fn valid_binding_signature(tx: &Transaction) -> Result<()> { diff --git a/crates/core/app/src/app/mod.rs b/crates/core/app/src/app/mod.rs index 0c67f1cae5..042a51dbef 100644 --- a/crates/core/app/src/app/mod.rs +++ b/crates/core/app/src/app/mod.rs @@ -7,9 +7,9 @@ use cnidarium_component::Component; use jmt::RootHash; use penumbra_chain::component::{StateReadExt as _, StateWriteExt as _}; use penumbra_chain::params::FmdParameters; +use penumbra_community_pool::component::StateWriteExt as _; +use penumbra_community_pool::StateReadExt as _; use penumbra_compact_block::component::CompactBlockManager; -use penumbra_dao::component::StateWriteExt as _; -use penumbra_dao::StateReadExt as _; use penumbra_dex::component::Dex; use penumbra_distributions::component::{Distributions, StateReadExt as _, StateWriteExt as _}; use penumbra_fee::component::{Fee, StateReadExt as _, StateWriteExt as _}; @@ -30,7 +30,7 @@ use tracing::Instrument; use crate::action_handler::ActionHandler; use crate::params::AppParameters; use crate::state_delta_wrapper::ArcStateDeltaWrapper; -use crate::{genesis, DaoStateReadExt}; +use crate::{genesis, CommunityPoolStateReadExt}; pub mod state_key; @@ -97,7 +97,12 @@ impl App { // TODO: should the components themselves handle this in their // `init_chain` methods? state_tx.put_chain_params(app_state.chain_content.chain_params.clone()); - state_tx.put_dao_params(app_state.dao_content.dao_params.clone()); + state_tx.put_community_pool_params( + app_state + .community_pool_content + .community_pool_params + .clone(), + ); state_tx.put_stake_params(app_state.stake_content.stake_params.clone()); state_tx .put_governance_params(app_state.governance_content.governance_params.clone()); @@ -192,8 +197,8 @@ impl App { if let Some(chain_params) = app_params.new.chain_params { state_tx.put_chain_params(chain_params); } - if let Some(dao_params) = app_params.new.dao_params { - state_tx.put_dao_params(dao_params); + if let Some(community_pool_params) = app_params.new.community_pool_params { + state_tx.put_community_pool_params(community_pool_params); } if let Some(ibc_params) = app_params.new.ibc_params { state_tx.put_ibc_params(ibc_params); @@ -222,30 +227,30 @@ impl App { .expect("components did not retain copies of shared state"); // Apply the state from `begin_block` and return the events (we'll append to them if - // necessary based on the results of applying the DAO transactions queued) + // necessary based on the results of applying the Community Pool transactions queued) let mut events = self.apply(state_tx); - // Deliver DAO transactions here, before any other block processing (effectively adding + // Deliver Community Pool transactions here, before any other block processing (effectively adding // synthetic transactions slotted in after the start of the block but before any user // transactions) let pending_transactions = self .state - .pending_dao_transactions() + .pending_community_pool_transactions() .await - .expect("DAO transactions should always be readable"); + .expect("Community Pool transactions should always be readable"); for transaction in pending_transactions { - // NOTE: We are *intentionally* using `deliver_tx_allowing_dao_spends` here, rather than - // `deliver_tx`, because here is the **ONLY** place we want to permit DAO spends, when + // NOTE: We are *intentionally* using `deliver_tx_allowing_community_pool_spends` here, rather than + // `deliver_tx`, because here is the **ONLY** place we want to permit Community Pool spends, when // delivering transactions that have been scheduled by the chain itself for delivery. - tracing::info!(?transaction, "delivering DAO transaction"); + tracing::info!(?transaction, "delivering Community Pool transaction"); match self - .deliver_tx_allowing_dao_spends(Arc::new(transaction)) + .deliver_tx_allowing_community_pool_spends(Arc::new(transaction)) .await { Err(error) => { - tracing::warn!(?error, "failed to deliver DAO transaction"); + tracing::warn!(?error, "failed to deliver Community Pool transaction"); } - Ok(dao_tx_events) => events.extend(dao_tx_events), + Ok(community_pool_tx_events) => events.extend(community_pool_tx_events), } } @@ -260,22 +265,22 @@ impl App { pub async fn deliver_tx(&mut self, tx: Arc) -> Result> { // Ensure that any normally-delivered transaction (originating from a user) does not contain - // any DAO spends or outputs; the only place those are permitted is transactions originating + // any Community Pool spends or outputs; the only place those are permitted is transactions originating // from the chain itself: anyhow::ensure!( - tx.dao_spends().peekable().peek().is_none(), - "DAO spends are not permitted in user-submitted transactions" + tx.community_pool_spends().peekable().peek().is_none(), + "Community Pool spends are not permitted in user-submitted transactions" ); anyhow::ensure!( - tx.dao_outputs().peekable().peek().is_none(), - "DAO outputs are not permitted in user-submitted transactions" + tx.community_pool_outputs().peekable().peek().is_none(), + "Community Pool outputs are not permitted in user-submitted transactions" ); - // Now that we've ensured that there are not any DAO spends or outputs, we can deliver the transaction: - self.deliver_tx_allowing_dao_spends(tx).await + // Now that we've ensured that there are not any Community Pool spends or outputs, we can deliver the transaction: + self.deliver_tx_allowing_community_pool_spends(tx).await } - async fn deliver_tx_allowing_dao_spends( + async fn deliver_tx_allowing_community_pool_spends( &mut self, tx: Arc, ) -> Result> { @@ -554,7 +559,7 @@ pub trait StateReadExt: StateRead { self.fee_params_updated() || self.governance_params_updated() || self.ibc_params_updated() - || self.dao_params_updated() + || self.community_pool_params_updated() || self.stake_params_updated() || self.distributions_params_updated() || self.chain_params_updated() @@ -566,13 +571,13 @@ pub trait StateReadExt: StateRead { let stake_params = self.get_stake_params().await?; let ibc_params = self.get_ibc_params().await?; let governance_params = self.get_governance_params().await?; - let dao_params = self.get_dao_params().await?; + let community_pool_params = self.get_community_pool_params().await?; let fee_params = self.get_fee_params().await?; let distributions_params = self.get_distributions_params().await?; Ok(AppParameters { chain_params, - dao_params, + community_pool_params, distributions_params, fee_params, governance_params, @@ -606,7 +611,7 @@ impl< + penumbra_stake::StateReadExt + penumbra_governance::component::StateReadExt + penumbra_fee::component::StateReadExt - + penumbra_dao::component::StateReadExt + + penumbra_community_pool::component::StateReadExt + penumbra_chain::component::StateReadExt + penumbra_ibc::component::StateReadExt + penumbra_distributions::component::StateReadExt diff --git a/crates/core/app/src/dao_ext.rs b/crates/core/app/src/community_pool_ext.rs similarity index 62% rename from crates/core/app/src/dao_ext.rs rename to crates/core/app/src/community_pool_ext.rs index 26412bf080..153b8342eb 100644 --- a/crates/core/app/src/dao_ext.rs +++ b/crates/core/app/src/community_pool_ext.rs @@ -14,11 +14,13 @@ use penumbra_transaction::Transaction; // dependency. #[async_trait] -pub trait DaoStateReadExt: StateRead + penumbra_stake::StateReadExt { +pub trait CommunityPoolStateReadExt: StateRead + penumbra_stake::StateReadExt { /// Get all the transactions set to be delivered in this block (scheduled in last block). - async fn pending_dao_transactions(&self) -> Result> { - // Get the proposal IDs of the DAO transactions we are about to deliver. - let prefix = state_key::deliver_dao_transactions_at_height(self.get_block_height().await?); + async fn pending_community_pool_transactions(&self) -> Result> { + // Get the proposal IDs of the Community Pool transactions we are about to deliver. + let prefix = state_key::deliver_community_pool_transactions_at_height( + self.get_block_height().await?, + ); let proposals: Vec = self .prefix_proto::(&prefix) .map(|result| anyhow::Ok(result?.1)) @@ -29,7 +31,7 @@ pub trait DaoStateReadExt: StateRead + penumbra_stake::StateReadExt { let mut transactions = Vec::new(); for proposal in proposals { transactions.push( - self.get(&state_key::dao_transaction(proposal)) + self.get(&state_key::community_pool_transaction(proposal)) .await? .ok_or_else(|| { anyhow::anyhow!("no transaction found for proposal {}", proposal) @@ -40,14 +42,14 @@ pub trait DaoStateReadExt: StateRead + penumbra_stake::StateReadExt { } } -impl DaoStateReadExt for T {} +impl CommunityPoolStateReadExt for T {} #[async_trait] -pub trait DaoStateWriteExt: StateWrite { +pub trait CommunityPoolStateWriteExt: StateWrite { /// Get all the transactions set to be delivered in this block (scheduled in last block). - fn put_dao_transaction(&mut self, proposal: u64, transaction: Transaction) { - self.put(state_key::dao_transaction(proposal), transaction); + fn put_community_pool_transaction(&mut self, proposal: u64, transaction: Transaction) { + self.put(state_key::community_pool_transaction(proposal), transaction); } } -impl DaoStateWriteExt for T {} +impl CommunityPoolStateWriteExt for T {} diff --git a/crates/core/app/src/genesis/app_state.rs b/crates/core/app/src/genesis/app_state.rs index 12bc4a6d30..3e5fcc32dd 100644 --- a/crates/core/app/src/genesis/app_state.rs +++ b/crates/core/app/src/genesis/app_state.rs @@ -1,5 +1,5 @@ use penumbra_chain::genesis::Content as ChainContent; -use penumbra_dao::genesis::Content as DaoContent; +use penumbra_community_pool::genesis::Content as CommunityPoolContent; use penumbra_distributions::genesis::Content as DistributionsContent; use penumbra_fee::genesis::Content as FeeContent; use penumbra_governance::genesis::Content as GovernanceContent; @@ -33,8 +33,8 @@ pub struct Content { pub ibc_content: IBCContent, /// Chain module genesis state. pub chain_content: ChainContent, - /// DAO module genesis state. - pub dao_content: DaoContent, + /// Community Pool module genesis state. + pub community_pool_content: CommunityPoolContent, /// Fee module genesis state. pub fee_content: FeeContent, /// Distributions module genesis state. @@ -73,7 +73,7 @@ impl From for pb::GenesisContent { stake_content: Some(value.stake_content.into()), ibc_content: Some(value.ibc_content.into()), governance_content: Some(value.governance_content.into()), - dao_content: Some(value.dao_content.into()), + community_pool_content: Some(value.community_pool_content.into()), shielded_pool_content: Some(value.shielded_pool_content.into()), fee_content: Some(value.fee_content.into()), distributions_content: Some(value.distributions_content.into()), @@ -120,9 +120,9 @@ impl TryFrom for Content { .ibc_content .ok_or_else(|| anyhow::anyhow!("proto response missing ibc content"))? .try_into()?, - dao_content: msg - .dao_content - .ok_or_else(|| anyhow::anyhow!("proto response missing dao content"))? + community_pool_content: msg + .community_pool_content + .ok_or_else(|| anyhow::anyhow!("proto response missing Community Pool content"))? .try_into()?, chain_content: msg .chain_content diff --git a/crates/core/app/src/lib.rs b/crates/core/app/src/lib.rs index c0b8ea6252..05b029cb85 100644 --- a/crates/core/app/src/lib.rs +++ b/crates/core/app/src/lib.rs @@ -1,13 +1,13 @@ #![deny(clippy::unwrap_used)] mod action_handler; -mod dao_ext; +mod community_pool_ext; mod mock_client; mod state_delta_wrapper; mod temp_storage_ext; pub use action_handler::ActionHandler; pub use app::StateWriteExt; -pub use dao_ext::DaoStateReadExt; +pub use community_pool_ext::CommunityPoolStateReadExt; pub use mock_client::MockClient; pub use temp_storage_ext::TempStorageExt; diff --git a/crates/core/app/src/params.rs b/crates/core/app/src/params.rs index 0169396d8b..bacfdc2550 100644 --- a/crates/core/app/src/params.rs +++ b/crates/core/app/src/params.rs @@ -1,5 +1,5 @@ use penumbra_chain::params::ChainParameters; -use penumbra_dao::params::DaoParameters; +use penumbra_community_pool::params::CommunityPoolParameters; use penumbra_distributions::DistributionsParameters; use penumbra_fee::FeeParameters; use penumbra_governance::params::GovernanceParameters; @@ -16,7 +16,7 @@ pub mod change; #[serde(try_from = "pb::AppParameters", into = "pb::AppParameters")] pub struct AppParameters { pub chain_params: ChainParameters, - pub dao_params: DaoParameters, + pub community_pool_params: CommunityPoolParameters, pub distributions_params: DistributionsParameters, pub fee_params: FeeParameters, pub governance_params: GovernanceParameters, @@ -37,9 +37,9 @@ impl TryFrom for AppParameters { .chain_params .ok_or_else(|| anyhow::anyhow!("proto response missing chain params"))? .try_into()?, - dao_params: msg - .dao_params - .ok_or_else(|| anyhow::anyhow!("proto response missing dao params"))? + community_pool_params: msg + .community_pool_params + .ok_or_else(|| anyhow::anyhow!("proto response missing Community Pool params"))? .try_into()?, distributions_params: msg .distributions_params @@ -69,7 +69,7 @@ impl From for pb::AppParameters { fn from(params: AppParameters) -> Self { pb::AppParameters { chain_params: Some(params.chain_params.into()), - dao_params: Some(params.dao_params.into()), + community_pool_params: Some(params.community_pool_params.into()), distributions_params: Some(params.distributions_params.into()), governance_params: Some(params.governance_params.into()), ibc_params: Some(params.ibc_params.into()), diff --git a/crates/core/app/src/params/change.rs b/crates/core/app/src/params/change.rs index 2b796f26d3..dd73496b7a 100644 --- a/crates/core/app/src/params/change.rs +++ b/crates/core/app/src/params/change.rs @@ -2,7 +2,7 @@ use std::fmt::Display; use anyhow::Result; use penumbra_chain::params::{ChainParameters, Ratio}; -use penumbra_dao::params::DaoParameters; +use penumbra_community_pool::params::CommunityPoolParameters; use penumbra_distributions::params::DistributionsParameters; use penumbra_fee::FeeParameters; use penumbra_governance::{params::GovernanceParameters, proposal::ChangedAppParameters}; @@ -55,9 +55,9 @@ impl AppParameters { DistributionsParameters { staking_issuance_per_block: _, }, - dao_params: - DaoParameters { - dao_spend_proposals_enabled: _, + community_pool_params: + CommunityPoolParameters { + community_pool_spend_proposals_enabled: _, }, // IMPORTANT: Don't use `..` here! We want to ensure every single field is verified! } = self; @@ -137,9 +137,9 @@ impl AppParameters { DistributionsParameters { staking_issuance_per_block: _, }, - dao_params: - DaoParameters { - dao_spend_proposals_enabled: _, + community_pool_params: + CommunityPoolParameters { + community_pool_spend_proposals_enabled: _, }, // IMPORTANT: Don't use `..` here! We want to ensure every single field is verified! } = self; @@ -217,7 +217,7 @@ impl AppParameters { pub fn as_changed_params(&self) -> ChangedAppParameters { ChangedAppParameters { chain_params: Some(self.chain_params.clone()), - dao_params: Some(self.dao_params.clone()), + community_pool_params: Some(self.community_pool_params.clone()), distributions_params: Some(self.distributions_params.clone()), fee_params: Some(self.fee_params.clone()), governance_params: Some(self.governance_params.clone()), @@ -241,7 +241,7 @@ impl AppParameters { || new.ibc_params.is_none() || new.governance_params.is_none() || new.fee_params.is_none() - || new.dao_params.is_none() + || new.community_pool_params.is_none() || new.distributions_params.is_none()) { anyhow::bail!("all parameters must be specified if no old parameters are provided"); @@ -253,9 +253,9 @@ impl AppParameters { .chain_params .clone() }), - dao_params: new.dao_params.clone().unwrap_or_else(|| { + community_pool_params: new.community_pool_params.clone().unwrap_or_else(|| { old.expect("old should be set if new has any None values") - .dao_params + .community_pool_params .clone() }), distributions_params: new.distributions_params.clone().unwrap_or_else(|| { diff --git a/crates/core/app/src/tests/spend.rs b/crates/core/app/src/tests/spend.rs index b8aac65fba..ffd212d953 100644 --- a/crates/core/app/src/tests/spend.rs +++ b/crates/core/app/src/tests/spend.rs @@ -5,14 +5,14 @@ use cnidarium::{ArcStateDeltaExt, StateDelta, TempStorage}; use cnidarium_component::{ActionHandler as _, Component}; use decaf377_rdsa::SigningKey; use penumbra_asset::Value; -use penumbra_chain::{component::StateWriteExt, EffectHash, TransactionContext}; +use penumbra_chain::component::StateWriteExt; use penumbra_compact_block::component::CompactBlockManager; -use penumbra_fee::Fee; use penumbra_keys::{test_keys, PayloadKey}; use penumbra_num::Amount; use penumbra_sct::component::SourceContext; use penumbra_shielded_pool::{component::ShieldedPool, SpendPlan}; -use penumbra_transaction::{AuthorizingData, Transaction, TransactionBody, TransactionParameters}; +use penumbra_transaction::{Transaction, TransactionBody, TransactionParameters}; +use penumbra_txhash::{AuthorizingData, EffectHash, TransactionContext}; use rand_core::SeedableRng; use tendermint::abci; @@ -249,7 +249,6 @@ async fn spend_duplicate_nullifier_same_transaction() { penumbra_transaction::Action::Output(output), ], transaction_parameters: TransactionParameters::default(), - fee: Fee::from_staking_token_amount(0u64.into()), detection_data: None, memo: None, }; diff --git a/crates/core/component/chain/Cargo.toml b/crates/core/component/chain/Cargo.toml index 39cd84eb9e..d9d969f237 100644 --- a/crates/core/component/chain/Cargo.toml +++ b/crates/core/component/chain/Cargo.toml @@ -11,13 +11,14 @@ penumbra-asset = { path = "../../../core/asset", default-features = false } penumbra-proto = { path = "../../../proto", default-features = false } penumbra-tct = { path = "../../../crypto/tct" } penumbra-keys = { path = "../../../core/keys", default-features = false } +penumbra-txhash = { path = "../../../core/txhash", default-features = false } penumbra-num = { path = "../../../core/num", default-features = false } # Penumbra dependencies decaf377 = "0.5" tendermint = "0.34.0" -ibc-types = { version = "0.10.0", default-features = false } +ibc-types = { version = "0.11.0", default-features = false } ics23 = "0.11.0" # Crates.io deps diff --git a/crates/core/component/chain/src/effect_hash.rs b/crates/core/component/chain/src/effect_hash.rs deleted file mode 100644 index 10465111be..0000000000 --- a/crates/core/component/chain/src/effect_hash.rs +++ /dev/null @@ -1,64 +0,0 @@ -use penumbra_proto::{penumbra::core::transaction::v1alpha1 as pb_transaction, DomainType}; - -/// Something that can be hashed to produce an [`EffectHash`]. -pub trait EffectingData { - fn effect_hash(&self) -> EffectHash; -} - -/// A hash of a transaction's _effecting data_, describing its effects on the -/// chain state. -/// -/// This includes, e.g., the commitments to new output notes created by the -/// transaction, or nullifiers spent by the transaction, but does not include -/// _authorizing data_ such as signatures or zk proofs. -/// -/// TODO: move this to the transaction crate, can be done when we ditch the chain component. -#[derive(Clone, Copy, Eq, PartialEq)] -pub struct EffectHash(pub [u8; 64]); - -impl EffectHash { - pub fn as_bytes(&self) -> &[u8; 64] { - &self.0 - } -} - -impl Default for EffectHash { - fn default() -> Self { - Self([0u8; 64]) - } -} - -impl std::fmt::Debug for EffectHash { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - f.debug_tuple("EffectHash") - .field(&hex::encode(self.0)) - .finish() - } -} - -impl DomainType for EffectHash { - type Proto = pb_transaction::EffectHash; -} - -impl From for pb_transaction::EffectHash { - fn from(msg: EffectHash) -> Self { - Self { - inner: msg.0.to_vec(), - } - } -} - -impl TryFrom for EffectHash { - type Error = anyhow::Error; - fn try_from(value: pb_transaction::EffectHash) -> Result { - Ok(Self(value.inner.try_into().map_err(|_| { - anyhow::anyhow!("incorrect length for effect hash") - })?)) - } -} - -impl AsRef<[u8]> for EffectHash { - fn as_ref(&self) -> &[u8] { - &self.0 - } -} diff --git a/crates/core/component/chain/src/lib.rs b/crates/core/component/chain/src/lib.rs index 24c8951514..74ff0dacb1 100644 --- a/crates/core/component/chain/src/lib.rs +++ b/crates/core/component/chain/src/lib.rs @@ -1,9 +1,7 @@ #![deny(clippy::unwrap_used)] #![cfg_attr(docsrs, feature(doc_cfg))] -pub use effect_hash::{EffectHash, EffectingData}; pub use epoch::Epoch; -pub use transaction::TransactionContext; mod epoch; @@ -17,7 +15,3 @@ pub mod component; pub mod genesis; pub mod params; pub mod state_key; - -// Located here at the bottom of the dep tree for convenience -mod effect_hash; -mod transaction; diff --git a/crates/core/component/dao/Cargo.toml b/crates/core/component/community-pool/Cargo.toml similarity index 93% rename from crates/core/component/dao/Cargo.toml rename to crates/core/component/community-pool/Cargo.toml index 40f5ce5bed..c3e0f0b035 100644 --- a/crates/core/component/dao/Cargo.toml +++ b/crates/core/component/community-pool/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "penumbra-dao" +name = "penumbra-community-pool" version = "0.64.1" edition = "2021" @@ -27,6 +27,7 @@ penumbra-sct = { path = "../sct", default-features = false } penumbra-asset = { path = "../../../core/asset", default-features = false } penumbra-num = { path = "../../../core/num", default-features = false } penumbra-keys = { path = "../../../core/keys", default-features = false } +penumbra-txhash = { path = "../../../core/txhash", default-features = false } # Crates.io deps ark-ff = { version = "0.4", default_features = false } diff --git a/crates/core/component/community-pool/src/action.rs b/crates/core/component/community-pool/src/action.rs new file mode 100644 index 0000000000..9436e9baaf --- /dev/null +++ b/crates/core/component/community-pool/src/action.rs @@ -0,0 +1,7 @@ +mod community_pool_deposit; +mod community_pool_output; +mod community_pool_spend; + +pub use community_pool_deposit::CommunityPoolDeposit; +pub use community_pool_output::CommunityPoolOutput; +pub use community_pool_spend::CommunityPoolSpend; diff --git a/crates/core/component/community-pool/src/action/community_pool_deposit.rs b/crates/core/component/community-pool/src/action/community_pool_deposit.rs new file mode 100644 index 0000000000..9512b217d6 --- /dev/null +++ b/crates/core/component/community-pool/src/action/community_pool_deposit.rs @@ -0,0 +1,56 @@ +use anyhow::{Context, Error}; +use penumbra_txhash::{EffectHash, EffectingData}; +use serde::{Deserialize, Serialize}; +use std::convert::{TryFrom, TryInto}; + +use penumbra_asset::{Balance, Value}; +// TODO: why are the CommunityPool actions not in the Community Pool protos? +use penumbra_proto::{penumbra::core::component::governance::v1alpha1 as pb, DomainType}; + +#[derive(Clone, Debug, Serialize, Deserialize)] +#[serde( + try_from = "pb::CommunityPoolDeposit", + into = "pb::CommunityPoolDeposit" +)] +pub struct CommunityPoolDeposit { + pub value: Value, +} + +impl CommunityPoolDeposit { + pub fn balance(&self) -> Balance { + // Deposits into the Community Pool require value + -Balance::from(self.value) + } +} + +impl EffectingData for CommunityPoolDeposit { + fn effect_hash(&self) -> EffectHash { + EffectHash::from_proto_effecting_data(&self.to_proto()) + } +} + +impl DomainType for CommunityPoolDeposit { + type Proto = pb::CommunityPoolDeposit; +} + +impl From for pb::CommunityPoolDeposit { + fn from(msg: CommunityPoolDeposit) -> Self { + pb::CommunityPoolDeposit { + value: Some(msg.value.into()), + } + } +} + +impl TryFrom for CommunityPoolDeposit { + type Error = Error; + + fn try_from(proto: pb::CommunityPoolDeposit) -> anyhow::Result { + let value = proto + .value + .ok_or_else(|| anyhow::anyhow!("missing value"))? + .try_into() + .context("malformed value")?; + + Ok(CommunityPoolDeposit { value }) + } +} diff --git a/crates/core/component/dao/src/action/dao_output.rs b/crates/core/component/community-pool/src/action/community_pool_output.rs similarity index 53% rename from crates/core/component/dao/src/action/dao_output.rs rename to crates/core/component/community-pool/src/action/community_pool_output.rs index 8c15864f0b..d3e1cf5bf5 100644 --- a/crates/core/component/dao/src/action/dao_output.rs +++ b/crates/core/component/community-pool/src/action/community_pool_output.rs @@ -5,38 +5,45 @@ use std::convert::{TryFrom, TryInto}; use penumbra_asset::{Balance, Value}; use penumbra_keys::Address; use penumbra_proto::{penumbra::core::component::governance::v1alpha1 as pb, DomainType}; +use penumbra_txhash::{EffectHash, EffectingData}; #[derive(Clone, Debug, Serialize, Deserialize)] -#[serde(try_from = "pb::DaoOutput", into = "pb::DaoOutput")] -pub struct DaoOutput { +#[serde(try_from = "pb::CommunityPoolOutput", into = "pb::CommunityPoolOutput")] +pub struct CommunityPoolOutput { pub value: Value, pub address: Address, } -impl DaoOutput { +impl CommunityPoolOutput { pub fn balance(&self) -> Balance { - // Outputs from the DAO require value + // Outputs from the Community Pool require value -Balance::from(self.value) } } -impl DomainType for DaoOutput { - type Proto = pb::DaoOutput; +impl EffectingData for CommunityPoolOutput { + fn effect_hash(&self) -> EffectHash { + EffectHash::from_proto_effecting_data(&self.to_proto()) + } +} + +impl DomainType for CommunityPoolOutput { + type Proto = pb::CommunityPoolOutput; } -impl From for pb::DaoOutput { - fn from(msg: DaoOutput) -> Self { - pb::DaoOutput { +impl From for pb::CommunityPoolOutput { + fn from(msg: CommunityPoolOutput) -> Self { + pb::CommunityPoolOutput { value: Some(msg.value.into()), address: Some(msg.address.into()), } } } -impl TryFrom for DaoOutput { +impl TryFrom for CommunityPoolOutput { type Error = Error; - fn try_from(proto: pb::DaoOutput) -> anyhow::Result { + fn try_from(proto: pb::CommunityPoolOutput) -> anyhow::Result { let value = proto .value .ok_or_else(|| anyhow::anyhow!("missing value"))? @@ -48,6 +55,6 @@ impl TryFrom for DaoOutput { .try_into() .context("malformed address")?; - Ok(DaoOutput { value, address }) + Ok(CommunityPoolOutput { value, address }) } } diff --git a/crates/core/component/community-pool/src/action/community_pool_spend.rs b/crates/core/component/community-pool/src/action/community_pool_spend.rs new file mode 100644 index 0000000000..ceeca2ce28 --- /dev/null +++ b/crates/core/component/community-pool/src/action/community_pool_spend.rs @@ -0,0 +1,52 @@ +use anyhow::{Context, Error}; +use serde::{Deserialize, Serialize}; +use std::convert::TryFrom; + +use penumbra_asset::{Balance, Value}; +use penumbra_proto::{penumbra::core::component::governance::v1alpha1 as pb, DomainType}; +use penumbra_txhash::{EffectHash, EffectingData}; + +#[derive(Clone, Debug, Serialize, Deserialize)] +#[serde(try_from = "pb::CommunityPoolSpend", into = "pb::CommunityPoolSpend")] +pub struct CommunityPoolSpend { + pub value: Value, +} + +impl EffectingData for CommunityPoolSpend { + fn effect_hash(&self) -> EffectHash { + EffectHash::from_proto_effecting_data(&self.to_proto()) + } +} + +impl CommunityPoolSpend { + pub fn balance(&self) -> Balance { + // Spends from the Community Pool produce value + Balance::from(self.value) + } +} + +impl DomainType for CommunityPoolSpend { + type Proto = pb::CommunityPoolSpend; +} + +impl From for pb::CommunityPoolSpend { + fn from(msg: CommunityPoolSpend) -> Self { + pb::CommunityPoolSpend { + value: Some(msg.value.into()), + } + } +} + +impl TryFrom for CommunityPoolSpend { + type Error = Error; + + fn try_from(proto: pb::CommunityPoolSpend) -> anyhow::Result { + let value = proto + .value + .ok_or_else(|| anyhow::anyhow!("missing value"))? + .try_into() + .context("malformed value")?; + + Ok(CommunityPoolSpend { value }) + } +} diff --git a/crates/core/component/community-pool/src/component.rs b/crates/core/component/community-pool/src/component.rs new file mode 100644 index 0000000000..bf31c2ed60 --- /dev/null +++ b/crates/core/component/community-pool/src/component.rs @@ -0,0 +1,8 @@ +/// The Community Pool isn't really a "component" because it doesn't really execute anything by itself. It's +/// just a collection of state that is modified by CommunityPoolSpend and CommunityPoolDeposit actions. +pub mod state_key; + +mod action_handler; +mod view; + +pub use view::{StateReadExt, StateWriteExt}; diff --git a/crates/core/component/community-pool/src/component/action_handler.rs b/crates/core/component/community-pool/src/component/action_handler.rs new file mode 100644 index 0000000000..3c44c51fc2 --- /dev/null +++ b/crates/core/component/community-pool/src/component/action_handler.rs @@ -0,0 +1,3 @@ +mod community_pool_deposit; +mod community_pool_output; +mod community_pool_spend; diff --git a/crates/core/component/dao/src/component/action_handler/dao_deposit.rs b/crates/core/component/community-pool/src/component/action_handler/community_pool_deposit.rs similarity index 63% rename from crates/core/component/dao/src/component/action_handler/dao_deposit.rs rename to crates/core/component/community-pool/src/component/action_handler/community_pool_deposit.rs index 59adc464d9..6922085815 100644 --- a/crates/core/component/dao/src/component/action_handler/dao_deposit.rs +++ b/crates/core/component/community-pool/src/component/action_handler/community_pool_deposit.rs @@ -5,22 +5,22 @@ use async_trait::async_trait; use cnidarium::{StateRead, StateWrite}; use cnidarium_component::ActionHandler; -use crate::{component::StateWriteExt as _, DaoDeposit}; +use crate::{component::StateWriteExt as _, CommunityPoolDeposit}; #[async_trait] -impl ActionHandler for DaoDeposit { +impl ActionHandler for CommunityPoolDeposit { type CheckStatelessContext = (); async fn check_stateless(&self, _context: ()) -> Result<()> { - // Any deposit into the DAO is valid. + // Any deposit into the Community Pool is valid. Ok(()) } async fn check_stateful(&self, _state: Arc) -> Result<()> { - // Any deposit into the DAO is valid. + // Any deposit into the Community Pool is valid. Ok(()) } async fn execute(&self, mut state: S) -> Result<()> { - state.dao_deposit(self.value).await + state.community_pool_deposit(self.value).await } } diff --git a/crates/core/component/dao/src/component/action_handler/dao_output.rs b/crates/core/component/community-pool/src/component/action_handler/community_pool_output.rs similarity index 54% rename from crates/core/component/dao/src/component/action_handler/dao_output.rs rename to crates/core/component/community-pool/src/component/action_handler/community_pool_output.rs index dbf91e220f..ee923341f2 100644 --- a/crates/core/component/dao/src/component/action_handler/dao_output.rs +++ b/crates/core/component/community-pool/src/component/action_handler/community_pool_output.rs @@ -7,25 +7,29 @@ use cnidarium_component::ActionHandler; use penumbra_sct::CommitmentSource; use penumbra_shielded_pool::component::NoteManager; -use crate::DaoOutput; +use crate::CommunityPoolOutput; #[async_trait] -impl ActionHandler for DaoOutput { +impl ActionHandler for CommunityPoolOutput { type CheckStatelessContext = (); async fn check_stateless(&self, _context: ()) -> Result<()> { - // Any output from the DAO is valid (it's just a transparent output). + // Any output from the Community Pool is valid (it's just a transparent output). Ok(()) } async fn check_stateful(&self, _state: Arc) -> Result<()> { - // Any output from the DAO is valid (it's just a transparent output). + // Any output from the Community Pool is valid (it's just a transparent output). Ok(()) } async fn execute(&self, mut state: S) -> Result<()> { - // Executing a DAO output is just minting a note to the recipient of the output. + // Executing a Community Pool output is just minting a note to the recipient of the output. state - .mint_note(self.value, &self.address, CommitmentSource::DaoOutput) + .mint_note( + self.value, + &self.address, + CommitmentSource::CommunityPoolOutput, + ) .await } } diff --git a/crates/core/component/dao/src/component/action_handler/dao_spend.rs b/crates/core/component/community-pool/src/component/action_handler/community_pool_spend.rs similarity index 59% rename from crates/core/component/dao/src/component/action_handler/dao_spend.rs rename to crates/core/component/community-pool/src/component/action_handler/community_pool_spend.rs index 6fdedc2d53..b68baffde1 100644 --- a/crates/core/component/dao/src/component/action_handler/dao_spend.rs +++ b/crates/core/component/community-pool/src/component/action_handler/community_pool_spend.rs @@ -5,25 +5,25 @@ use async_trait::async_trait; use cnidarium::{StateRead, StateWrite}; use cnidarium_component::ActionHandler; -use crate::{component::StateWriteExt as _, DaoSpend}; +use crate::{component::StateWriteExt as _, CommunityPoolSpend}; #[async_trait] -impl ActionHandler for DaoSpend { +impl ActionHandler for CommunityPoolSpend { type CheckStatelessContext = (); async fn check_stateless(&self, _context: ()) -> Result<()> { - // We can't statelessly check that the DAO has enough funds to spend, because we don't know + // We can't statelessly check that the Community Pool has enough funds to spend, because we don't know // what its state is here. Ok(()) } async fn check_stateful(&self, _state: Arc) -> Result<()> { // Instead of checking here, we just check during execution, which will fail if we try to - // overdraw the DAO. + // overdraw the Community Pool. Ok(()) } async fn execute(&self, mut state: S) -> Result<()> { - // This will fail if we try to overdraw the DAO, so we can never spend more than we have. - state.dao_withdraw(self.value).await + // This will fail if we try to overdraw the Community Pool, so we can never spend more than we have. + state.community_pool_withdraw(self.value).await } } diff --git a/crates/core/component/community-pool/src/component/state_key.rs b/crates/core/component/community-pool/src/component/state_key.rs new file mode 100644 index 0000000000..0532608e0a --- /dev/null +++ b/crates/core/component/community-pool/src/component/state_key.rs @@ -0,0 +1,18 @@ +use penumbra_asset::asset; + +pub fn community_pool_params() -> &'static str { + "community_pool/params" +} + +pub fn community_pool_params_updated() -> &'static str { + "community_pool/community_pool_params_updated" +} + +pub fn balance_for_asset(asset_id: asset::Id) -> String { + format!("community_pool/asset/{asset_id}") +} + +pub fn all_assets_balance() -> &'static str { + // note: this must be the prefix of the above. + "community_pool/asset/" +} diff --git a/crates/core/component/dao/src/component/view.rs b/crates/core/component/community-pool/src/component/view.rs similarity index 60% rename from crates/core/component/dao/src/component/view.rs rename to crates/core/component/community-pool/src/component/view.rs index 7c6f05eb42..e4982afa63 100644 --- a/crates/core/component/dao/src/component/view.rs +++ b/crates/core/component/community-pool/src/component/view.rs @@ -9,33 +9,33 @@ use penumbra_asset::{asset, Value}; use penumbra_num::Amount; use penumbra_proto::{StateReadProto, StateWriteProto}; -use crate::params::DaoParameters; +use crate::params::CommunityPoolParameters; use super::state_key; #[async_trait] pub trait StateReadExt: StateRead { - /// Indicates if the DAO parameters have been updated in this block. - fn dao_params_updated(&self) -> bool { - self.object_get::<()>(state_key::dao_params_updated()) + /// Indicates if the Community Pool parameters have been updated in this block. + fn community_pool_params_updated(&self) -> bool { + self.object_get::<()>(state_key::community_pool_params_updated()) .is_some() } - /// Gets the DAO parameters from the JMT. - async fn get_dao_params(&self) -> Result { - self.get(state_key::dao_params()) + /// Gets the Community Pool parameters from the JMT. + async fn get_community_pool_params(&self) -> Result { + self.get(state_key::community_pool_params()) .await? - .ok_or_else(|| anyhow::anyhow!("Missing DaoParameters")) + .ok_or_else(|| anyhow::anyhow!("Missing CommunityPoolParameters")) } - async fn dao_asset_balance(&self, asset_id: asset::Id) -> Result { + async fn community_pool_asset_balance(&self, asset_id: asset::Id) -> Result { Ok(self .get(&state_key::balance_for_asset(asset_id)) .await? .unwrap_or_else(|| Amount::from(0u64))) } - async fn dao_balance(&self) -> Result> { + async fn community_pool_balance(&self) -> Result> { let prefix = state_key::all_assets_balance(); self.prefix(prefix) .map(|result| { @@ -53,23 +53,23 @@ impl StateReadExt for T where T: StateRead + ?Sized {} #[async_trait] pub trait StateWriteExt: StateWrite { - /// Writes the provided DAO parameters to the JMT. - fn put_dao_params(&mut self, params: DaoParameters) { - // Note that the dao params have been updated: - self.object_put(state_key::dao_params_updated(), ()); + /// Writes the provided Community Pool parameters to the JMT. + fn put_community_pool_params(&mut self, params: CommunityPoolParameters) { + // Note that the Community Pool params have been updated: + self.object_put(state_key::community_pool_params_updated(), ()); - // Change the DAO parameters: - self.put(state_key::dao_params().into(), params) + // Change the Community Pool parameters: + self.put(state_key::community_pool_params().into(), params) } - async fn dao_deposit(&mut self, value: Value) -> Result<()> { + async fn community_pool_deposit(&mut self, value: Value) -> Result<()> { let key = state_key::balance_for_asset(value.asset_id); let current = self.get(&key).await?.unwrap_or_else(|| Amount::from(0u64)); self.put(key, current + value.amount); Ok(()) } - async fn dao_withdraw(&mut self, value: Value) -> Result<()> { + async fn community_pool_withdraw(&mut self, value: Value) -> Result<()> { let key = state_key::balance_for_asset(value.asset_id); let current = self.get(&key).await?.unwrap_or_else(|| Amount::from(0u64)); if let Some(remaining) = u128::from(current).checked_sub(u128::from(value.amount)) { @@ -80,7 +80,7 @@ pub trait StateWriteExt: StateWrite { } } else { anyhow::bail!( - "insufficient balance to withdraw {} of asset ID {} from the DAO", + "insufficient balance to withdraw {} of asset ID {} from the Community Pool", value.amount, value.asset_id ); diff --git a/crates/core/component/community-pool/src/event.rs b/crates/core/component/community-pool/src/event.rs new file mode 100644 index 0000000000..60997ace10 --- /dev/null +++ b/crates/core/component/community-pool/src/event.rs @@ -0,0 +1,5 @@ +// TODO: events for +// +// - Community Pool spend +// - Community Pool deposit +// ? diff --git a/crates/core/component/dao/src/genesis.rs b/crates/core/component/community-pool/src/genesis.rs similarity index 55% rename from crates/core/component/dao/src/genesis.rs rename to crates/core/component/community-pool/src/genesis.rs index 4a550c1c23..1ffeacec4a 100644 --- a/crates/core/component/dao/src/genesis.rs +++ b/crates/core/component/community-pool/src/genesis.rs @@ -1,20 +1,20 @@ use anyhow::Context; -use penumbra_proto::{penumbra::core::component::dao::v1alpha1 as pb, DomainType}; +use penumbra_proto::{penumbra::core::component::community_pool::v1alpha1 as pb, DomainType}; use serde::{Deserialize, Serialize}; -use crate::params::DaoParameters; +use crate::params::CommunityPoolParameters; #[derive(Deserialize, Serialize, Debug, Clone, Default)] #[serde(try_from = "pb::GenesisContent", into = "pb::GenesisContent")] pub struct Content { - /// The initial configuration parameters for the DAO component. - pub dao_params: DaoParameters, + /// The initial configuration parameters for the Community Pool component. + pub community_pool_params: CommunityPoolParameters, } impl From for pb::GenesisContent { fn from(value: Content) -> Self { pb::GenesisContent { - dao_params: Some(value.dao_params.into()), + community_pool_params: Some(value.community_pool_params.into()), } } } @@ -24,9 +24,9 @@ impl TryFrom for Content { fn try_from(msg: pb::GenesisContent) -> Result { Ok(Content { - dao_params: msg - .dao_params - .context("dao params not present in protobuf message")? + community_pool_params: msg + .community_pool_params + .context("Community Pool params not present in protobuf message")? .try_into()?, }) } diff --git a/crates/core/component/dao/src/lib.rs b/crates/core/component/community-pool/src/lib.rs similarity index 82% rename from crates/core/component/dao/src/lib.rs rename to crates/core/component/community-pool/src/lib.rs index 7d16f3f9c3..088fd0edbf 100644 --- a/crates/core/component/dao/src/lib.rs +++ b/crates/core/component/community-pool/src/lib.rs @@ -8,7 +8,7 @@ pub mod component; pub mod event; mod action; -pub use action::{DaoDeposit, DaoOutput, DaoSpend}; +pub use action::{CommunityPoolDeposit, CommunityPoolOutput, CommunityPoolSpend}; pub mod genesis; pub mod params; diff --git a/crates/core/component/community-pool/src/params.rs b/crates/core/component/community-pool/src/params.rs new file mode 100644 index 0000000000..b120208f25 --- /dev/null +++ b/crates/core/component/community-pool/src/params.rs @@ -0,0 +1,43 @@ +use penumbra_proto::core::component::community_pool::v1alpha1 as pb; +use penumbra_proto::DomainType; +use serde::{Deserialize, Serialize}; + +#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq)] +#[serde( + try_from = "pb::CommunityPoolParameters", + into = "pb::CommunityPoolParameters" +)] +pub struct CommunityPoolParameters { + /// Whether Community Pool spend proposals are enabled. + pub community_pool_spend_proposals_enabled: bool, +} + +impl DomainType for CommunityPoolParameters { + type Proto = pb::CommunityPoolParameters; +} + +impl TryFrom for CommunityPoolParameters { + type Error = anyhow::Error; + + fn try_from(msg: pb::CommunityPoolParameters) -> anyhow::Result { + Ok(CommunityPoolParameters { + community_pool_spend_proposals_enabled: msg.community_pool_spend_proposals_enabled, + }) + } +} + +impl From for pb::CommunityPoolParameters { + fn from(params: CommunityPoolParameters) -> Self { + pb::CommunityPoolParameters { + community_pool_spend_proposals_enabled: params.community_pool_spend_proposals_enabled, + } + } +} + +impl Default for CommunityPoolParameters { + fn default() -> Self { + Self { + community_pool_spend_proposals_enabled: true, + } + } +} diff --git a/crates/core/component/compact-block/Cargo.toml b/crates/core/component/compact-block/Cargo.toml index e6a5561e60..137438ddf6 100644 --- a/crates/core/component/compact-block/Cargo.toml +++ b/crates/core/component/compact-block/Cargo.toml @@ -31,7 +31,7 @@ penumbra-chain = { path = "../chain", default-features = false } penumbra-shielded-pool = { path = "../shielded-pool", default-features = false } penumbra-dex = { path = "../dex", default-features = false } penumbra-ibc = { path = "../ibc", default-features = false } -penumbra-dao = { path = "../dao", default-features = false } +penumbra-community-pool = { path = "../community-pool", default-features = false } penumbra-governance = { path = "../governance", default-features = false } penumbra-stake = { path = "../stake", default-features = false } penumbra-fee = { path = "../fee", default-features = false } diff --git a/crates/core/component/dao/src/action.rs b/crates/core/component/dao/src/action.rs deleted file mode 100644 index 92f9d5e096..0000000000 --- a/crates/core/component/dao/src/action.rs +++ /dev/null @@ -1,7 +0,0 @@ -mod dao_deposit; -mod dao_output; -mod dao_spend; - -pub use dao_deposit::DaoDeposit; -pub use dao_output::DaoOutput; -pub use dao_spend::DaoSpend; diff --git a/crates/core/component/dao/src/action/dao_deposit.rs b/crates/core/component/dao/src/action/dao_deposit.rs deleted file mode 100644 index 1fc1fe7ed5..0000000000 --- a/crates/core/component/dao/src/action/dao_deposit.rs +++ /dev/null @@ -1,46 +0,0 @@ -use anyhow::{Context, Error}; -use serde::{Deserialize, Serialize}; -use std::convert::{TryFrom, TryInto}; - -use penumbra_asset::{Balance, Value}; -// TODO: why are the Dao actions not in the dao protos? -use penumbra_proto::{penumbra::core::component::governance::v1alpha1 as pb, DomainType}; - -#[derive(Clone, Debug, Serialize, Deserialize)] -#[serde(try_from = "pb::DaoDeposit", into = "pb::DaoDeposit")] -pub struct DaoDeposit { - pub value: Value, -} - -impl DaoDeposit { - pub fn balance(&self) -> Balance { - // Deposits into the DAO require value - -Balance::from(self.value) - } -} - -impl DomainType for DaoDeposit { - type Proto = pb::DaoDeposit; -} - -impl From for pb::DaoDeposit { - fn from(msg: DaoDeposit) -> Self { - pb::DaoDeposit { - value: Some(msg.value.into()), - } - } -} - -impl TryFrom for DaoDeposit { - type Error = Error; - - fn try_from(proto: pb::DaoDeposit) -> anyhow::Result { - let value = proto - .value - .ok_or_else(|| anyhow::anyhow!("missing value"))? - .try_into() - .context("malformed value")?; - - Ok(DaoDeposit { value }) - } -} diff --git a/crates/core/component/dao/src/action/dao_spend.rs b/crates/core/component/dao/src/action/dao_spend.rs deleted file mode 100644 index d502010f3c..0000000000 --- a/crates/core/component/dao/src/action/dao_spend.rs +++ /dev/null @@ -1,45 +0,0 @@ -use anyhow::{Context, Error}; -use serde::{Deserialize, Serialize}; -use std::convert::TryFrom; - -use penumbra_asset::{Balance, Value}; -use penumbra_proto::{penumbra::core::component::governance::v1alpha1 as pb, DomainType}; - -#[derive(Clone, Debug, Serialize, Deserialize)] -#[serde(try_from = "pb::DaoSpend", into = "pb::DaoSpend")] -pub struct DaoSpend { - pub value: Value, -} - -impl DaoSpend { - pub fn balance(&self) -> Balance { - // Spends from the DAO produce value - Balance::from(self.value) - } -} - -impl DomainType for DaoSpend { - type Proto = pb::DaoSpend; -} - -impl From for pb::DaoSpend { - fn from(msg: DaoSpend) -> Self { - pb::DaoSpend { - value: Some(msg.value.into()), - } - } -} - -impl TryFrom for DaoSpend { - type Error = Error; - - fn try_from(proto: pb::DaoSpend) -> anyhow::Result { - let value = proto - .value - .ok_or_else(|| anyhow::anyhow!("missing value"))? - .try_into() - .context("malformed value")?; - - Ok(DaoSpend { value }) - } -} diff --git a/crates/core/component/dao/src/component.rs b/crates/core/component/dao/src/component.rs deleted file mode 100644 index 8e6e5d874b..0000000000 --- a/crates/core/component/dao/src/component.rs +++ /dev/null @@ -1,8 +0,0 @@ -/// The DAO isn't really a "component" because it doesn't really execute anything by itself. It's -/// just a collection of state that is modified by DaoSpend and DaoDeposit actions. -pub mod state_key; - -mod action_handler; -mod view; - -pub use view::{StateReadExt, StateWriteExt}; diff --git a/crates/core/component/dao/src/component/action_handler.rs b/crates/core/component/dao/src/component/action_handler.rs deleted file mode 100644 index ef085d7022..0000000000 --- a/crates/core/component/dao/src/component/action_handler.rs +++ /dev/null @@ -1,3 +0,0 @@ -mod dao_deposit; -mod dao_output; -mod dao_spend; diff --git a/crates/core/component/dao/src/component/state_key.rs b/crates/core/component/dao/src/component/state_key.rs deleted file mode 100644 index ace8c99aba..0000000000 --- a/crates/core/component/dao/src/component/state_key.rs +++ /dev/null @@ -1,18 +0,0 @@ -use penumbra_asset::asset; - -pub fn dao_params() -> &'static str { - "dao/params" -} - -pub fn dao_params_updated() -> &'static str { - "dao/dao_params_updated" -} - -pub fn balance_for_asset(asset_id: asset::Id) -> String { - format!("dao/asset/{asset_id}") -} - -pub fn all_assets_balance() -> &'static str { - // note: this must be the prefix of the above. - "dao/asset/" -} diff --git a/crates/core/component/dao/src/event.rs b/crates/core/component/dao/src/event.rs deleted file mode 100644 index 8dad9c00dd..0000000000 --- a/crates/core/component/dao/src/event.rs +++ /dev/null @@ -1,5 +0,0 @@ -// TODO: events for -// -// - dao spend -// - dao deposit -// ? diff --git a/crates/core/component/dao/src/params.rs b/crates/core/component/dao/src/params.rs deleted file mode 100644 index 8094816bad..0000000000 --- a/crates/core/component/dao/src/params.rs +++ /dev/null @@ -1,40 +0,0 @@ -use penumbra_proto::core::component::dao::v1alpha1 as pb; -use penumbra_proto::DomainType; -use serde::{Deserialize, Serialize}; - -#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq)] -#[serde(try_from = "pb::DaoParameters", into = "pb::DaoParameters")] -pub struct DaoParameters { - /// Whether DAO spend proposals are enabled. - pub dao_spend_proposals_enabled: bool, -} - -impl DomainType for DaoParameters { - type Proto = pb::DaoParameters; -} - -impl TryFrom for DaoParameters { - type Error = anyhow::Error; - - fn try_from(msg: pb::DaoParameters) -> anyhow::Result { - Ok(DaoParameters { - dao_spend_proposals_enabled: msg.dao_spend_proposals_enabled, - }) - } -} - -impl From for pb::DaoParameters { - fn from(params: DaoParameters) -> Self { - pb::DaoParameters { - dao_spend_proposals_enabled: params.dao_spend_proposals_enabled, - } - } -} - -impl Default for DaoParameters { - fn default() -> Self { - Self { - dao_spend_proposals_enabled: true, - } - } -} diff --git a/crates/core/component/dex/Cargo.toml b/crates/core/component/dex/Cargo.toml index 2fbe26dbb4..47fa6cbdde 100644 --- a/crates/core/component/dex/Cargo.toml +++ b/crates/core/component/dex/Cargo.toml @@ -43,6 +43,7 @@ penumbra-proof-params = { path = "../../../crypto/proof-params" } penumbra-asset = { path = "../../../core/asset", default-features = false } penumbra-num = { path = "../../../core/num", default-features = false } penumbra-keys = { path = "../../../core/keys", default-features = false } +penumbra-txhash = { path = "../../../core/txhash", default-features = false } decaf377-ka = { path = "../../../crypto/decaf377-ka/" } decaf377-fmd = { path = "../../../crypto/decaf377-fmd/" } diff --git a/crates/core/component/dex/src/component/action_handler/swap.rs b/crates/core/component/dex/src/component/action_handler/swap.rs index a9bca1ca52..0bb3cdb053 100644 --- a/crates/core/component/dex/src/component/action_handler/swap.rs +++ b/crates/core/component/dex/src/component/action_handler/swap.rs @@ -11,7 +11,7 @@ use penumbra_sct::component::SourceContext as _; use crate::{ component::{metrics, StateReadExt, StateWriteExt, SwapManager}, event, - swap::Swap, + swap::{proof::SwapProofPublic, Swap}, }; #[async_trait] @@ -25,9 +25,11 @@ impl ActionHandler for Swap { self.proof.verify( &SWAP_PROOF_VERIFICATION_KEY, - self.balance_commitment_inner(), - self.body.payload.commitment, - self.body.fee_commitment, + SwapProofPublic { + balance_commitment: self.balance_commitment_inner(), + swap_commitment: self.body.payload.commitment, + fee_commitment: self.body.fee_commitment, + }, )?; Ok(()) diff --git a/crates/core/component/dex/src/component/action_handler/swap_claim.rs b/crates/core/component/dex/src/component/action_handler/swap_claim.rs index b2e4eeb89d..cde6ec0751 100644 --- a/crates/core/component/dex/src/component/action_handler/swap_claim.rs +++ b/crates/core/component/dex/src/component/action_handler/swap_claim.rs @@ -4,7 +4,7 @@ use anyhow::{Context, Result}; use async_trait::async_trait; use cnidarium_component::ActionHandler; use penumbra_chain::component::StateReadExt as _; -use penumbra_chain::TransactionContext; +use penumbra_txhash::TransactionContext; use cnidarium::{StateRead, StateWrite}; use penumbra_proof_params::SWAPCLAIM_PROOF_VERIFICATION_KEY; @@ -12,7 +12,11 @@ use penumbra_proto::StateWriteProto; use penumbra_sct::component::{SctManager as _, SourceContext, StateReadExt as _}; use penumbra_shielded_pool::component::NoteManager; -use crate::{component::StateReadExt, event, swap_claim::SwapClaim}; +use crate::{ + component::StateReadExt, + event, + swap_claim::{SwapClaim, SwapClaimProofPublic}, +}; #[async_trait] impl ActionHandler for SwapClaim { @@ -21,12 +25,14 @@ impl ActionHandler for SwapClaim { self.proof .verify( &SWAPCLAIM_PROOF_VERIFICATION_KEY, - context.anchor, - self.body.nullifier, - self.body.fee.clone(), - self.body.output_data, - self.body.output_1_commitment, - self.body.output_2_commitment, + SwapClaimProofPublic { + anchor: context.anchor, + nullifier: self.body.nullifier, + claim_fee: self.body.fee.clone(), + output_data: self.body.output_data, + note_commitment_1: self.body.output_1_commitment, + note_commitment_2: self.body.output_2_commitment, + }, ) .context("a swap claim proof did not verify")?; diff --git a/crates/core/component/dex/src/lp/action.rs b/crates/core/component/dex/src/lp/action.rs index 8c9ce428cd..0eec1ad32d 100644 --- a/crates/core/component/dex/src/lp/action.rs +++ b/crates/core/component/dex/src/lp/action.rs @@ -2,6 +2,7 @@ use serde::{Deserialize, Serialize}; use penumbra_asset::{balance, Balance, Value}; use penumbra_proto::{penumbra::core::component::dex::v1alpha1 as pb, DomainType}; +use penumbra_txhash::{EffectHash, EffectingData}; use super::{position, position::Position, LpNft}; @@ -19,6 +20,14 @@ pub struct PositionOpen { pub position: Position, } +impl EffectingData for PositionOpen { + fn effect_hash(&self) -> EffectHash { + // The position open action consists only of the position, which + // we consider effecting data. + EffectHash::from_proto_effecting_data(&self.to_proto()) + } +} + impl PositionOpen { /// Compute a commitment to the value this action contributes to its transaction. pub fn balance(&self) -> Balance { @@ -49,6 +58,12 @@ pub struct PositionClose { pub position_id: position::Id, } +impl EffectingData for PositionClose { + fn effect_hash(&self) -> EffectHash { + EffectHash::from_proto_effecting_data(&self.to_proto()) + } +} + impl PositionClose { /// Compute the value this action contributes to its transaction. pub fn balance(&self) -> Balance { @@ -82,6 +97,12 @@ pub struct PositionWithdraw { pub reserves_commitment: balance::Commitment, } +impl EffectingData for PositionWithdraw { + fn effect_hash(&self) -> EffectHash { + EffectHash::from_proto_effecting_data(&self.to_proto()) + } +} + /// A transaction action that claims retroactive rewards for a historical /// position. /// @@ -97,6 +118,12 @@ pub struct PositionRewardClaim { pub rewards_commitment: balance::Commitment, } +impl EffectingData for PositionRewardClaim { + fn effect_hash(&self) -> EffectHash { + EffectHash::from_proto_effecting_data(&self.to_proto()) + } +} + impl DomainType for PositionOpen { type Proto = pb::PositionOpen; } diff --git a/crates/core/component/dex/src/swap/action.rs b/crates/core/component/dex/src/swap/action.rs index 79b95bea53..4eb43ae65c 100644 --- a/crates/core/component/dex/src/swap/action.rs +++ b/crates/core/component/dex/src/swap/action.rs @@ -7,6 +7,7 @@ use penumbra_proto::{ core::component::dex::v1alpha1 as pbc, penumbra::core::component::dex::v1alpha1 as pb, DomainType, }; +use penumbra_txhash::{EffectHash, EffectingData}; use serde::{Deserialize, Serialize}; use crate::TradingPair; @@ -39,6 +40,14 @@ impl Swap { } } +impl EffectingData for Swap { + fn effect_hash(&self) -> EffectHash { + // The effecting data is in the body of the swap, so we can + // just use hash the proto-encoding of the body. + self.body.effect_hash() + } +} + impl DomainType for Swap { type Proto = pb::Swap; } @@ -81,6 +90,12 @@ pub struct Body { pub payload: SwapPayload, } +impl EffectingData for Body { + fn effect_hash(&self) -> EffectHash { + EffectHash::from_proto_effecting_data(&self.to_proto()) + } +} + impl DomainType for Body { type Proto = pb::SwapBody; } diff --git a/crates/core/component/dex/src/swap/plan.rs b/crates/core/component/dex/src/swap/plan.rs index 0593bf87d4..00083023e8 100644 --- a/crates/core/component/dex/src/swap/plan.rs +++ b/crates/core/component/dex/src/swap/plan.rs @@ -8,6 +8,8 @@ use penumbra_proto::{penumbra::core::component::dex::v1alpha1 as pb, DomainType} use rand_core::{CryptoRng, RngCore}; use serde::{Deserialize, Serialize}; +use crate::swap::proof::{SwapProofPrivate, SwapProofPublic}; + // TODO: rename action::Body to SwapBody use super::{action as swap, proof::SwapProof, Swap, SwapPlaintext}; @@ -63,11 +65,15 @@ impl SwapPlan { self.proof_blinding_r, self.proof_blinding_s, &SWAP_PROOF_PROVING_KEY, - self.swap_plaintext.clone(), - self.fee_blinding, - balance_commitment, - self.swap_plaintext.swap_commitment(), - self.fee_commitment(), + SwapProofPublic { + balance_commitment, + swap_commitment: self.swap_plaintext.swap_commitment(), + fee_commitment: self.fee_commitment(), + }, + SwapProofPrivate { + fee_blinding: self.fee_blinding, + swap_plaintext: self.swap_plaintext.clone(), + }, ) .expect("can generate ZKSwapProof") } diff --git a/crates/core/component/dex/src/swap/proof.rs b/crates/core/component/dex/src/swap/proof.rs index 08af33bab0..86c207420f 100644 --- a/crates/core/component/dex/src/swap/proof.rs +++ b/crates/core/component/dex/src/swap/proof.rs @@ -31,51 +31,46 @@ use crate::{ use penumbra_proof_params::{DummyWitness, GROTH16_PROOF_LENGTH_BYTES}; -pub struct SwapCircuit { - /// The swap plaintext. - swap_plaintext: SwapPlaintext, - /// The blinding factor for the fee commitment. - fee_blinding: Fr, - /// Balance commitment of the swap. +/// The public inputs to a [`SwapProof`]. +#[derive(Clone, Debug)] +pub struct SwapProofPublic { + /// A commitment to the balance of this transaction. pub balance_commitment: balance::Commitment, - /// Swap commitment. + /// A commitment to the swap. pub swap_commitment: tct::StateCommitment, - /// Balance commitment of the fee. + /// A commitment to the fee that was paid. pub fee_commitment: balance::Commitment, } -impl SwapCircuit { - pub fn new( - swap_plaintext: SwapPlaintext, - fee_blinding: Fr, - balance_commitment: balance::Commitment, - swap_commitment: tct::StateCommitment, - fee_commitment: balance::Commitment, - ) -> Self { - Self { - swap_plaintext, - fee_blinding, - balance_commitment, - swap_commitment, - fee_commitment, - } - } +/// The private inputs to a [`SwapProof`]. +#[derive(Clone, Debug)] +pub struct SwapProofPrivate { + /// A randomizer to make the commitment to the fee hiding. + pub fee_blinding: Fr, + /// All information about the swap. + pub swap_plaintext: SwapPlaintext, +} + +pub struct SwapCircuit { + public: SwapProofPublic, + private: SwapProofPrivate, } impl ConstraintSynthesizer for SwapCircuit { fn generate_constraints(self, cs: ConstraintSystemRef) -> ark_relations::r1cs::Result<()> { // Witnesses let swap_plaintext_var = - SwapPlaintextVar::new_witness(cs.clone(), || Ok(self.swap_plaintext.clone()))?; - let fee_blinding_var = UInt8::new_witness_vec(cs.clone(), &self.fee_blinding.to_bytes())?; + SwapPlaintextVar::new_witness(cs.clone(), || Ok(self.private.swap_plaintext.clone()))?; + let fee_blinding_var = + UInt8::new_witness_vec(cs.clone(), &self.private.fee_blinding.to_bytes())?; // Inputs let claimed_balance_commitment = - BalanceCommitmentVar::new_input(cs.clone(), || Ok(self.balance_commitment))?; + BalanceCommitmentVar::new_input(cs.clone(), || Ok(self.public.balance_commitment))?; let claimed_swap_commitment = - StateCommitmentVar::new_input(cs.clone(), || Ok(self.swap_commitment))?; + StateCommitmentVar::new_input(cs.clone(), || Ok(self.public.swap_commitment))?; let claimed_fee_commitment = - BalanceCommitmentVar::new_input(cs, || Ok(self.fee_commitment))?; + BalanceCommitmentVar::new_input(cs, || Ok(self.public.fee_commitment))?; // Swap commitment integrity check let swap_commitment = swap_plaintext_var.commit()?; @@ -137,11 +132,15 @@ impl DummyWitness for SwapCircuit { }; Self { - swap_plaintext: swap_plaintext.clone(), - fee_blinding: Fr::from(1), - swap_commitment: swap_plaintext.swap_commitment(), - fee_commitment: balance::Commitment(decaf377::basepoint()), - balance_commitment: balance::Commitment(decaf377::basepoint()), + private: SwapProofPrivate { + swap_plaintext: swap_plaintext.clone(), + fee_blinding: Fr::from(1), + }, + public: SwapProofPublic { + swap_commitment: swap_plaintext.swap_commitment(), + fee_commitment: balance::Commitment(decaf377::basepoint()), + balance_commitment: balance::Commitment(decaf377::basepoint()), + }, } } } @@ -155,19 +154,10 @@ impl SwapProof { blinding_r: Fq, blinding_s: Fq, pk: &ProvingKey, - swap_plaintext: SwapPlaintext, - fee_blinding: Fr, - balance_commitment: balance::Commitment, - swap_commitment: tct::StateCommitment, - fee_commitment: balance::Commitment, + public: SwapProofPublic, + private: SwapProofPrivate, ) -> anyhow::Result { - let circuit = SwapCircuit { - swap_plaintext, - fee_blinding, - balance_commitment, - swap_commitment, - fee_commitment, - }; + let circuit = SwapCircuit { public, private }; let proof = Groth16::::create_proof_with_reduction( circuit, pk, blinding_r, blinding_s, ) @@ -191,28 +181,29 @@ impl SwapProof { pub fn verify( &self, vk: &PreparedVerifyingKey, - balance_commitment: balance::Commitment, - swap_commitment: tct::StateCommitment, - fee_commitment: balance::Commitment, + public: SwapProofPublic, ) -> anyhow::Result<()> { let proof = Proof::deserialize_compressed_unchecked(&self.0[..]).map_err(|e| anyhow::anyhow!(e))?; let mut public_inputs = Vec::new(); public_inputs.extend( - balance_commitment + public + .balance_commitment .0 .to_field_elements() .context("balance_commitment should be a Bls12-377 field member")?, ); public_inputs.extend( - swap_commitment + public + .swap_commitment .0 .to_field_elements() .context("swap_commitment should be a Bls12-377 field member")?, ); public_inputs.extend( - fee_commitment + public + .fee_commitment .0 .to_field_elements() .context("fee_commitment should be a Bls12-377 field member")?, @@ -315,6 +306,9 @@ mod tests { balance -= value_fee; let balance_commitment = balance.commit(fee_blinding); + let public = SwapProofPublic { balance_commitment, swap_commitment, fee_commitment }; + let private = SwapProofPrivate { fee_blinding, swap_plaintext }; + let blinding_r = Fq::rand(&mut rng); let blinding_s = Fq::rand(&mut rng); @@ -322,15 +316,12 @@ mod tests { blinding_r, blinding_s, &pk, - swap_plaintext, - fee_blinding, - balance_commitment, - swap_commitment, - fee_commitment + public.clone(), + private ) .expect("can create proof"); - let proof_result = proof.verify(&vk, balance_commitment, swap_commitment, fee_commitment); + let proof_result = proof.verify(&vk, public); assert!(proof_result.is_ok()); } diff --git a/crates/core/component/dex/src/swap_claim.rs b/crates/core/component/dex/src/swap_claim.rs index bd2e57260a..a68d0e5319 100644 --- a/crates/core/component/dex/src/swap_claim.rs +++ b/crates/core/component/dex/src/swap_claim.rs @@ -6,5 +6,5 @@ pub mod proof; pub use action::{Body, SwapClaim}; pub use plan::SwapClaimPlan; -pub use proof::{SwapClaimCircuit, SwapClaimProof}; +pub use proof::{SwapClaimCircuit, SwapClaimProof, SwapClaimProofPrivate, SwapClaimProofPublic}; pub use view::SwapClaimView; diff --git a/crates/core/component/dex/src/swap_claim/action.rs b/crates/core/component/dex/src/swap_claim/action.rs index e41a33bfe7..8d352c019a 100644 --- a/crates/core/component/dex/src/swap_claim/action.rs +++ b/crates/core/component/dex/src/swap_claim/action.rs @@ -5,6 +5,7 @@ use penumbra_proof_params::GROTH16_PROOF_LENGTH_BYTES; use penumbra_proto::{penumbra::core::component::dex::v1alpha1 as pb, DomainType}; use penumbra_sct::Nullifier; use penumbra_tct as tct; +use penumbra_txhash::{EffectHash, EffectingData}; use serde::{Deserialize, Serialize}; use crate::BatchSwapOutputData; @@ -26,6 +27,14 @@ impl SwapClaim { } } +impl EffectingData for SwapClaim { + fn effect_hash(&self) -> EffectHash { + // The effecting data is in the body of the swap claim, so we can + // just use hash the proto-encoding of the body. + self.body.effect_hash() + } +} + impl DomainType for SwapClaim { type Proto = pb::SwapClaim; } @@ -72,6 +81,12 @@ pub struct Body { pub output_data: BatchSwapOutputData, } +impl EffectingData for Body { + fn effect_hash(&self) -> EffectHash { + EffectHash::from_proto_effecting_data(&self.to_proto()) + } +} + impl DomainType for Body { type Proto = pb::SwapClaimBody; } diff --git a/crates/core/component/dex/src/swap_claim/plan.rs b/crates/core/component/dex/src/swap_claim/plan.rs index c87f69cced..8f95ecb352 100644 --- a/crates/core/component/dex/src/swap_claim/plan.rs +++ b/crates/core/component/dex/src/swap_claim/plan.rs @@ -14,7 +14,11 @@ use tct::Position; use crate::{swap::SwapPlaintext, BatchSwapOutputData}; -use super::{action as swap_claim, proof::SwapClaimProof, SwapClaim}; +use super::{ + action as swap_claim, + proof::{SwapClaimProof, SwapClaimProofPrivate, SwapClaimProofPublic}, + SwapClaim, +}; /// A planned [`SwapClaim`](SwapClaim). #[derive(Clone, Debug, Deserialize, Serialize)] @@ -68,18 +72,23 @@ impl SwapClaimPlan { self.proof_blinding_r, self.proof_blinding_s, &SWAPCLAIM_PROOF_PROVING_KEY, - self.swap_plaintext.clone(), - state_commitment_proof.clone(), - *nk, - state_commitment_proof.root(), - nullifier, - lambda_1, - lambda_2, - note_blinding_1, - note_blinding_2, - note_commitment_1, - note_commitment_2, - self.output_data, + SwapClaimProofPublic { + anchor: state_commitment_proof.root(), + nullifier, + claim_fee: self.swap_plaintext.claim_fee.clone(), + output_data: self.output_data, + note_commitment_1, + note_commitment_2, + }, + SwapClaimProofPrivate { + swap_plaintext: self.swap_plaintext.clone(), + state_commitment_proof: state_commitment_proof.clone(), + nk: *nk, + lambda_1, + lambda_2, + note_blinding_1, + note_blinding_2, + }, ) .expect("can generate ZKSwapClaimProof") } diff --git a/crates/core/component/dex/src/swap_claim/proof.rs b/crates/core/component/dex/src/swap_claim/proof.rs index 92781e3b0a..9aed58a36c 100644 --- a/crates/core/component/dex/src/swap_claim/proof.rs +++ b/crates/core/component/dex/src/swap_claim/proof.rs @@ -32,25 +32,9 @@ use crate::{ use penumbra_proof_params::{DummyWitness, GROTH16_PROOF_LENGTH_BYTES}; -/// SwapClaim consumes an existing Swap NFT so they are most similar to Spend operations, -/// however the note commitment proof needs to be for a specific block due to clearing prices -/// only being valid for particular blocks (i.e. the exchange rates of assets change over time). +/// The public inputs to a [`SwapProofPublic`]. #[derive(Clone, Debug)] -pub struct SwapClaimCircuit { - /// The swap being claimed - swap_plaintext: SwapPlaintext, - /// Inclusion proof for the swap commitment - state_commitment_proof: tct::Proof, - // The nullifier deriving key for the Swap NFT note. - nk: NullifierKey, - /// Output amount 1 - lambda_1: Amount, - /// Output amount 2 - lambda_2: Amount, - /// Note commitment blinding factor for the first output note - note_blinding_1: Fq, - /// Note commitment blinding factor for the second output note - note_blinding_2: Fq, +pub struct SwapClaimProofPublic { /// Anchor pub anchor: tct::Root, /// Nullifier @@ -65,74 +49,68 @@ pub struct SwapClaimCircuit { pub note_commitment_2: note::StateCommitment, } -impl SwapClaimCircuit { - #[allow(clippy::too_many_arguments)] - pub fn new( - swap_plaintext: SwapPlaintext, - state_commitment_proof: tct::Proof, - nk: NullifierKey, - lambda_1: Amount, - lambda_2: Amount, - note_blinding_1: Fq, - note_blinding_2: Fq, - anchor: tct::Root, - nullifier: Nullifier, - claim_fee: Fee, - output_data: BatchSwapOutputData, - note_commitment_1: note::StateCommitment, - note_commitment_2: note::StateCommitment, - ) -> Self { - Self { - swap_plaintext, - state_commitment_proof, - nk, - lambda_1, - lambda_2, - note_blinding_1, - note_blinding_2, - anchor, - nullifier, - claim_fee, - output_data, - note_commitment_1, - note_commitment_2, - } - } +/// The public inputs to a [`SwapProofPrivate`]. +#[derive(Clone, Debug)] +pub struct SwapClaimProofPrivate { + /// The swap being claimed + pub swap_plaintext: SwapPlaintext, + /// Inclusion proof for the swap commitment + pub state_commitment_proof: tct::Proof, + // The nullifier deriving key for the Swap NFT note. + pub nk: NullifierKey, + /// Output amount 1 + pub lambda_1: Amount, + /// Output amount 2 + pub lambda_2: Amount, + /// Note commitment blinding factor for the first output note + pub note_blinding_1: Fq, + /// Note commitment blinding factor for the second output note + pub note_blinding_2: Fq, +} + +/// SwapClaim consumes an existing Swap NFT so they are most similar to Spend operations, +/// however the note commitment proof needs to be for a specific block due to clearing prices +/// only being valid for particular blocks (i.e. the exchange rates of assets change over time). +#[derive(Clone, Debug)] +pub struct SwapClaimCircuit { + public: SwapClaimProofPublic, + private: SwapClaimProofPrivate, } impl ConstraintSynthesizer for SwapClaimCircuit { fn generate_constraints(self, cs: ConstraintSystemRef) -> ark_relations::r1cs::Result<()> { // Witnesses let swap_plaintext_var = - SwapPlaintextVar::new_witness(cs.clone(), || Ok(self.swap_plaintext.clone()))?; + SwapPlaintextVar::new_witness(cs.clone(), || Ok(self.private.swap_plaintext.clone()))?; let claimed_swap_commitment = StateCommitmentVar::new_witness(cs.clone(), || { - Ok(self.state_commitment_proof.commitment()) + Ok(self.private.state_commitment_proof.commitment()) })?; let position_var = tct::r1cs::PositionVar::new_witness(cs.clone(), || { - Ok(self.state_commitment_proof.position()) + Ok(self.private.state_commitment_proof.position()) })?; let position_bits = position_var.to_bits_le()?; let merkle_path_var = tct::r1cs::MerkleAuthPathVar::new_witness(cs.clone(), || { - Ok(self.state_commitment_proof) + Ok(self.private.state_commitment_proof) })?; - let nk_var = NullifierKeyVar::new_witness(cs.clone(), || Ok(self.nk))?; - let lambda_1_i_var = AmountVar::new_witness(cs.clone(), || Ok(self.lambda_1))?; - let lambda_2_i_var = AmountVar::new_witness(cs.clone(), || Ok(self.lambda_2))?; - let note_blinding_1 = FqVar::new_witness(cs.clone(), || Ok(self.note_blinding_1))?; - let note_blinding_2 = FqVar::new_witness(cs.clone(), || Ok(self.note_blinding_2))?; + let nk_var = NullifierKeyVar::new_witness(cs.clone(), || Ok(self.private.nk))?; + let lambda_1_i_var = AmountVar::new_witness(cs.clone(), || Ok(self.private.lambda_1))?; + let lambda_2_i_var = AmountVar::new_witness(cs.clone(), || Ok(self.private.lambda_2))?; + let note_blinding_1 = FqVar::new_witness(cs.clone(), || Ok(self.private.note_blinding_1))?; + let note_blinding_2 = FqVar::new_witness(cs.clone(), || Ok(self.private.note_blinding_2))?; // Inputs - let anchor_var = FqVar::new_input(cs.clone(), || Ok(Fq::from(self.anchor)))?; - let claimed_nullifier_var = NullifierVar::new_input(cs.clone(), || Ok(self.nullifier))?; - let claimed_fee_var = ValueVar::new_input(cs.clone(), || Ok(self.claim_fee.0))?; + let anchor_var = FqVar::new_input(cs.clone(), || Ok(Fq::from(self.public.anchor)))?; + let claimed_nullifier_var = + NullifierVar::new_input(cs.clone(), || Ok(self.public.nullifier))?; + let claimed_fee_var = ValueVar::new_input(cs.clone(), || Ok(self.public.claim_fee.0))?; let output_data_var = - BatchSwapOutputDataVar::new_input(cs.clone(), || Ok(self.output_data))?; + BatchSwapOutputDataVar::new_input(cs.clone(), || Ok(self.public.output_data))?; let claimed_note_commitment_1 = - StateCommitmentVar::new_input(cs.clone(), || Ok(self.note_commitment_1))?; + StateCommitmentVar::new_input(cs.clone(), || Ok(self.public.note_commitment_1))?; let claimed_note_commitment_2 = - StateCommitmentVar::new_input(cs.clone(), || Ok(self.note_commitment_2))?; + StateCommitmentVar::new_input(cs.clone(), || Ok(self.public.note_commitment_2))?; // Swap commitment integrity check. let swap_commitment = swap_plaintext_var.commit()?; @@ -266,21 +244,25 @@ impl DummyWitness for SwapClaimCircuit { let note_commitment_2 = tct::StateCommitment(Fq::from(2)); let (lambda_1, lambda_2) = output_data.pro_rata_outputs((delta_1_i, delta_2_i)); - Self { - swap_plaintext, - state_commitment_proof, + let public = SwapClaimProofPublic { anchor, nullifier, - nk, claim_fee, output_data, + note_commitment_1, + note_commitment_2, + }; + let private = SwapClaimProofPrivate { + swap_plaintext, + state_commitment_proof, + nk, lambda_1, lambda_2, note_blinding_1, note_blinding_2, - note_commitment_1, - note_commitment_2, - } + }; + + Self { public, private } } } @@ -295,34 +277,10 @@ impl SwapClaimProof { blinding_r: Fq, blinding_s: Fq, pk: &ProvingKey, - swap_plaintext: SwapPlaintext, - state_commitment_proof: tct::Proof, - nk: NullifierKey, - anchor: tct::Root, - nullifier: Nullifier, - lambda_1: Amount, - lambda_2: Amount, - note_blinding_1: Fq, - note_blinding_2: Fq, - note_commitment_1: tct::StateCommitment, - note_commitment_2: tct::StateCommitment, - output_data: BatchSwapOutputData, + public: SwapClaimProofPublic, + private: SwapClaimProofPrivate, ) -> anyhow::Result { - let circuit = SwapClaimCircuit { - swap_plaintext: swap_plaintext.clone(), - state_commitment_proof, - nk, - anchor, - nullifier, - claim_fee: swap_plaintext.claim_fee, - output_data, - lambda_1, - lambda_2, - note_blinding_1, - note_blinding_2, - note_commitment_1, - note_commitment_2, - }; + let circuit = SwapClaimCircuit { public, private }; let proof = Groth16::::create_proof_with_reduction( circuit, pk, blinding_r, blinding_s, @@ -340,53 +298,54 @@ impl SwapClaimProof { pub fn verify( &self, vk: &PreparedVerifyingKey, - anchor: tct::Root, - nullifier: Nullifier, - fee: Fee, - output_data: BatchSwapOutputData, - note_commitment_1: tct::StateCommitment, - note_commitment_2: tct::StateCommitment, + public: SwapClaimProofPublic, ) -> anyhow::Result<()> { let proof = Proof::deserialize_compressed_unchecked(&self.0[..]).map_err(|e| anyhow::anyhow!(e))?; let mut public_inputs = Vec::new(); public_inputs.extend( - Fq::from(anchor.0) + Fq::from(public.anchor.0) .to_field_elements() .expect("Fq types are Bls12-377 field members"), ); public_inputs.extend( - nullifier + public + .nullifier .0 .to_field_elements() .expect("nullifier is a Bls12-377 field member"), ); public_inputs.extend( - Fq::from(fee.0.amount) + Fq::from(public.claim_fee.0.amount) .to_field_elements() .expect("Fq types are Bls12-377 field members"), ); public_inputs.extend( - fee.0 + public + .claim_fee + .0 .asset_id .0 .to_field_elements() .expect("asset_id is a Bls12-377 field member"), ); public_inputs.extend( - output_data + public + .output_data .to_field_elements() .expect("output_data is a Bls12-377 field member"), ); public_inputs.extend( - note_commitment_1 + public + .note_commitment_1 .0 .to_field_elements() .expect("note_commitment_1 is a Bls12-377 field member"), ); public_inputs.extend( - note_commitment_2 + public + .note_commitment_2 .0 .to_field_elements() .expect("note_commitment_2 is a Bls12-377 field member"), @@ -540,6 +499,9 @@ mod tests { let note_commitment_1 = output_1_note.commit(); let note_commitment_2 = output_2_note.commit(); + let public = SwapClaimProofPublic { anchor, nullifier, claim_fee: fee, output_data, note_commitment_1, note_commitment_2 }; + let private = SwapClaimProofPrivate { swap_plaintext, state_commitment_proof, nk, lambda_1, lambda_2, note_blinding_1, note_blinding_2 }; + let blinding_r = Fq::rand(&mut rng); let blinding_s = Fq::rand(&mut rng); @@ -547,28 +509,12 @@ mod tests { blinding_r, blinding_s, &pk, - swap_plaintext, - state_commitment_proof, - nk, - anchor, - nullifier, - lambda_1, - lambda_2, - note_blinding_1, - note_blinding_2, - note_commitment_1, - note_commitment_2, - output_data, + public.clone(), + private ) .expect("can create proof"); - let proof_result = proof.verify(&vk, - anchor, - nullifier, - fee, - output_data, - note_commitment_1, - note_commitment_2); + let proof_result = proof.verify(&vk, public); assert!(proof_result.is_ok()); } @@ -659,6 +605,9 @@ mod tests { let note_commitment_1 = output_1_note.commit(); let note_commitment_2 = output_2_note.commit(); + let public = SwapClaimProofPublic { anchor, nullifier, claim_fee: fee, output_data, note_commitment_1, note_commitment_2 }; + let private = SwapClaimProofPrivate { swap_plaintext, state_commitment_proof, nk, lambda_1, lambda_2, note_blinding_1, note_blinding_2 }; + let blinding_r = Fq::rand(&mut rng); let blinding_s = Fq::rand(&mut rng); @@ -666,29 +615,14 @@ mod tests { blinding_r, blinding_s, &pk, - swap_plaintext, - state_commitment_proof, - nk, - anchor, - nullifier, - lambda_1, - lambda_2, - note_blinding_1, - note_blinding_2, - note_commitment_1, - note_commitment_2, - output_data, + public.clone(), + private ) .expect("can create proof"); let proof_result = proof.verify( &vk, - anchor, - nullifier, - fee, - output_data, - note_commitment_1, - note_commitment_2, + public ); assert!(proof_result.is_ok()); diff --git a/crates/core/component/governance/Cargo.toml b/crates/core/component/governance/Cargo.toml index 59351b05c6..9d4b589ebf 100644 --- a/crates/core/component/governance/Cargo.toml +++ b/crates/core/component/governance/Cargo.toml @@ -18,7 +18,7 @@ component = [ ] # proving-keys = ["penumbra-proof-params/proving-keys"] default = ["std", "component"] -std = ["ark-ff/std"] +std = ["ark-ff/std", "ibc-types/std"] parallel = [ "penumbra-tct/parallel", "ark-ff/parallel", @@ -39,13 +39,14 @@ penumbra-proof-params = { path = "../../../crypto/proof-params", default-feature penumbra-sct = { path = "../sct", default-features = false } penumbra-shielded-pool = { path = "../shielded-pool", default-features = false } penumbra-stake = { path = "../stake", default-features = false } -penumbra-dao = { path = "../dao", default-features = false } +penumbra-community-pool = { path = "../community-pool", default-features = false } penumbra-fee = { path = "../fee", default-features = false } penumbra-ibc = { path = "../ibc", default-features = false } penumbra-distributions = { path = "../distributions", default-features = false } penumbra-chain = { path = "../chain", default-features = false } penumbra-asset = { path = "../../../core/asset", default-features = false } penumbra-keys = { path = "../../../core/keys", default-features = false } +penumbra-txhash = { path = "../../../core/txhash", default-features = false } penumbra-num = { path = "../../../core/num", default-features = false } # Penumbra dependencies @@ -77,6 +78,7 @@ futures = "0.3" pbjson-types = "0.6" once_cell = "1.8" rand_chacha = "0.3" +ibc-types = { version = "0.11.0", default-features = false } # Component dependencies tokio = { version = "1.21.1", features = ["full", "tracing"], optional = true } diff --git a/crates/core/component/governance/src/action_handler/delegator_vote.rs b/crates/core/component/governance/src/action_handler/delegator_vote.rs index eff8354f39..aa63c2af36 100644 --- a/crates/core/component/governance/src/action_handler/delegator_vote.rs +++ b/crates/core/component/governance/src/action_handler/delegator_vote.rs @@ -5,11 +5,11 @@ use ark_ff::Zero; use async_trait::async_trait; use cnidarium::{StateRead, StateWrite}; use decaf377::Fr; -use penumbra_chain::TransactionContext; use penumbra_proof_params::DELEGATOR_VOTE_PROOF_VERIFICATION_KEY; +use penumbra_txhash::TransactionContext; use crate::{ - DelegatorVote, DelegatorVoteBody, + DelegatorVote, DelegatorVoteBody, DelegatorVoteProofPublic, {component::StateWriteExt, StateReadExt}, }; use cnidarium_component::ActionHandler; @@ -40,15 +40,15 @@ impl ActionHandler for DelegatorVote { .context("delegator vote auth signature failed to verify")?; // 2. Verify the proof against the provided anchor and start position: + let public = DelegatorVoteProofPublic { + anchor: context.anchor, + balance_commitment: value.commit(Fr::zero()), + nullifier: *nullifier, + rk: *rk, + start_position: *start_position, + }; proof - .verify( - &DELEGATOR_VOTE_PROOF_VERIFICATION_KEY, - context.anchor, - value.commit(Fr::zero()), - *nullifier, - *rk, - *start_position, - ) + .verify(&DELEGATOR_VOTE_PROOF_VERIFICATION_KEY, public) .context("a delegator vote proof did not verify")?; Ok(()) diff --git a/crates/core/component/governance/src/component/view.rs b/crates/core/component/governance/src/component/view.rs index 7bb10fe136..10a627ea29 100644 --- a/crates/core/component/governance/src/component/view.rs +++ b/crates/core/component/governance/src/component/view.rs @@ -7,8 +7,11 @@ use anyhow::{Context, Result}; use async_trait::async_trait; use cnidarium::{StateRead, StateWrite}; use futures::StreamExt; +use ibc_types::core::client::ClientId; use penumbra_asset::{asset, Value, STAKING_TOKEN_DENOM}; use penumbra_chain::component::{StateReadExt as _, StateWriteExt as _}; +use penumbra_ibc::component::ClientStateReadExt as _; +use penumbra_ibc::component::ClientStateWriteExt as _; use penumbra_num::Amount; use penumbra_proto::{StateReadProto, StateWriteProto}; use penumbra_sct::{component::StateReadExt as _, Nullifier}; @@ -558,7 +561,7 @@ pub trait StateReadExt: StateRead + penumbra_stake::StateReadExt { impl StateReadExt for T {} #[async_trait] -pub trait StateWriteExt: StateWrite { +pub trait StateWriteExt: StateWrite + penumbra_ibc::component::ConnectionStateWriteExt { /// Writes the provided governance parameters to the JMT. fn put_governance_params(&mut self, params: GovernanceParameters) { // Note that the governance params have been updated: @@ -864,30 +867,49 @@ pub trait StateWriteExt: StateWrite { tracing::info!("app parameters update scheduled successfully"); } - ProposalPayload::DaoSpend { + ProposalPayload::CommunityPoolSpend { transaction_plan: _, } => { // All we need to do here is signal to the `App` that we'd like this transaction to // be slotted in at the end of the block: - self.deliver_dao_transaction(proposal_id).await?; + self.deliver_community_pool_transaction(proposal_id).await?; } ProposalPayload::UpgradePlan { height } => { tracing::info!(target_height = height, "upgrade plan proposal passed"); self.signal_upgrade(*height).await?; } - } + ProposalPayload::FreezeIbcClient { client_id } => { + let client_id = &ClientId::from_str(client_id) + .map_err(|e| tonic::Status::aborted(format!("invalid client id: {e}")))?; + let client_state = self.get_client_state(client_id).await?; + let client_height = client_state.latest_height(); + + let frozen_client = client_state.with_frozen_height(client_height); + self.put_client(client_id, frozen_client); + } + ProposalPayload::UnfreezeIbcClient { client_id } => { + let client_id = &ClientId::from_str(client_id) + .map_err(|e| tonic::Status::aborted(format!("invalid client id: {e}")))?; + let client_state = self.get_client_state(client_id).await?; + let unfrozen_client = client_state.unfrozen(); + self.put_client(client_id, unfrozen_client); + } + } Ok(Ok(())) } - async fn deliver_dao_transaction(&mut self, proposal: u64) -> Result<()> { + async fn deliver_community_pool_transaction(&mut self, proposal: u64) -> Result<()> { // Schedule for beginning of next block let delivery_height = self.get_block_height().await? + 1; - tracing::info!(%proposal, %delivery_height, "scheduling DAO transaction for delivery at next block"); + tracing::info!(%proposal, %delivery_height, "scheduling Community Pool transaction for delivery at next block"); self.put_proto( - state_key::deliver_single_dao_transaction_at_height(delivery_height, proposal), + state_key::deliver_single_community_pool_transaction_at_height( + delivery_height, + proposal, + ), proposal, ); Ok(()) diff --git a/crates/core/component/governance/src/delegator_vote.rs b/crates/core/component/governance/src/delegator_vote.rs index 3c164c1550..758d327f83 100644 --- a/crates/core/component/governance/src/delegator_vote.rs +++ b/crates/core/component/governance/src/delegator_vote.rs @@ -5,5 +5,7 @@ pub mod view; pub use action::{DelegatorVote, DelegatorVoteBody}; pub use plan::DelegatorVotePlan; -pub use proof::{DelegatorVoteCircuit, DelegatorVoteProof}; +pub use proof::{ + DelegatorVoteCircuit, DelegatorVoteProof, DelegatorVoteProofPrivate, DelegatorVoteProofPublic, +}; pub use view::DelegatorVoteView; diff --git a/crates/core/component/governance/src/delegator_vote/action.rs b/crates/core/component/governance/src/delegator_vote/action.rs index 854193ff52..393a855410 100644 --- a/crates/core/component/governance/src/delegator_vote/action.rs +++ b/crates/core/component/governance/src/delegator_vote/action.rs @@ -7,6 +7,7 @@ use penumbra_num::Amount; use penumbra_proto::{core::component::governance::v1alpha1 as pb, DomainType}; use penumbra_sct::Nullifier; use penumbra_tct as tct; +use penumbra_txhash::{EffectHash, EffectingData}; #[derive(Debug, Clone)] pub struct DelegatorVote { @@ -15,6 +16,12 @@ pub struct DelegatorVote { pub proof: DelegatorVoteProof, } +impl EffectingData for DelegatorVote { + fn effect_hash(&self) -> EffectHash { + self.body.effect_hash() + } +} + /// The body of a delegator vote. #[derive(Debug, Clone)] pub struct DelegatorVoteBody { @@ -34,6 +41,12 @@ pub struct DelegatorVoteBody { pub rk: VerificationKey, } +impl EffectingData for DelegatorVoteBody { + fn effect_hash(&self) -> EffectHash { + EffectHash::from_proto_effecting_data(&self.to_proto()) + } +} + impl From for pb::DelegatorVoteBody { fn from(value: DelegatorVoteBody) -> Self { pb::DelegatorVoteBody { @@ -42,8 +55,8 @@ impl From for pb::DelegatorVoteBody { vote: Some(value.vote.into()), value: Some(value.value.into()), unbonded_amount: Some(value.unbonded_amount.into()), - nullifier: value.nullifier.to_bytes().into(), - rk: value.rk.to_bytes().into(), + nullifier: Some(value.nullifier.into()), + rk: Some(value.rk.into()), } } } @@ -72,16 +85,14 @@ impl TryFrom for DelegatorVoteBody { .try_into()?, nullifier: msg .nullifier + .ok_or_else(|| anyhow::anyhow!("missing nullifier in `DelegatorVote`"))? .try_into() .context("invalid nullifier in `DelegatorVote`")?, - rk: { - let rk_bytes: [u8; 32] = (msg.rk[..]) - .try_into() - .context("expected 32-byte rk in `DelegatorVote`")?; - rk_bytes - .try_into() - .context("invalid rk in `DelegatorVote`")? - }, + rk: msg + .rk + .ok_or_else(|| anyhow::anyhow!("missing rk in `DelegatorVote`"))? + .try_into() + .context("invalid rk in `DelegatorVote`")?, }) } } diff --git a/crates/core/component/governance/src/delegator_vote/plan.rs b/crates/core/component/governance/src/delegator_vote/plan.rs index 11e3331789..79fa89485f 100644 --- a/crates/core/component/governance/src/delegator_vote/plan.rs +++ b/crates/core/component/governance/src/delegator_vote/plan.rs @@ -15,6 +15,8 @@ use serde::{Deserialize, Serialize}; use crate::delegator_vote::action::{DelegatorVote, DelegatorVoteBody}; use crate::delegator_vote::proof::DelegatorVoteProof; +use crate::DelegatorVoteProofPrivate; +use crate::DelegatorVoteProofPublic; use crate::{vote::Vote, VotingReceiptToken}; /// A plan to vote as a delegator. @@ -103,20 +105,27 @@ impl DelegatorVotePlan { fvk: &FullViewingKey, state_commitment_proof: tct::Proof, ) -> DelegatorVoteProof { + let public = DelegatorVoteProofPublic { + anchor: state_commitment_proof.root(), + balance_commitment: self.staked_note.value().commit(Fr::zero()), + nullifier: self.nullifier(fvk), + rk: self.rk(fvk), + start_position: self.start_position, + }; + let private = DelegatorVoteProofPrivate { + state_commitment_proof, + note: self.staked_note.clone(), + v_blinding: Fr::from(0), + spend_auth_randomizer: self.randomizer, + ak: *fvk.spend_verification_key(), + nk: *fvk.nullifier_key(), + }; DelegatorVoteProof::prove( self.proof_blinding_r, self.proof_blinding_s, &DELEGATOR_VOTE_PROOF_PROVING_KEY, - state_commitment_proof.clone(), - self.staked_note.clone(), - self.randomizer, - *fvk.spend_verification_key(), - *fvk.nullifier_key(), - state_commitment_proof.root(), - self.staked_note.value().commit(Fr::zero()), - self.nullifier(fvk), - self.rk(fvk), - self.start_position, + public, + private, ) .expect("can generate ZK delegator vote proof") } diff --git a/crates/core/component/governance/src/delegator_vote/proof.rs b/crates/core/component/governance/src/delegator_vote/proof.rs index debf4ba310..6cfad88762 100644 --- a/crates/core/component/governance/src/delegator_vote/proof.rs +++ b/crates/core/component/governance/src/delegator_vote/proof.rs @@ -1,6 +1,7 @@ use base64::{engine::general_purpose, Engine as _}; use std::str::FromStr; +use anyhow::Result; use ark_groth16::r1cs_to_qap::LibsnarkReduction; use ark_r1cs_std::{prelude::*, uint8::UInt8}; use ark_serialize::{CanonicalDeserialize, CanonicalSerialize}; @@ -28,24 +29,9 @@ use penumbra_proof_params::{DummyWitness, VerifyingKeyExt, GROTH16_PROOF_LENGTH_ use penumbra_sct::{Nullifier, NullifierVar}; use penumbra_shielded_pool::{note, Note, Rseed}; -/// Groth16 proof for delegator voting. +/// The public input for a [`DelegatorVoteProof`]. #[derive(Clone, Debug)] -pub struct DelegatorVoteCircuit { - // Witnesses - /// Inclusion proof for the note commitment. - state_commitment_proof: tct::Proof, - /// The note being spent. - note: Note, - /// The blinding factor used for generating the value commitment. - v_blinding: Fr, - /// The randomizer used for generating the randomized spend auth key. - spend_auth_randomizer: Fr, - /// The spend authorization key. - ak: VerificationKey, - /// The nullifier deriving key. - nk: NullifierKey, - - // Public inputs +pub struct DelegatorVoteProofPublic { /// the merkle root of the state commitment tree. pub anchor: tct::Root, /// value commitment of the note to be spent. @@ -58,69 +44,142 @@ pub struct DelegatorVoteCircuit { pub start_position: tct::Position, } -impl DelegatorVoteCircuit { - #[allow(clippy::too_many_arguments)] - pub fn new( - state_commitment_proof: tct::Proof, - note: Note, - v_blinding: Fr, - spend_auth_randomizer: Fr, - ak: VerificationKey, - nk: NullifierKey, - anchor: tct::Root, - balance_commitment: balance::Commitment, - nullifier: Nullifier, - rk: VerificationKey, - start_position: tct::Position, - ) -> Self { - Self { - state_commitment_proof, - note, - v_blinding, - spend_auth_randomizer, - ak, - nk, - anchor, - balance_commitment, - nullifier, - rk, - start_position, - } +/// The private input for a [`DelegatorVoteProof`]. +#[derive(Clone, Debug)] +pub struct DelegatorVoteProofPrivate { + /// Inclusion proof for the note commitment. + pub state_commitment_proof: tct::Proof, + /// The note being spent. + pub note: Note, + /// The blinding factor used for generating the value commitment. + pub v_blinding: Fr, + /// The randomizer used for generating the randomized spend auth key. + pub spend_auth_randomizer: Fr, + /// The spend authorization key. + pub ak: VerificationKey, + /// The nullifier deriving key. + pub nk: NullifierKey, +} + +#[cfg(test)] +fn check_satisfaction( + public: &DelegatorVoteProofPublic, + private: &DelegatorVoteProofPrivate, +) -> Result<()> { + use penumbra_keys::keys::FullViewingKey; + + let note_commitment = private.note.commit(); + if note_commitment != private.state_commitment_proof.commitment() { + anyhow::bail!("note commitment did not match state commitment proof"); + } + + let nullifier = Nullifier::derive( + &private.nk, + private.state_commitment_proof.position(), + ¬e_commitment, + ); + if nullifier != public.nullifier { + anyhow::bail!("nullifier did not match public input"); + } + + private.state_commitment_proof.verify(public.anchor)?; + + let rk = private.ak.randomize(&private.spend_auth_randomizer); + if rk != public.rk { + anyhow::bail!("randomized spend auth key did not match public input"); + } + + let fvk = FullViewingKey::from_components(private.ak, private.nk); + let ivk = fvk.incoming(); + let transmission_key = ivk.diversified_public(&private.note.diversified_generator()); + if transmission_key != *private.note.transmission_key() { + anyhow::bail!("transmission key did not match note"); + } + + let balance_commitment = private.note.value().commit(private.v_blinding); + if balance_commitment != public.balance_commitment { + anyhow::bail!("balance commitment did not match public input"); + } + + if private.note.diversified_generator() == decaf377::Element::default() { + anyhow::bail!("diversified generator is identity"); + } + if private.ak.is_identity() { + anyhow::bail!("ak is identity"); + } + + if public.start_position.commitment() != 0 { + anyhow::bail!("start position commitment index is not zero"); + } + + if private.state_commitment_proof.position() >= public.start_position { + anyhow::bail!("note did not exist prior to the start of voting"); + } + + Ok(()) +} + +#[cfg(test)] +fn check_circuit_satisfaction( + public: DelegatorVoteProofPublic, + private: DelegatorVoteProofPrivate, +) -> Result<()> { + use ark_relations::r1cs::{self, ConstraintSystem}; + + let cs = ConstraintSystem::new_ref(); + let circuit = DelegatorVoteCircuit { public, private }; + cs.set_optimization_goal(r1cs::OptimizationGoal::Constraints); + circuit + .generate_constraints(cs.clone()) + .expect("can generate constraints from circuit"); + cs.finalize(); + if !cs.is_satisfied()? { + anyhow::bail!("constraints are not satisfied"); } + Ok(()) +} + +/// Groth16 proof for delegator voting. +#[derive(Clone, Debug)] +pub struct DelegatorVoteCircuit { + public: DelegatorVoteProofPublic, + private: DelegatorVoteProofPrivate, } impl ConstraintSynthesizer for DelegatorVoteCircuit { fn generate_constraints(self, cs: ConstraintSystemRef) -> ark_relations::r1cs::Result<()> { // Witnesses - let note_var = note::NoteVar::new_witness(cs.clone(), || Ok(self.note.clone()))?; + let note_var = note::NoteVar::new_witness(cs.clone(), || Ok(self.private.note.clone()))?; let claimed_note_commitment = StateCommitmentVar::new_witness(cs.clone(), || { - Ok(self.state_commitment_proof.commitment()) + Ok(self.private.state_commitment_proof.commitment()) })?; let delegator_position_var = tct::r1cs::PositionVar::new_witness(cs.clone(), || { - Ok(self.state_commitment_proof.position()) + Ok(self.private.state_commitment_proof.position()) })?; let delegator_position_bits = delegator_position_var.to_bits_le()?; let merkle_path_var = tct::r1cs::MerkleAuthPathVar::new_witness(cs.clone(), || { - Ok(self.state_commitment_proof) + Ok(self.private.state_commitment_proof) })?; - let v_blinding_arr: [u8; 32] = self.v_blinding.to_bytes(); + let v_blinding_arr: [u8; 32] = self.private.v_blinding.to_bytes(); let v_blinding_vars = UInt8::new_witness_vec(cs.clone(), &v_blinding_arr)?; - let spend_auth_randomizer_var = - SpendAuthRandomizerVar::new_witness(cs.clone(), || Ok(self.spend_auth_randomizer))?; + let spend_auth_randomizer_var = SpendAuthRandomizerVar::new_witness(cs.clone(), || { + Ok(self.private.spend_auth_randomizer) + })?; let ak_element_var: AuthorizationKeyVar = - AuthorizationKeyVar::new_witness(cs.clone(), || Ok(self.ak))?; - let nk_var = NullifierKeyVar::new_witness(cs.clone(), || Ok(self.nk))?; + AuthorizationKeyVar::new_witness(cs.clone(), || Ok(self.private.ak))?; + let nk_var = NullifierKeyVar::new_witness(cs.clone(), || Ok(self.private.nk))?; // Public inputs - let anchor_var = FqVar::new_input(cs.clone(), || Ok(Fq::from(self.anchor)))?; + let anchor_var = FqVar::new_input(cs.clone(), || Ok(Fq::from(self.public.anchor)))?; let claimed_balance_commitment_var = - BalanceCommitmentVar::new_input(cs.clone(), || Ok(self.balance_commitment))?; - let claimed_nullifier_var = NullifierVar::new_input(cs.clone(), || Ok(self.nullifier))?; - let rk_var = RandomizedVerificationKey::new_input(cs.clone(), || Ok(self.rk))?; - let start_position = PositionVar::new_input(cs.clone(), || Ok(self.start_position))?; + BalanceCommitmentVar::new_input(cs.clone(), || Ok(self.public.balance_commitment))?; + let claimed_nullifier_var = + NullifierVar::new_input(cs.clone(), || Ok(self.public.nullifier))?; + let rk_var = RandomizedVerificationKey::new_input(cs.clone(), || Ok(self.public.rk))?; + let start_position = PositionVar::new_input(cs.clone(), || Ok(self.public.start_position))?; // Note commitment integrity. let note_commitment_var = note_var.commit()?; @@ -215,19 +274,23 @@ impl DummyWitness for DelegatorVoteCircuit { .expect("able to witness just-inserted note commitment"); let start_position = state_commitment_proof.position(); - Self { + let public = DelegatorVoteProofPublic { + anchor, + balance_commitment: balance::Commitment(decaf377::basepoint()), + nullifier, + rk, + start_position, + }; + let private = DelegatorVoteProofPrivate { state_commitment_proof, note, v_blinding, spend_auth_randomizer, ak, nk, - anchor, - balance_commitment: balance::Commitment(decaf377::basepoint()), - nullifier, - rk, - start_position, - } + }; + + Self { public, private } } } @@ -235,51 +298,14 @@ impl DummyWitness for DelegatorVoteCircuit { pub struct DelegatorVoteProof([u8; GROTH16_PROOF_LENGTH_BYTES]); impl DelegatorVoteProof { - #![allow(clippy::too_many_arguments)] pub fn prove( blinding_r: Fq, blinding_s: Fq, pk: &ProvingKey, - state_commitment_proof: tct::Proof, - note: Note, - spend_auth_randomizer: Fr, - ak: VerificationKey, - nk: NullifierKey, - anchor: tct::Root, - balance_commitment: balance::Commitment, - nullifier: Nullifier, - rk: VerificationKey, - start_position: tct::Position, + public: DelegatorVoteProofPublic, + private: DelegatorVoteProofPrivate, ) -> anyhow::Result { - // The blinding factor for the value commitment is zero since it - // is not blinded. - let zero_blinding = Fr::from(0); - tracing::debug!( - ?state_commitment_proof, - ?note, - ?spend_auth_randomizer, - ?ak, - ?nk, - ?anchor, - ?balance_commitment, - ?nullifier, - ?rk, - ?start_position, - "generating delegator vote proof" - ); - let circuit = DelegatorVoteCircuit { - state_commitment_proof, - note, - v_blinding: zero_blinding, - spend_auth_randomizer, - ak, - nk, - anchor, - balance_commitment, - nullifier, - rk, - start_position, - }; + let circuit = DelegatorVoteCircuit { public, private }; let proof = Groth16::::create_proof_with_reduction( circuit, pk, blinding_r, blinding_s, ) @@ -296,39 +322,38 @@ impl DelegatorVoteProof { pub fn verify( &self, vk: &PreparedVerifyingKey, - anchor: tct::Root, - balance_commitment: balance::Commitment, - nullifier: Nullifier, - rk: VerificationKey, - start_position: tct::Position, + public: DelegatorVoteProofPublic, ) -> anyhow::Result<()> { let proof = Proof::deserialize_compressed_unchecked(&self.0[..]).map_err(|e| anyhow::anyhow!(e))?; let mut public_inputs = Vec::new(); public_inputs.extend( - Fq::from(anchor.0) + Fq::from(public.anchor.0) .to_field_elements() .expect("valid field element"), ); public_inputs.extend( - balance_commitment + public + .balance_commitment .0 .to_field_elements() .expect("valid field element"), ); public_inputs.extend( - nullifier + public + .nullifier .0 .to_field_elements() .expect("valid field element"), ); - let element_rk = decaf377::Encoding(rk.to_bytes()) + let element_rk = decaf377::Encoding(public.rk.to_bytes()) .vartime_decompress() .expect("expect only valid element points"); public_inputs.extend(element_rk.to_field_elements().expect("valid field element")); public_inputs.extend( - start_position + public + .start_position .to_field_elements() .expect("valid field element"), ); @@ -377,6 +402,7 @@ mod tests { use decaf377::{Fq, Fr}; use penumbra_asset::{asset, Value}; use penumbra_keys::keys::{SeedPhrase, SpendKey}; + use penumbra_num::Amount; use penumbra_proof_params::generate_prepared_test_parameters; use penumbra_sct::Nullifier; use proptest::prelude::*; @@ -388,73 +414,77 @@ mod tests { .boxed() } - proptest! { - #![proptest_config(ProptestConfig::with_cases(1))] - #[test] - fn delegator_vote_happy_path(seed_phrase_randomness in any::<[u8; 32]>(), spend_auth_randomizer in fr_strategy(), value_amount in 1..2000000000u64, num_commitments in 0..2000u64) { - let mut rng = OsRng; - let (pk, vk) = generate_prepared_test_parameters::(&mut rng); - - let seed_phrase = SeedPhrase::from_randomness(&seed_phrase_randomness); - let sk_sender = SpendKey::from_seed_phrase_bip44(seed_phrase, &Bip44Path::new(0)); - let fvk_sender = sk_sender.full_viewing_key(); - let ivk_sender = fvk_sender.incoming(); - let (sender, _dtk_d) = ivk_sender.payment_address(0u32.into()); - - let value_to_send = Value { - amount: value_amount.into(), - asset_id: asset::Cache::with_known_assets().get_unit("upenumbra").unwrap().id(), - }; - - let note = Note::generate(&mut rng, &sender, value_to_send); - let note_commitment = note.commit(); - let rsk = sk_sender.spend_auth_key().randomize(&spend_auth_randomizer); - let nk = *sk_sender.nullifier_key(); - let ak: VerificationKey = sk_sender.spend_auth_key().into(); - let mut sct = tct::Tree::new(); - - // Next, we simulate the case where the SCT is not empty by adding `num_commitments` - // unrelated items in the SCT. - for _ in 0..num_commitments { - let random_note_commitment = Note::generate(&mut rng, &sender, value_to_send).commit(); - sct.insert(tct::Witness::Keep, random_note_commitment).unwrap(); + prop_compose! { + fn arb_valid_delegator_vote_statement()(v_blinding in fr_strategy(), spend_auth_randomizer in fr_strategy(), asset_id64 in any::(), address_index in any::(), amount in any::(), seed_phrase_randomness in any::<[u8; 32]>(), rseed_randomness in any::<[u8; 32]>(), num_commitments in 0..100) -> (DelegatorVoteProofPublic, DelegatorVoteProofPrivate) { + let seed_phrase = SeedPhrase::from_randomness(&seed_phrase_randomness); + let sk_sender = SpendKey::from_seed_phrase_bip44(seed_phrase, &Bip44Path::new(0)); + let fvk_sender = sk_sender.full_viewing_key(); + let ivk_sender = fvk_sender.incoming(); + let (sender, _dtk_d) = ivk_sender.payment_address(address_index.into()); + let value_to_send = Value { + amount: Amount::from(amount), + asset_id: asset::Id(Fq::from(asset_id64)), + }; + let note = Note::from_parts( + sender, + value_to_send, + Rseed(rseed_randomness), + ).expect("should be able to create note"); + let note_commitment = note.commit(); + let rsk = sk_sender.spend_auth_key().randomize(&spend_auth_randomizer); + let nk = *sk_sender.nullifier_key(); + let ak: VerificationKey = sk_sender.spend_auth_key().into(); + + let mut sct = tct::Tree::new(); + + // Next, we simulate the case where the SCT is not empty by adding `num_commitments` + // unrelated items in the SCT. + for i in 0..num_commitments { + // To avoid duplicate note commitments, we use the `i` counter as the Rseed randomness + let rseed = Rseed([i as u8; 32]); + let dummy_note_commitment = Note::from_parts(sender, value_to_send, rseed).expect("can create note").commit(); + sct.insert(tct::Witness::Keep, dummy_note_commitment).expect("can insert note commitment into SCT"); + } + + sct.insert(tct::Witness::Keep, note_commitment).expect("can insert note commitment into SCT"); + let anchor = sct.root(); + let state_commitment_proof = sct.witness(note_commitment).expect("can witness note commitment"); + + // All proposals should have a position commitment index of zero, so we need to end the epoch + // and get the position that corresponds to the first commitment in the new epoch. + sct.end_epoch().expect("should be able to end an epoch"); + let first_note_commitment = Note::from_parts(sender, value_to_send, Rseed([u8::MAX; 32])).expect("can create note").commit(); + sct.insert(tct::Witness::Keep, first_note_commitment).expect("can insert note commitment into SCT"); + let start_position = sct.witness(first_note_commitment).expect("can witness note commitment").position(); + + let balance_commitment = value_to_send.commit(v_blinding); + let rk: VerificationKey = rsk.into(); + let nullifier = Nullifier::derive(&nk, state_commitment_proof.position(), ¬e_commitment); + + let public = DelegatorVoteProofPublic { + anchor, + balance_commitment, + nullifier, + rk, + start_position, + }; + let private = DelegatorVoteProofPrivate { + state_commitment_proof, + note, + v_blinding, + spend_auth_randomizer, + ak, + nk, + }; + (public, private) } + } - sct.insert(tct::Witness::Keep, note_commitment).unwrap(); - let anchor = sct.root(); - let state_commitment_proof = sct.witness(note_commitment).unwrap(); - sct.end_epoch().unwrap(); - - let first_note_commitment = Note::generate(&mut rng, &sender, value_to_send).commit(); - sct.insert(tct::Witness::Keep, first_note_commitment).unwrap(); - let start_position = sct.witness(first_note_commitment).unwrap().position(); - - let balance_commitment = value_to_send.commit(Fr::from(0u64)); - let rk: VerificationKey = rsk.into(); - let nf = Nullifier::derive(&nk, state_commitment_proof.position(), ¬e_commitment); - - let blinding_r = Fq::rand(&mut OsRng); - let blinding_s = Fq::rand(&mut OsRng); - - let proof = DelegatorVoteProof::prove( - blinding_r, - blinding_s, - &pk, - state_commitment_proof, - note, - spend_auth_randomizer, - ak, - nk, - anchor, - balance_commitment, - nf, - rk, - start_position, - ) - .expect("can create proof"); - - let proof_result = proof.verify(&vk, anchor, balance_commitment, nf, rk, start_position); - assert!(proof_result.is_ok()); + proptest! { + #[test] + fn delegator_vote_happy_path((public, private) in arb_valid_delegator_vote_statement()) { + assert!(check_satisfaction(&public, &private).is_ok()); + assert!(check_circuit_satisfaction(public, private).is_ok()); } } @@ -505,21 +535,28 @@ mod tests { let blinding_r = Fq::rand(&mut OsRng); let blinding_s = Fq::rand(&mut OsRng); - - let proof = DelegatorVoteProof::prove( - blinding_r, - blinding_s, - &pk, + let public = DelegatorVoteProofPublic { + anchor, + balance_commitment, + nullifier: nf, + rk, + start_position, + }; + let private = DelegatorVoteProofPrivate { state_commitment_proof, note, + v_blinding: Fr::from(0u64), spend_auth_randomizer, ak, nk, - anchor, - balance_commitment, - nf, - rk, - start_position, + }; + + + let proof = DelegatorVoteProof::prove( + blinding_r, + blinding_s, + &pk, + public.clone(), private ).expect("can form proof in release mode, but it should not verify"); // In debug mode, we won't be able to construct a valid proof if the start position @@ -528,7 +565,7 @@ mod tests { // generation (upstream) where we panic in debug mode if the circuit is not satisifiable, // but not in release mode. To ensure the same behavior in this test for both modes, // we panic if we get here and the proof does not verify (expected). - let proof_result = proof.verify(&vk, anchor, balance_commitment, nf, rk, start_position); + let proof_result = proof.verify(&vk, public); proof_result.expect("we expect this proof _not_ to verify, so this will cause a panic"); } } diff --git a/crates/core/component/governance/src/lib.rs b/crates/core/component/governance/src/lib.rs index 019a870d32..7d66052326 100644 --- a/crates/core/component/governance/src/lib.rs +++ b/crates/core/component/governance/src/lib.rs @@ -5,7 +5,7 @@ pub mod delegator_vote; pub use delegator_vote::{ DelegatorVote, DelegatorVoteBody, DelegatorVoteCircuit, DelegatorVotePlan, DelegatorVoteProof, - DelegatorVoteView, + DelegatorVoteProofPrivate, DelegatorVoteProofPublic, DelegatorVoteView, }; pub mod proposal_deposit_claim; diff --git a/crates/core/component/governance/src/metrics.rs b/crates/core/component/governance/src/metrics.rs index 8f5131ec82..668c4d13b5 100644 --- a/crates/core/component/governance/src/metrics.rs +++ b/crates/core/component/governance/src/metrics.rs @@ -11,6 +11,7 @@ //! This trick is probably good to avoid in general, because it could be //! confusing, but in this limited case, it seems like a clean option. +#[allow(unused_imports)] pub use metrics::*; /// Registers all metrics used by this crate. diff --git a/crates/core/component/governance/src/proposal.rs b/crates/core/component/governance/src/proposal.rs index c5040c7f46..e9566db75c 100644 --- a/crates/core/component/governance/src/proposal.rs +++ b/crates/core/component/governance/src/proposal.rs @@ -5,7 +5,7 @@ use std::str::FromStr; use crate::params::GovernanceParameters; use penumbra_chain::params::ChainParameters; -use penumbra_dao::params::DaoParameters; +use penumbra_community_pool::params::CommunityPoolParameters; use penumbra_distributions::params::DistributionsParameters; use penumbra_fee::params::FeeParameters; use penumbra_ibc::params::IBCParameters; @@ -29,6 +29,15 @@ pub struct Proposal { pub payload: ProposalPayload, } +/* +// TODO: is this needed? +impl EffectingData for Proposal { + fn effect_hash(&self) -> EffectHash { + EffectHash::from_proto_effecting_data(&self.to_proto()) + } +} + */ + /// The protobuf type URL for a transaction plan. pub const TRANSACTION_PLAN_TYPE_URL: &str = "/penumbra.core.transaction.v1alpha1.TransactionPlan"; @@ -59,8 +68,8 @@ impl From for pb::Proposal { new_parameters: Some((*new).into()), }); } - ProposalPayload::DaoSpend { transaction_plan } => { - proposal.dao_spend = Some(pb::proposal::DaoSpend { + ProposalPayload::CommunityPoolSpend { transaction_plan } => { + proposal.community_pool_spend = Some(pb::proposal::CommunityPoolSpend { transaction_plan: Some(pbjson_types::Any { type_url: TRANSACTION_PLAN_TYPE_URL.to_owned(), value: transaction_plan.into(), @@ -70,6 +79,16 @@ impl From for pb::Proposal { ProposalPayload::UpgradePlan { height } => { proposal.upgrade_plan = Some(pb::proposal::UpgradePlan { height }); } + ProposalPayload::FreezeIbcClient { client_id } => { + proposal.freeze_ibc_client = Some(pb::proposal::FreezeIbcClient { + client_id: client_id.into(), + }); + } + ProposalPayload::UnfreezeIbcClient { client_id } => { + proposal.unfreeze_ibc_client = Some(pb::proposal::UnfreezeIbcClient { + client_id: client_id.into(), + }); + } } proposal } @@ -110,10 +129,10 @@ impl TryFrom for Proposal { .try_into()?, ), } - } else if let Some(dao_spend) = inner.dao_spend { - ProposalPayload::DaoSpend { + } else if let Some(community_pool_spend) = inner.community_pool_spend { + ProposalPayload::CommunityPoolSpend { transaction_plan: { - let transaction_plan = dao_spend + let transaction_plan = community_pool_spend .transaction_plan .ok_or_else(|| anyhow::anyhow!("missing transaction plan"))?; if transaction_plan.type_url != TRANSACTION_PLAN_TYPE_URL { @@ -187,12 +206,18 @@ pub enum ProposalKind { /// A parameter change proposal. #[cfg_attr(feature = "clap", clap(display_order = 300))] ParameterChange, - /// A DAO spend proposal. + /// A Community Pool spend proposal. #[cfg_attr(feature = "clap", clap(display_order = 400))] - DaoSpend, + CommunityPoolSpend, /// An upgrade proposal. #[cfg_attr(feature = "clap", clap(display_order = 500))] UpgradePlan, + /// A proposal to freeze an IBC client. + #[cfg_attr(feature = "clap", clap(display_order = 600))] + FreezeIbcClient, + /// A proposal to unfreeze an IBC client. + #[cfg_attr(feature = "clap", clap(display_order = 700))] + UnfreezeIbcClient, } impl FromStr for ProposalKind { @@ -203,7 +228,7 @@ impl FromStr for ProposalKind { "signaling" => Ok(ProposalKind::Signaling), "emergency" => Ok(ProposalKind::Emergency), "parameterchange" => Ok(ProposalKind::ParameterChange), - "daospend" => Ok(ProposalKind::DaoSpend), + "communitypoolspend" => Ok(ProposalKind::CommunityPoolSpend), "upgrade_plan" => Ok(ProposalKind::UpgradePlan), _ => Err(anyhow::anyhow!("invalid proposal kind: {}", s)), } @@ -217,8 +242,10 @@ impl Proposal { ProposalPayload::Signaling { .. } => ProposalKind::Signaling, ProposalPayload::Emergency { .. } => ProposalKind::Emergency, ProposalPayload::ParameterChange { .. } => ProposalKind::ParameterChange, - ProposalPayload::DaoSpend { .. } => ProposalKind::DaoSpend, + ProposalPayload::CommunityPoolSpend { .. } => ProposalKind::CommunityPoolSpend, ProposalPayload::UpgradePlan { .. } => ProposalKind::UpgradePlan, + ProposalPayload::FreezeIbcClient { .. } => ProposalKind::FreezeIbcClient, + ProposalPayload::UnfreezeIbcClient { .. } => ProposalKind::UnfreezeIbcClient, } } } @@ -254,19 +281,29 @@ pub enum ProposalPayload { /// passed. new: Box, }, - /// A DAO spend proposal describes proposed transaction(s) to be executed or cancelled at - /// specific heights, with the spend authority of the DAO. - DaoSpend { + /// A Community Pool spend proposal describes proposed transaction(s) to be executed or cancelled at + /// specific heights, with the spend authority of the Community Pool. + CommunityPoolSpend { /// The transaction plan to be executed at the time the proposal is passed. /// - /// This must be a transaction plan which can be executed by the DAO, which means it can't - /// require any witness data or authorization signatures, but it may use the `DaoSpend` + /// This must be a transaction plan which can be executed by the Community Pool, which means it can't + /// require any witness data or authorization signatures, but it may use the `CommunityPoolSpend` /// action. transaction_plan: Vec, }, /// An upgrade plan proposal describes a planned upgrade to the chain. If ratified, the chain /// will halt at the specified height, trigger an epoch transition, and halt the chain. UpgradePlan { height: u64 }, + /// A proposal to freeze a specific IBC client. + FreezeIbcClient { + /// The identifier of the client to freeze. + client_id: String, + }, + /// A proposal to unfreeze a specific IBC client. + UnfreezeIbcClient { + /// The identifier of the client to unfreeze. + client_id: String, + }, } /// A TOML-serializable version of `ProposalPayload`, meant for human consumption. @@ -283,12 +320,18 @@ pub enum ProposalPayloadToml { old: Box, new: Box, }, - DaoSpend { + CommunityPoolSpend { transaction: String, }, UpgradePlan { height: u64, }, + FreezeIbcClient { + client_id: String, + }, + UnfreezeIbcClient { + client_id: String, + }, } impl TryFrom for ProposalPayload { @@ -303,14 +346,25 @@ impl TryFrom for ProposalPayload { ProposalPayloadToml::ParameterChange { old, new } => { ProposalPayload::ParameterChange { old, new } } - ProposalPayloadToml::DaoSpend { transaction } => ProposalPayload::DaoSpend { - transaction_plan: Bytes::from( - base64::Engine::decode(&base64::engine::general_purpose::STANDARD, transaction) + ProposalPayloadToml::CommunityPoolSpend { transaction } => { + ProposalPayload::CommunityPoolSpend { + transaction_plan: Bytes::from( + base64::Engine::decode( + &base64::engine::general_purpose::STANDARD, + transaction, + ) .context("couldn't decode transaction plan from base64")?, - ) - .to_vec(), - }, + ) + .to_vec(), + } + } ProposalPayloadToml::UpgradePlan { height } => ProposalPayload::UpgradePlan { height }, + ProposalPayloadToml::FreezeIbcClient { client_id } => { + ProposalPayload::FreezeIbcClient { client_id } + } + ProposalPayloadToml::UnfreezeIbcClient { client_id } => { + ProposalPayload::UnfreezeIbcClient { client_id } + } }) } } @@ -325,13 +379,21 @@ impl From for ProposalPayloadToml { ProposalPayload::ParameterChange { old, new } => { ProposalPayloadToml::ParameterChange { old, new } } - ProposalPayload::DaoSpend { transaction_plan } => ProposalPayloadToml::DaoSpend { - transaction: base64::Engine::encode( - &base64::engine::general_purpose::STANDARD, - transaction_plan, - ), - }, + ProposalPayload::CommunityPoolSpend { transaction_plan } => { + ProposalPayloadToml::CommunityPoolSpend { + transaction: base64::Engine::encode( + &base64::engine::general_purpose::STANDARD, + transaction_plan, + ), + } + } ProposalPayload::UpgradePlan { height } => ProposalPayloadToml::UpgradePlan { height }, + ProposalPayload::FreezeIbcClient { client_id } => { + ProposalPayloadToml::FreezeIbcClient { client_id } + } + ProposalPayload::UnfreezeIbcClient { client_id } => { + ProposalPayloadToml::UnfreezeIbcClient { client_id } + } } } } @@ -349,8 +411,8 @@ impl ProposalPayload { matches!(self, ProposalPayload::ParameterChange { .. }) } - pub fn is_dao_spend(&self) -> bool { - matches!(self, ProposalPayload::DaoSpend { .. }) + pub fn is_community_pool_spend(&self) -> bool { + matches!(self, ProposalPayload::CommunityPoolSpend { .. }) } } @@ -366,7 +428,7 @@ impl ProposalPayload { )] pub struct ChangedAppParameters { pub chain_params: Option, - pub dao_params: Option, + pub community_pool_params: Option, pub distributions_params: Option, pub ibc_params: Option, pub stake_params: Option, @@ -384,7 +446,10 @@ impl TryFrom for ChangedAppParameters { fn try_from(msg: pb::ChangedAppParameters) -> anyhow::Result { Ok(ChangedAppParameters { chain_params: msg.chain_params.map(TryInto::try_into).transpose()?, - dao_params: msg.dao_params.map(TryInto::try_into).transpose()?, + community_pool_params: msg + .community_pool_params + .map(TryInto::try_into) + .transpose()?, distributions_params: msg .distributions_params .map(TryInto::try_into) @@ -401,7 +466,7 @@ impl From for pb::ChangedAppParameters { fn from(params: ChangedAppParameters) -> Self { pb::ChangedAppParameters { chain_params: params.chain_params.map(Into::into), - dao_params: params.dao_params.map(Into::into), + community_pool_params: params.community_pool_params.map(Into::into), distributions_params: params.distributions_params.map(Into::into), fee_params: params.fee_params.map(Into::into), governance_params: params.governance_params.map(Into::into), diff --git a/crates/core/component/governance/src/proposal_deposit_claim/action.rs b/crates/core/component/governance/src/proposal_deposit_claim/action.rs index f1633567fa..aa0c5245fc 100644 --- a/crates/core/component/governance/src/proposal_deposit_claim/action.rs +++ b/crates/core/component/governance/src/proposal_deposit_claim/action.rs @@ -5,7 +5,8 @@ use penumbra_asset::{ Balance, Value, STAKING_TOKEN_ASSET_ID, }; use penumbra_num::Amount; -use penumbra_proto::penumbra::core::component::governance::v1alpha1 as pb; +use penumbra_proto::{penumbra::core::component::governance::v1alpha1 as pb, DomainType}; +use penumbra_txhash::{EffectHash, EffectingData}; use crate::proposal_state::{Outcome, Withdrawn}; @@ -26,6 +27,16 @@ pub struct ProposalDepositClaim { pub outcome: Outcome<()>, } +impl EffectingData for ProposalDepositClaim { + fn effect_hash(&self) -> EffectHash { + EffectHash::from_proto_effecting_data(&self.to_proto()) + } +} + +impl DomainType for ProposalDepositClaim { + type Proto = pb::ProposalDepositClaim; +} + impl From for pb::ProposalDepositClaim { fn from(value: ProposalDepositClaim) -> pb::ProposalDepositClaim { pb::ProposalDepositClaim { diff --git a/crates/core/component/governance/src/proposal_submit/action.rs b/crates/core/component/governance/src/proposal_submit/action.rs index b34c8c09b4..293128cb30 100644 --- a/crates/core/component/governance/src/proposal_submit/action.rs +++ b/crates/core/component/governance/src/proposal_submit/action.rs @@ -3,6 +3,7 @@ use serde::{Deserialize, Serialize}; use penumbra_asset::{Balance, Value, STAKING_TOKEN_ASSET_ID}; use penumbra_num::Amount; use penumbra_proto::{penumbra::core::component::governance::v1alpha1 as pb, DomainType}; +use penumbra_txhash::{EffectHash, EffectingData}; use crate::proposal::Proposal; @@ -20,6 +21,12 @@ pub struct ProposalSubmit { pub deposit_amount: Amount, } +impl EffectingData for ProposalSubmit { + fn effect_hash(&self) -> EffectHash { + EffectHash::from_proto_effecting_data(&self.to_proto()) + } +} + impl ProposalSubmit { /// Compute a commitment to the value contributed to a transaction by this proposal submission. pub fn balance(&self) -> Balance { diff --git a/crates/core/component/governance/src/proposal_withdraw/action.rs b/crates/core/component/governance/src/proposal_withdraw/action.rs index f3cefcf056..80ca8a2a2b 100644 --- a/crates/core/component/governance/src/proposal_withdraw/action.rs +++ b/crates/core/component/governance/src/proposal_withdraw/action.rs @@ -3,6 +3,7 @@ use serde::{Deserialize, Serialize}; use penumbra_asset::{Balance, Value}; use penumbra_num::Amount; use penumbra_proto::{penumbra::core::component::governance::v1alpha1 as pb, DomainType}; +use penumbra_txhash::{EffectHash, EffectingData}; use crate::ProposalNft; @@ -16,6 +17,12 @@ pub struct ProposalWithdraw { pub reason: String, } +impl EffectingData for ProposalWithdraw { + fn effect_hash(&self) -> EffectHash { + EffectHash::from_proto_effecting_data(&self.to_proto()) + } +} + impl From for pb::ProposalWithdraw { fn from(value: ProposalWithdraw) -> pb::ProposalWithdraw { pb::ProposalWithdraw { diff --git a/crates/core/component/governance/src/state_key.rs b/crates/core/component/governance/src/state_key.rs index ba3268e8d1..3afa6dc536 100644 --- a/crates/core/component/governance/src/state_key.rs +++ b/crates/core/component/governance/src/state_key.rs @@ -13,8 +13,8 @@ pub fn proposal_definition(proposal_id: u64) -> String { format!("governance/proposal/{proposal_id:020}/data") } -pub fn dao_transaction(proposal_id: u64) -> String { - format!("governance/proposal/{proposal_id:020}/dao_transaction") +pub fn community_pool_transaction(proposal_id: u64) -> String { + format!("governance/proposal/{proposal_id:020}/community_pool_transaction") } pub fn proposal_state(proposal_id: u64) -> String { @@ -108,13 +108,16 @@ pub fn all_untallied_delegator_votes() -> &'static str { "governance/untallied_delegator_vote/" } -pub fn deliver_single_dao_transaction_at_height(block_height: u64, proposal_id: u64) -> String { - format!("governance/deliver_dao_transactions/{block_height}/{proposal_id:020}") +pub fn deliver_single_community_pool_transaction_at_height( + block_height: u64, + proposal_id: u64, +) -> String { + format!("governance/deliver_community_pool_transactions/{block_height}/{proposal_id:020}") } -pub fn deliver_dao_transactions_at_height(block_height: u64) -> String { - // Note: this has to be the prefix of the `deliver_single_dao_transaction_at_height` function above. - format!("governance/deliver_dao_transactions/{block_height}/") +pub fn deliver_community_pool_transactions_at_height(block_height: u64) -> String { + // Note: this has to be the prefix of the `deliver_single_community_pool_transaction_at_height` function above. + format!("governance/deliver_community_pool_transactions/{block_height}/") } // This is in the app's JMT namespace, but governance needs to access diff --git a/crates/core/component/governance/src/validator_vote/action.rs b/crates/core/component/governance/src/validator_vote/action.rs index 9eb8be571c..3f0f4cd9a7 100644 --- a/crates/core/component/governance/src/validator_vote/action.rs +++ b/crates/core/component/governance/src/validator_vote/action.rs @@ -1,6 +1,7 @@ use decaf377_rdsa::{Signature, SpendAuth}; use penumbra_proto::{penumbra::core::component::governance::v1alpha1 as pb, DomainType}; use penumbra_stake::{GovernanceKey, IdentityKey}; +use penumbra_txhash::{EffectHash, EffectingData}; use serde::{Deserialize, Serialize}; use crate::vote::Vote; @@ -15,6 +16,25 @@ pub struct ValidatorVote { pub auth_sig: Signature, } +impl EffectingData for ValidatorVote { + fn effect_hash(&self) -> EffectHash { + EffectHash::from_proto_effecting_data(&self.to_proto()) + //self.body.effect_hash() + } +} + +/* +impl EffectingData for ValidatorVoteBody { + fn effect_hash(&self) -> EffectHash { + EffectHash::from_proto_effecting_data(&self.to_proto()) + } +} +*/ + +impl DomainType for ValidatorVote { + type Proto = pb::ValidatorVote; +} + impl From for pb::ValidatorVote { fn from(msg: ValidatorVote) -> Self { Self { diff --git a/crates/core/component/ibc/Cargo.toml b/crates/core/component/ibc/Cargo.toml index 15f510713c..356f5bfbcd 100644 --- a/crates/core/component/ibc/Cargo.toml +++ b/crates/core/component/ibc/Cargo.toml @@ -26,12 +26,12 @@ penumbra-asset = { path = "../../../core/asset", default-features = false } penumbra-num = { path = "../../../core/num", default-features = false } penumbra-keys = { path = "../../../core/keys", default-features = false } wrapper-derive = { path = "../../../util/wrapper-derive", optional = true } - penumbra-chain = { path = "../chain", default-features = false, optional = true } +penumbra-txhash = { path = "../../../core/txhash", default-features = false } # Penumbra dependencies -ibc-types = { version = "0.10.0", default-features = false } -ibc-proto = { version = "0.39.0", default-features = false } +ibc-types = { version = "0.11.0", default-features = false } +ibc-proto = { version = "0.40.0", default-features = false } # Crates.io deps ics23 = "0.11.0" diff --git a/crates/core/component/ibc/src/component.rs b/crates/core/component/ibc/src/component.rs index a681940504..10490adf97 100644 --- a/crates/core/component/ibc/src/component.rs +++ b/crates/core/component/ibc/src/component.rs @@ -4,6 +4,7 @@ mod client; mod client_counter; mod connection; mod connection_counter; +mod ics02_validation; #[cfg(feature = "rpc")] pub mod rpc; @@ -24,7 +25,9 @@ use msg_handler::MsgHandler; pub use self::metrics::register_metrics; pub use channel::StateReadExt as ChannelStateReadExt; pub use client::StateReadExt as ClientStateReadExt; +pub use client::StateWriteExt as ClientStateWriteExt; pub use connection::StateReadExt as ConnectionStateReadExt; +pub use connection::StateWriteExt as ConnectionStateWriteExt; pub use view::{StateReadExt, StateWriteExt}; pub use ibc_component::IBCComponent; diff --git a/crates/core/component/ibc/src/component/client.rs b/crates/core/component/ibc/src/component/client.rs index 2948fc4675..1de6a2ec8e 100644 --- a/crates/core/component/ibc/src/component/client.rs +++ b/crates/core/component/ibc/src/component/client.rs @@ -45,7 +45,7 @@ pub(crate) trait Ics2ClientExt: StateWrite { // if we have a stored consensus state for this height that conflicts, we need to freeze // the client. if it doesn't conflict, we can return early if let Ok(stored_cs_state) = self - .get_verified_consensus_state(verified_header.height(), client_id.clone()) + .get_verified_consensus_state(&verified_header.height(), &client_id) .await { if stored_cs_state == verified_consensus_state { @@ -66,11 +66,11 @@ pub(crate) trait Ics2ClientExt: StateWrite { // have. In that case, we need to verify that the timestamp is correct. if it isn't, freeze // the client. let next_consensus_state = self - .next_verified_consensus_state(&client_id, verified_header.height()) + .next_verified_consensus_state(&client_id, &verified_header.height()) .await .expect("able to get next verified consensus state"); let prev_consensus_state = self - .prev_verified_consensus_state(&client_id, verified_header.height()) + .prev_verified_consensus_state(&client_id, &verified_header.height()) .await .expect("able to get previous verified consensus state"); @@ -257,12 +257,12 @@ pub trait StateReadExt: StateRead { async fn get_verified_consensus_state( &self, - height: Height, - client_id: ClientId, + height: &Height, + client_id: &ClientId, ) -> Result { self.get( &IBC_COMMITMENT_PREFIX - .apply_string(ClientConsensusStatePath::new(&client_id, &height).to_string()), + .apply_string(ClientConsensusStatePath::new(client_id, height).to_string()), ) .await? .ok_or_else(|| { @@ -309,7 +309,7 @@ pub trait StateReadExt: StateRead { async fn next_verified_consensus_state( &self, client_id: &ClientId, - height: Height, + height: &Height, ) -> Result> { let mut verified_heights = self.get_verified_heights(client_id) @@ -327,7 +327,7 @@ pub trait StateReadExt: StateRead { .find(|&verified_height| verified_height > &height) { let next_cons_state = self - .get_verified_consensus_state(*next_height, client_id.clone()) + .get_verified_consensus_state(next_height, client_id) .await?; return Ok(Some(next_cons_state)); } else { @@ -340,7 +340,7 @@ pub trait StateReadExt: StateRead { async fn prev_verified_consensus_state( &self, client_id: &ClientId, - height: Height, + height: &Height, ) -> Result> { let mut verified_heights = self.get_verified_heights(client_id) @@ -358,7 +358,7 @@ pub trait StateReadExt: StateRead { .find(|&verified_height| verified_height < &height) { let prev_cons_state = self - .get_verified_consensus_state(*prev_height, client_id.clone()) + .get_verified_consensus_state(prev_height, client_id) .await?; return Ok(Some(prev_cons_state)); } else { diff --git a/crates/core/component/ibc/src/component/client_counter.rs b/crates/core/component/ibc/src/component/client_counter.rs index 01cc64f5d7..70d0673498 100644 --- a/crates/core/component/ibc/src/component/client_counter.rs +++ b/crates/core/component/ibc/src/component/client_counter.rs @@ -1,8 +1,5 @@ -use crate::IBC_PROOF_SPECS; -use ibc_proto::google::protobuf::Any; use ibc_types::core::client::Height; -use ibc_types::core::connection::{ChainId, ConnectionId}; -use ibc_types::lightclients::tendermint::TrustThreshold; +use ibc_types::core::connection::ConnectionId; use penumbra_proto::{penumbra::core::component::ibc::v1alpha1 as pb, DomainType}; #[derive(Clone, Debug)] @@ -89,167 +86,3 @@ impl From for pb::ClientConnections { } } } - -pub(crate) mod ics02_validation { - use anyhow::{anyhow, Result}; - use ibc_proto::google::protobuf::Any; - use ibc_types::lightclients::tendermint::client_state::{ - ClientState as TendermintClientState, TENDERMINT_CLIENT_STATE_TYPE_URL, - }; - use ibc_types::lightclients::tendermint::consensus_state::{ - ConsensusState as TendermintConsensusState, TENDERMINT_CONSENSUS_STATE_TYPE_URL, - }; - use ibc_types::lightclients::tendermint::header::{ - Header as TendermintHeader, TENDERMINT_HEADER_TYPE_URL, - }; - use ibc_types::lightclients::tendermint::misbehaviour::{ - Misbehaviour as TendermintMisbehavior, TENDERMINT_MISBEHAVIOUR_TYPE_URL, - }; - - pub fn is_tendermint_header_state(header: &Any) -> bool { - header.type_url.as_str() == TENDERMINT_HEADER_TYPE_URL - } - pub fn is_tendermint_consensus_state(consensus_state: &Any) -> bool { - consensus_state.type_url.as_str() == TENDERMINT_CONSENSUS_STATE_TYPE_URL - } - pub fn is_tendermint_client_state(client_state: &Any) -> bool { - client_state.type_url.as_str() == TENDERMINT_CLIENT_STATE_TYPE_URL - } - pub fn is_tendermint_misbehavior(misbehavior: &Any) -> bool { - misbehavior.type_url.as_str() == TENDERMINT_MISBEHAVIOUR_TYPE_URL - } - - pub fn get_tendermint_misbehavior(misbehavior: Any) -> Result { - if is_tendermint_misbehavior(&misbehavior) { - TendermintMisbehavior::try_from(misbehavior) - .map_err(|e| anyhow!(format!("failed to deserialize tendermint misbehavior: {e}"))) - } else { - anyhow::bail!(format!( - "expected a tendermint light client misbehavior, got: {}", - misbehavior.type_url.as_str() - )) - } - } - - pub fn get_tendermint_header(header: Any) -> Result { - if is_tendermint_header_state(&header) { - TendermintHeader::try_from(header) - .map_err(|e| anyhow!(format!("failed to deserialize tendermint header: {e}"))) - } else { - anyhow::bail!(format!( - "expected a tendermint light client header, got: {}", - header.type_url.as_str() - )) - } - } - - pub fn get_tendermint_consensus_state( - consensus_state: Any, - ) -> Result { - if is_tendermint_consensus_state(&consensus_state) { - TendermintConsensusState::try_from(consensus_state).map_err(|e| { - anyhow!(format!( - "failed to deserialize tendermint consensus state: {e}" - )) - }) - } else { - anyhow::bail!(format!( - "expected tendermint consensus state, got: {}", - consensus_state.type_url.as_str() - )) - } - } - pub fn get_tendermint_client_state(client_state: Any) -> Result { - if is_tendermint_client_state(&client_state) { - TendermintClientState::try_from(client_state).map_err(|e| { - anyhow!(format!( - "failed to deserialize tendermint client state: {e}" - )) - }) - } else { - anyhow::bail!(format!( - "expected tendermint client state, got: {}", - client_state.type_url.as_str() - )) - } - } -} - -// Check that the trust threshold is: -// -// a) non-zero -// b) greater or equal to 1/3 -// c) strictly less than 1 -fn validate_trust_threshold(trust_threshold: TrustThreshold) -> anyhow::Result<()> { - if trust_threshold.denominator() == 0 { - anyhow::bail!("trust threshold denominator cannot be zero"); - } - - if trust_threshold.numerator() * 3 < trust_threshold.denominator() { - anyhow::bail!("trust threshold must be greater than 1/3"); - } - - if trust_threshold.numerator() >= trust_threshold.denominator() { - anyhow::bail!("trust threshold must be strictly less than 1"); - } - - Ok(()) -} - -// validate the parameters of an AnyClientState, verifying that it is a valid Penumbra client -// state. -pub fn validate_penumbra_client_state( - client_state: Any, - chain_id: &str, - current_height: u64, -) -> anyhow::Result<()> { - let tm_client_state = ics02_validation::get_tendermint_client_state(client_state)?; - - if tm_client_state.frozen_height.is_some() { - anyhow::bail!("invalid client state: frozen"); - } - - // NOTE: Chain ID validation is actually not standardized yet. see - // https://github.com/informalsystems/ibc-rs/pull/304#discussion_r503917283 - let chain_id = ChainId::from_string(chain_id); - if chain_id != tm_client_state.chain_id { - anyhow::bail!("invalid client state: chain id does not match"); - } - - // check that the revision number is the same as our chain ID's version - if tm_client_state.latest_height().revision_number() != chain_id.version() { - anyhow::bail!("invalid client state: revision number does not match"); - } - - // check that the latest height isn't gte the current block height - if tm_client_state.latest_height().revision_height() >= current_height { - anyhow::bail!( - "invalid client state: latest height is greater than or equal to the current block height" - ); - } - - // check client proof specs match penumbra proof specs - if IBC_PROOF_SPECS.clone() != tm_client_state.proof_specs { - // allow legacy proof specs without prehash_key_before_comparison - let mut spec_with_prehash_key = tm_client_state.proof_specs.clone(); - spec_with_prehash_key[0].prehash_key_before_comparison = true; - spec_with_prehash_key[1].prehash_key_before_comparison = true; - if IBC_PROOF_SPECS.clone() != spec_with_prehash_key { - anyhow::bail!("invalid client state: proof specs do not match"); - } - } - - // check that the trust level is correct - validate_trust_threshold(tm_client_state.trust_level)?; - - // TODO: check that the unbonding period is correct - // - // - check unbonding period is greater than trusting period - if tm_client_state.unbonding_period < tm_client_state.trusting_period { - anyhow::bail!("invalid client state: unbonding period is less than trusting period"); - } - - // TODO: check upgrade path - - Ok(()) -} diff --git a/crates/core/component/ibc/src/component/ics02_validation.rs b/crates/core/component/ibc/src/component/ics02_validation.rs new file mode 100644 index 0000000000..144f4a7abe --- /dev/null +++ b/crates/core/component/ibc/src/component/ics02_validation.rs @@ -0,0 +1,160 @@ +use crate::IBC_PROOF_SPECS; +use anyhow::{anyhow, Result}; +use ibc_proto::google::protobuf::Any; +use ibc_types::{ + core::connection::ChainId, + lightclients::tendermint::{ + client_state::{ClientState as TendermintClientState, TENDERMINT_CLIENT_STATE_TYPE_URL}, + consensus_state::{ + ConsensusState as TendermintConsensusState, TENDERMINT_CONSENSUS_STATE_TYPE_URL, + }, + header::{Header as TendermintHeader, TENDERMINT_HEADER_TYPE_URL}, + misbehaviour::{Misbehaviour as TendermintMisbehavior, TENDERMINT_MISBEHAVIOUR_TYPE_URL}, + TrustThreshold, + }, +}; + +pub fn is_tendermint_header_state(header: &Any) -> bool { + header.type_url.as_str() == TENDERMINT_HEADER_TYPE_URL +} +pub fn is_tendermint_consensus_state(consensus_state: &Any) -> bool { + consensus_state.type_url.as_str() == TENDERMINT_CONSENSUS_STATE_TYPE_URL +} +pub fn is_tendermint_client_state(client_state: &Any) -> bool { + client_state.type_url.as_str() == TENDERMINT_CLIENT_STATE_TYPE_URL +} +pub fn is_tendermint_misbehavior(misbehavior: &Any) -> bool { + misbehavior.type_url.as_str() == TENDERMINT_MISBEHAVIOUR_TYPE_URL +} + +pub fn get_tendermint_misbehavior(misbehavior: Any) -> Result { + if is_tendermint_misbehavior(&misbehavior) { + TendermintMisbehavior::try_from(misbehavior) + .map_err(|e| anyhow!(format!("failed to deserialize tendermint misbehavior: {e}"))) + } else { + anyhow::bail!(format!( + "expected a tendermint light client misbehavior, got: {}", + misbehavior.type_url.as_str() + )) + } +} + +pub fn get_tendermint_header(header: Any) -> Result { + if is_tendermint_header_state(&header) { + TendermintHeader::try_from(header) + .map_err(|e| anyhow!(format!("failed to deserialize tendermint header: {e}"))) + } else { + anyhow::bail!(format!( + "expected a tendermint light client header, got: {}", + header.type_url.as_str() + )) + } +} + +pub fn get_tendermint_consensus_state(consensus_state: Any) -> Result { + if is_tendermint_consensus_state(&consensus_state) { + TendermintConsensusState::try_from(consensus_state).map_err(|e| { + anyhow!(format!( + "failed to deserialize tendermint consensus state: {e}" + )) + }) + } else { + anyhow::bail!(format!( + "expected tendermint consensus state, got: {}", + consensus_state.type_url.as_str() + )) + } +} +pub fn get_tendermint_client_state(client_state: Any) -> Result { + if is_tendermint_client_state(&client_state) { + TendermintClientState::try_from(client_state).map_err(|e| { + anyhow!(format!( + "failed to deserialize tendermint client state: {e}" + )) + }) + } else { + anyhow::bail!(format!( + "expected tendermint client state, got: {}", + client_state.type_url.as_str() + )) + } +} + +// validate the parameters of an AnyClientState, verifying that it is a valid Penumbra client +// state. +pub fn validate_penumbra_client_state( + client_state: Any, + chain_id: &str, + current_height: u64, +) -> anyhow::Result<()> { + let tm_client_state = get_tendermint_client_state(client_state)?; + + if tm_client_state.frozen_height.is_some() { + anyhow::bail!("invalid client state: frozen"); + } + + // NOTE: Chain ID validation is actually not standardized yet. see + // https://github.com/informalsystems/ibc-rs/pull/304#discussion_r503917283 + let chain_id = ChainId::from_string(chain_id); + if chain_id != tm_client_state.chain_id { + anyhow::bail!("invalid client state: chain id does not match"); + } + + // check that the revision number is the same as our chain ID's version + if tm_client_state.latest_height().revision_number() != chain_id.version() { + anyhow::bail!("invalid client state: revision number does not match"); + } + + // check that the latest height isn't gte the current block height + if tm_client_state.latest_height().revision_height() >= current_height { + anyhow::bail!( + "invalid client state: latest height is greater than or equal to the current block height" + ); + } + + // check client proof specs match penumbra proof specs + if IBC_PROOF_SPECS.clone() != tm_client_state.proof_specs { + // allow legacy proof specs without prehash_key_before_comparison + let mut spec_with_prehash_key = tm_client_state.proof_specs.clone(); + spec_with_prehash_key[0].prehash_key_before_comparison = true; + spec_with_prehash_key[1].prehash_key_before_comparison = true; + if IBC_PROOF_SPECS.clone() != spec_with_prehash_key { + anyhow::bail!("invalid client state: proof specs do not match"); + } + } + + // check that the trust level is correct + validate_trust_threshold(tm_client_state.trust_level)?; + + // TODO: check that the unbonding period is correct + // + // - check unbonding period is greater than trusting period + if tm_client_state.unbonding_period < tm_client_state.trusting_period { + anyhow::bail!("invalid client state: unbonding period is less than trusting period"); + } + + // TODO: check upgrade path + + Ok(()) +} + +// Check that the trust threshold is: +// +// a) non-zero +// b) greater or equal to 1/3 +// c) strictly less than 1 +fn validate_trust_threshold(trust_threshold: TrustThreshold) -> anyhow::Result<()> { + if trust_threshold.denominator() == 0 { + anyhow::bail!("trust threshold denominator cannot be zero"); + } + + if trust_threshold.numerator() * 3 < trust_threshold.denominator() { + anyhow::bail!("trust threshold must be greater than 1/3"); + } + + if trust_threshold.numerator() >= trust_threshold.denominator() { + anyhow::bail!("trust threshold must be strictly less than 1"); + } + + Ok(()) +} diff --git a/crates/core/component/ibc/src/component/metrics.rs b/crates/core/component/ibc/src/component/metrics.rs index 8f5131ec82..668c4d13b5 100644 --- a/crates/core/component/ibc/src/component/metrics.rs +++ b/crates/core/component/ibc/src/component/metrics.rs @@ -11,6 +11,7 @@ //! This trick is probably good to avoid in general, because it could be //! confusing, but in this limited case, it seems like a clean option. +#[allow(unused_imports)] pub use metrics::*; /// Registers all metrics used by this crate. diff --git a/crates/core/component/ibc/src/component/msg_handler/connection_open_ack.rs b/crates/core/component/ibc/src/component/msg_handler/connection_open_ack.rs index ab4fb14307..de2bdf3f66 100644 --- a/crates/core/component/ibc/src/component/msg_handler/connection_open_ack.rs +++ b/crates/core/component/ibc/src/component/msg_handler/connection_open_ack.rs @@ -12,8 +12,8 @@ use ibc_types::path::{ClientConsensusStatePath, ClientStatePath, ConnectionPath} use crate::{ component::{ client::StateReadExt as _, - client_counter::validate_penumbra_client_state, connection::{StateReadExt as _, StateWriteExt as _}, + ics02_validation::validate_penumbra_client_state, proof_verification, MsgHandler, }, IBC_COMMITMENT_PREFIX, @@ -78,7 +78,7 @@ impl MsgHandler for MsgConnectionOpenAck { // get the stored consensus state for the counterparty let trusted_consensus_state = state - .get_verified_consensus_state(self.proofs_height_on_b, connection.client_id.clone()) + .get_verified_consensus_state(&self.proofs_height_on_b, &connection.client_id) .await?; // PROOF VERIFICATION diff --git a/crates/core/component/ibc/src/component/msg_handler/connection_open_confirm.rs b/crates/core/component/ibc/src/component/msg_handler/connection_open_confirm.rs index ae505a1f7c..224351e754 100644 --- a/crates/core/component/ibc/src/component/msg_handler/connection_open_confirm.rs +++ b/crates/core/component/ibc/src/component/msg_handler/connection_open_confirm.rs @@ -66,7 +66,7 @@ impl MsgHandler for MsgConnectionOpenConfirm { // get the stored consensus state for the counterparty let trusted_consensus_state = state - .get_verified_consensus_state(self.proof_height_on_a, connection.client_id.clone()) + .get_verified_consensus_state(&self.proof_height_on_a, &connection.client_id) .await?; // PROOF VERIFICATION diff --git a/crates/core/component/ibc/src/component/msg_handler/connection_open_try.rs b/crates/core/component/ibc/src/component/msg_handler/connection_open_try.rs index f732b1c3f1..6c739d859f 100644 --- a/crates/core/component/ibc/src/component/msg_handler/connection_open_try.rs +++ b/crates/core/component/ibc/src/component/msg_handler/connection_open_try.rs @@ -17,9 +17,9 @@ use ibc_types::{ use crate::component::{ client::StateReadExt as _, - client_counter::validate_penumbra_client_state, connection::{StateReadExt as _, StateWriteExt as _}, connection_counter::SUPPORTED_VERSIONS, + ics02_validation::validate_penumbra_client_state, MsgHandler, }; @@ -94,7 +94,7 @@ impl MsgHandler for MsgConnectionOpenTry { // get the stored consensus state for the counterparty let trusted_consensus_state = state - .get_verified_consensus_state(self.proofs_height_on_a, self.client_id_on_b.clone()) + .get_verified_consensus_state(&self.proofs_height_on_a, &self.client_id_on_b) .await?; // PROOF VERIFICATION diff --git a/crates/core/component/ibc/src/component/msg_handler/create_client.rs b/crates/core/component/ibc/src/component/msg_handler/create_client.rs index 64884e98d8..fbf3ae9c5f 100644 --- a/crates/core/component/ibc/src/component/msg_handler/create_client.rs +++ b/crates/core/component/ibc/src/component/msg_handler/create_client.rs @@ -9,8 +9,8 @@ use ibc_types::{ use crate::component::{ client::{ConsensusStateWriteExt as _, StateReadExt as _, StateWriteExt as _}, - client_counter::{ics02_validation, ClientCounter}, - MsgHandler, + client_counter::ClientCounter, + ics02_validation, MsgHandler, }; #[async_trait] diff --git a/crates/core/component/ibc/src/component/msg_handler/misbehavior.rs b/crates/core/component/ibc/src/component/msg_handler/misbehavior.rs index cf853c3d59..e81b69d766 100644 --- a/crates/core/component/ibc/src/component/msg_handler/misbehavior.rs +++ b/crates/core/component/ibc/src/component/msg_handler/misbehavior.rs @@ -14,12 +14,9 @@ use tendermint_light_client_verifier::{ use cnidarium_component::ChainStateReadExt; -use crate::component::client::StateWriteExt as _; -use crate::component::client_counter::ics02_validation; -use crate::component::ClientStateReadExt as _; - use super::update_client::verify_header_validator_set; use super::MsgHandler; +use crate::component::{client::StateWriteExt as _, ics02_validation, ClientStateReadExt as _}; #[async_trait] impl MsgHandler for MsgSubmitMisbehaviour { @@ -66,14 +63,14 @@ impl MsgHandler for MsgSubmitMisbehaviour { verify_misbehavior_header( &state, - untrusted_misbehavior.client_id.clone(), + &untrusted_misbehavior.client_id, &untrusted_misbehavior.header1, &trusted_client_state, ) .await?; verify_misbehavior_header( &state, - untrusted_misbehavior.client_id.clone(), + &untrusted_misbehavior.client_id, &untrusted_misbehavior.header2, &trusted_client_state, ) @@ -117,13 +114,13 @@ fn client_is_not_frozen(client: &TendermintClientState) -> anyhow::Result<()> { async fn verify_misbehavior_header( state: &S, - client_id: ClientId, + client_id: &ClientId, mb_header: &TendermintHeader, trusted_client_state: &TendermintClientState, ) -> Result<()> { let trusted_height = mb_header.trusted_height; let last_trusted_consensus_state = state - .get_verified_consensus_state(trusted_height, client_id) + .get_verified_consensus_state(&trusted_height, &client_id) .await?; let trusted_height = trusted_height diff --git a/crates/core/component/ibc/src/component/msg_handler/update_client.rs b/crates/core/component/ibc/src/component/msg_handler/update_client.rs index b430688ed4..68e1ac97cf 100644 --- a/crates/core/component/ibc/src/component/msg_handler/update_client.rs +++ b/crates/core/component/ibc/src/component/msg_handler/update_client.rs @@ -20,8 +20,7 @@ use crate::component::{ client::{ ConsensusStateWriteExt as _, Ics2ClientExt as _, StateReadExt as _, StateWriteExt as _, }, - client_counter::ics02_validation, - MsgHandler, + ics02_validation, MsgHandler, }; #[async_trait] @@ -60,7 +59,7 @@ impl MsgHandler for MsgUpdateClient { // We use the specified trusted height to query the trusted // consensus state the update extends. let last_trusted_consensus_state = state - .get_verified_consensus_state(trusted_height, self.client_id.clone()) + .get_verified_consensus_state(&trusted_height, &self.client_id) .await?; // We also have to convert from an IBC height, which has two @@ -176,9 +175,10 @@ async fn update_is_already_committed( // check if we already have a consensus state for this height, if we do, check that it is // the same as this update, if it is, return early. - let untrusted_consensus_state = TendermintConsensusState::from(untrusted_header.clone()); + let height = untrusted_header.height(); + let untrusted_consensus_state = TendermintConsensusState::from(untrusted_header); if let Ok(stored_consensus_state) = state - .get_verified_consensus_state(untrusted_header.height(), client_id.clone()) + .get_verified_consensus_state(&height, &client_id) .await { let stored_tm_consensus_state = stored_consensus_state; @@ -198,7 +198,7 @@ async fn client_is_not_expired( client_state: &TendermintClientState, ) -> anyhow::Result<()> { let latest_consensus_state = state - .get_verified_consensus_state(client_state.latest_height(), client_id.clone()) + .get_verified_consensus_state(&client_state.latest_height(), client_id) .await?; // TODO(erwan): for now there is no casting that needs to happen because `get_verified_consensus_state` does not return an diff --git a/crates/core/component/ibc/src/component/proof_verification.rs b/crates/core/component/ibc/src/component/proof_verification.rs index 08d8dcae01..c18562606d 100644 --- a/crates/core/component/ibc/src/component/proof_verification.rs +++ b/crates/core/component/ibc/src/component/proof_verification.rs @@ -139,7 +139,7 @@ pub trait ClientUpgradeProofVerifier: StateReadExt { // get the stored consensus state for the counterparty let trusted_consensus_state = self - .get_verified_consensus_state(trusted_client_state.latest_height(), client_id.clone()) + .get_verified_consensus_state(&trusted_client_state.latest_height(), client_id) .await?; verify_merkle_proof( @@ -192,7 +192,7 @@ pub trait ChannelProofVerifier: StateReadExt { // get the stored consensus state for the counterparty let trusted_consensus_state = self - .get_verified_consensus_state(*proof_height, connection.client_id.clone()) + .get_verified_consensus_state(proof_height, &connection.client_id) .await?; trusted_client_state.verify_height(*proof_height)?; @@ -438,9 +438,8 @@ mod inner { anyhow::bail!("client is frozen"); } - let trusted_consensus_state = self - .get_verified_consensus_state(*height, client_id.clone()) - .await?; + let trusted_consensus_state = + self.get_verified_consensus_state(height, client_id).await?; let tm_client_state = trusted_client_state; diff --git a/crates/core/component/ibc/src/component/rpc/client_query.rs b/crates/core/component/ibc/src/component/rpc/client_query.rs index 68ecc246ab..7fe17d6dd6 100644 --- a/crates/core/component/ibc/src/component/rpc/client_query.rs +++ b/crates/core/component/ibc/src/component/rpc/client_query.rs @@ -2,17 +2,20 @@ use async_trait::async_trait; use cnidarium_component::ChainStateReadExt; use ibc_proto::ibc::core::client::v1::query_server::Query as ClientQuery; use ibc_proto::ibc::core::client::v1::{ - Height, IdentifiedClientState, QueryClientParamsRequest, QueryClientParamsResponse, - QueryClientStateRequest, QueryClientStateResponse, QueryClientStatesRequest, - QueryClientStatesResponse, QueryClientStatusRequest, QueryClientStatusResponse, - QueryConsensusStateHeightsRequest, QueryConsensusStateHeightsResponse, - QueryConsensusStateRequest, QueryConsensusStateResponse, QueryConsensusStatesRequest, - QueryConsensusStatesResponse, QueryUpgradedClientStateRequest, + ConsensusStateWithHeight, IdentifiedClientState, QueryClientParamsRequest, + QueryClientParamsResponse, QueryClientStateRequest, QueryClientStateResponse, + QueryClientStatesRequest, QueryClientStatesResponse, QueryClientStatusRequest, + QueryClientStatusResponse, QueryConsensusStateHeightsRequest, + QueryConsensusStateHeightsResponse, QueryConsensusStateRequest, QueryConsensusStateResponse, + QueryConsensusStatesRequest, QueryConsensusStatesResponse, QueryUpgradedClientStateRequest, QueryUpgradedClientStateResponse, QueryUpgradedConsensusStateRequest, QueryUpgradedConsensusStateResponse, }; use ibc_types::core::client::ClientId; +use ibc_types::core::client::Height; use ibc_types::lightclients::tendermint::client_state::TENDERMINT_CLIENT_STATE_TYPE_URL; +use ibc_types::lightclients::tendermint::consensus_state::TENDERMINT_CONSENSUS_STATE_TYPE_URL; +use ibc_types::path::ClientConsensusStatePath; use ibc_types::path::ClientStatePath; use ibc_types::DomainType; @@ -24,6 +27,7 @@ use crate::component::rpc::{IbcQuery, Storage}; use crate::component::ClientStateReadExt; use crate::prefix::MerklePrefixExt; use crate::IBC_COMMITMENT_PREFIX; +use penumbra_chain::component::StateReadExt as _; #[async_trait] impl> ClientQuery for IbcQuery { @@ -58,7 +62,7 @@ impl> ClientQuery for I // Client state may be None, which we'll convert to a NotFound response. let client_state = match cs_opt { // If found, convert to a suitable type to match - // https://docs.rs/ibc-proto/0.36.1/ibc_proto/ibc/core/client/v1/struct.QueryClientStateResponse.html + // https://docs.rs/ibc-proto/0.39.1/ibc_proto/ibc/core/client/v1/struct.QueryClientStateResponse.html Some(c) => ibc_proto::google::protobuf::Any { type_url: TENDERMINT_CLIENT_STATE_TYPE_URL.to_string(), value: c, @@ -73,11 +77,12 @@ impl> ClientQuery for I let res = QueryClientStateResponse { client_state: Some(client_state), proof: proof.encode_to_vec(), - proof_height: Some(height), + proof_height: Some(height.into()), }; Ok(tonic::Response::new(res)) } + /// ClientStates queries all the IBC light clients of a chain. async fn client_states( &self, @@ -111,30 +116,134 @@ impl> ClientQuery for I Ok(tonic::Response::new(res)) } + /// ConsensusState queries a consensus state associated with a client state at /// a given height. async fn consensus_state( &self, - _request: tonic::Request, + request: tonic::Request, ) -> std::result::Result, tonic::Status> { - Err(tonic::Status::unimplemented("not implemented")) + let snapshot = self.0.latest_snapshot(); + let client_id = ClientId::from_str(&request.get_ref().client_id) + .map_err(|e| tonic::Status::invalid_argument(format!("invalid client id: {e}")))?; + let height = if request.get_ref().latest_height { + get_latest_verified_height(&snapshot, &client_id).await? + } else { + Height { + revision_number: request.get_ref().revision_number, + revision_height: request.get_ref().revision_height, + } + }; + + let (cs_opt, proof) = snapshot + .get_with_proof( + IBC_COMMITMENT_PREFIX + .apply_string(ClientConsensusStatePath::new(&client_id, &height).to_string()) + .as_bytes() + .to_vec(), + ) + .await + .map_err(|e| tonic::Status::aborted(format!("couldn't get client: {e}")))?; + + // if state is None, convert to a NotFound response. + let consensus_state = match cs_opt { + // If found, convert to a suitable type to match + // https://docs.rs/ibc-proto/0.39.1/ibc_proto/ibc/core/client/v1/struct.QueryConsensusStateResponse.html + Some(c) => ibc_proto::google::protobuf::Any { + type_url: TENDERMINT_CONSENSUS_STATE_TYPE_URL.to_string(), + value: c, + }, + None => { + return Err(tonic::Status::not_found(format!( + "couldn't find client: {client_id}" + ))) + } + }; + + let res = QueryConsensusStateResponse { + consensus_state: Some(consensus_state), + proof: proof.encode_to_vec(), + proof_height: Some(height.into()), + }; + + Ok(tonic::Response::new(res)) } + /// ConsensusStates queries all the consensus state associated with a given /// client. async fn consensus_states( &self, - _request: tonic::Request, + request: tonic::Request, ) -> std::result::Result, tonic::Status> { - Err(tonic::Status::unimplemented("not implemented")) + let snapshot = self.0.latest_snapshot(); + let client_id = ClientId::from_str(&request.get_ref().client_id) + .map_err(|e| tonic::Status::invalid_argument(format!("invalid client id: {e}")))?; + + let verified_heights = snapshot + .get_verified_heights(&client_id) + .await + .map_err(|e| tonic::Status::aborted(format!("couldn't get verified heights: {e}")))?; + let resp = if let Some(verified_heights) = verified_heights { + let mut consensus_states = Vec::with_capacity(verified_heights.heights.len()); + for height in verified_heights.heights { + let consensus_state = snapshot + .get_verified_consensus_state(&height, &client_id) + .await + .map_err(|e| { + tonic::Status::aborted(format!("couldn't get consensus state: {e}")) + })?; + consensus_states.push(ConsensusStateWithHeight { + height: Some(height.into()), + consensus_state: Some(consensus_state.into()), + }); + } + QueryConsensusStatesResponse { + consensus_states, + pagination: None, + } + } else { + QueryConsensusStatesResponse { + consensus_states: vec![], + pagination: None, + } + }; + + Ok(tonic::Response::new(resp)) } + /// ConsensusStateHeights queries the height of every consensus states associated with a given client. async fn consensus_state_heights( &self, - _request: tonic::Request, + request: tonic::Request, ) -> std::result::Result, tonic::Status> { - Err(tonic::Status::unimplemented("not implemented")) + let snapshot = self.0.latest_snapshot(); + let client_id = ClientId::from_str(&request.get_ref().client_id) + .map_err(|e| tonic::Status::invalid_argument(format!("invalid client id: {e}")))?; + + let verified_heights = snapshot + .get_verified_heights(&client_id) + .await + .map_err(|e| tonic::Status::aborted(format!("couldn't get verified heights: {e}")))?; + let resp = if let Some(verified_heights) = verified_heights { + QueryConsensusStateHeightsResponse { + consensus_state_heights: verified_heights + .heights + .into_iter() + .map(|h| h.into()) + .collect(), + pagination: None, + } + } else { + QueryConsensusStateHeightsResponse { + consensus_state_heights: vec![], + pagination: None, + } + }; + + Ok(tonic::Response::new(resp)) } + /// Status queries the status of an IBC client. async fn client_status( &self, @@ -165,3 +274,28 @@ impl> ClientQuery for I Err(tonic::Status::unimplemented("not implemented")) } } + +async fn get_latest_verified_height( + snapshot: &cnidarium::Snapshot, + client_id: &ClientId, +) -> Result { + let verified_heights = snapshot + .get_verified_heights(&client_id) + .await + .map_err(|e| tonic::Status::aborted(format!("couldn't get verified heights: {e}")))?; + + let Some(mut verified_heights) = verified_heights else { + return Err(tonic::Status::not_found( + "couldn't find verified heights for client: {client_id}", + )); + }; + + verified_heights.heights.sort(); + if verified_heights.heights.is_empty() { + return Err(tonic::Status::not_found( + "verified heights for client were empty: {client_id}", + )); + } + + Ok(verified_heights.heights.pop().expect("must be non-empty")) +} diff --git a/crates/core/component/ibc/src/component/rpc/connection_query.rs b/crates/core/component/ibc/src/component/rpc/connection_query.rs index d14a8baefe..7521255134 100644 --- a/crates/core/component/ibc/src/component/rpc/connection_query.rs +++ b/crates/core/component/ibc/src/component/rpc/connection_query.rs @@ -1,7 +1,7 @@ use async_trait::async_trait; use cnidarium_component::ChainStateReadExt; -use ibc_proto::ibc::core::client::v1::Height; +use ibc_proto::ibc::core::client::v1::{Height, IdentifiedClientState}; use ibc_proto::ibc::core::connection::v1::query_server::Query as ConnectionQuery; use ibc_proto::ibc::core::connection::v1::{ ConnectionEnd, QueryClientConnectionsRequest, QueryClientConnectionsResponse, @@ -11,8 +11,11 @@ use ibc_proto::ibc::core::connection::v1::{ QueryConnectionsResponse, }; -use ibc_types::core::connection::{ConnectionId, IdentifiedConnectionEnd}; -use ibc_types::path::ConnectionPath; +use ibc_types::core::client::ClientId; +use ibc_types::core::connection::{ClientPaths, ConnectionId, IdentifiedConnectionEnd}; +use ibc_types::path::{ + ClientConnectionPath, ClientConsensusStatePath, ClientStatePath, ConnectionPath, +}; use ibc_types::DomainType; use prost::Message; use std::str::FromStr; @@ -133,26 +136,140 @@ impl> ConnectionQuery f /// state. async fn client_connections( &self, - _request: tonic::Request, + request: tonic::Request, ) -> std::result::Result, tonic::Status> { - Err(tonic::Status::unimplemented("not implemented")) + let snapshot = self.0.latest_snapshot(); + let client_id = &ClientId::from_str(&request.get_ref().client_id) + .map_err(|e| tonic::Status::aborted(format!("invalid client id: {e}")))?; + + let (client_connections, proof) = snapshot + .get_with_proof( + IBC_COMMITMENT_PREFIX + .apply_string(ClientConnectionPath::new(client_id).to_string()) + .as_bytes() + .to_vec(), + ) + .await + .map_err(|e| tonic::Status::aborted(format!("couldn't get client connections: {e}")))?; + + let connection_paths: Vec = client_connections + .map(|client_connections| ClientPaths::decode(client_connections.as_ref())) + .transpose() + .map_err(|e| { + tonic::Status::aborted(format!("couldn't decode client connections: {e}")) + })? + .map(|client_paths| client_paths.paths) + .map(|paths| paths.into_iter().map(|path| path.to_string()).collect()) + .unwrap_or_default(); + + Ok(tonic::Response::new(QueryClientConnectionsResponse { + connection_paths, + proof: proof.encode_to_vec(), + proof_height: Some(Height { + revision_number: 0, + revision_height: snapshot.version(), + }), + })) } /// ConnectionClientState queries the client state associated with the /// connection. async fn connection_client_state( &self, - _request: tonic::Request, + request: tonic::Request, ) -> std::result::Result, tonic::Status> { - Err(tonic::Status::unimplemented("not implemented")) + let snapshot = self.0.latest_snapshot(); + let connection_id = &ConnectionId::from_str(&request.get_ref().connection_id) + .map_err(|e| tonic::Status::aborted(format!("invalid connection id: {e}")))?; + + let client_id = snapshot + .get_connection(connection_id) + .await + .map_err(|e| tonic::Status::aborted(format!("couldn't get connection: {e}")))? + .ok_or("unable to get connection") + .map_err(|e| tonic::Status::aborted(format!("couldn't get connection: {e}")))? + .client_id; + + let (client_state, proof) = snapshot + .get_with_proof( + IBC_COMMITMENT_PREFIX + .apply_string(ClientStatePath::new(&client_id).to_string()) + .as_bytes() + .to_vec(), + ) + .await + .map_err(|e| tonic::Status::aborted(format!("couldn't get client state: {e}")))?; + + let client_state_any = client_state + .map(|cs_bytes| ibc_proto::google::protobuf::Any::decode(cs_bytes.as_ref())) + .transpose() + .map_err(|e| tonic::Status::aborted(format!("couldn't decode client state: {e}")))?; + + let identified_client_state = IdentifiedClientState { + client_id: client_id.clone().to_string(), + client_state: client_state_any, + }; + + Ok(tonic::Response::new(QueryConnectionClientStateResponse { + identified_client_state: Some(identified_client_state), + proof: proof.encode_to_vec(), + proof_height: Some(Height { + revision_number: 0, + revision_height: snapshot.version(), + }), + })) } /// ConnectionConsensusState queries the consensus state associated with the /// connection. async fn connection_consensus_state( &self, - _request: tonic::Request, + request: tonic::Request, ) -> std::result::Result, tonic::Status> { - Err(tonic::Status::unimplemented("not implemented")) + let snapshot = self.0.latest_snapshot(); + let consensus_state_height = ibc_types::core::client::Height { + revision_number: request.get_ref().revision_number, + revision_height: request.get_ref().revision_height, + }; + let connection_id = &ConnectionId::from_str(&request.get_ref().connection_id) + .map_err(|e| tonic::Status::aborted(format!("invalid connection id: {e}")))?; + + let client_id = snapshot + .get_connection(connection_id) + .await + .map_err(|e| tonic::Status::aborted(format!("couldn't get connection: {e}")))? + .ok_or("unable to get connection") + .map_err(|e| tonic::Status::aborted(format!("couldn't get connection: {e}")))? + .client_id; + + let (consensus_state, proof) = snapshot + .get_with_proof( + IBC_COMMITMENT_PREFIX + .apply_string( + ClientConsensusStatePath::new(&client_id, &consensus_state_height) + .to_string(), + ) + .as_bytes() + .to_vec(), + ) + .await + .map_err(|e| tonic::Status::aborted(format!("couldn't get client state: {e}")))?; + + let consensus_state_any = consensus_state + .map(|cs_bytes| ibc_proto::google::protobuf::Any::decode(cs_bytes.as_ref())) + .transpose() + .map_err(|e| tonic::Status::aborted(format!("couldn't decode client state: {e}")))?; + + Ok(tonic::Response::new( + QueryConnectionConsensusStateResponse { + consensus_state: consensus_state_any, + client_id: client_id.to_string(), + proof: proof.encode_to_vec(), + proof_height: Some(Height { + revision_number: 0, + revision_height: snapshot.version(), + }), + }, + )) } } diff --git a/crates/core/component/ibc/src/component/rpc/consensus_query.rs b/crates/core/component/ibc/src/component/rpc/consensus_query.rs index 002e7c9d05..2e88efa3ea 100644 --- a/crates/core/component/ibc/src/component/rpc/consensus_query.rs +++ b/crates/core/component/ibc/src/component/rpc/consensus_query.rs @@ -1,8 +1,10 @@ +use crate::prefix::MerklePrefixExt; +use crate::IBC_COMMITMENT_PREFIX; use async_trait::async_trait; use cnidarium_component::ChainStateReadExt; use ibc_proto::ibc::core::channel::v1::query_server::Query as ConsensusQuery; use ibc_proto::ibc::core::channel::v1::{ - PacketState, QueryChannelClientStateRequest, QueryChannelClientStateResponse, + Channel, PacketState, QueryChannelClientStateRequest, QueryChannelClientStateResponse, QueryChannelConsensusStateRequest, QueryChannelConsensusStateResponse, QueryChannelRequest, QueryChannelResponse, QueryChannelsRequest, QueryChannelsResponse, QueryConnectionChannelsRequest, QueryConnectionChannelsResponse, @@ -14,14 +16,21 @@ use ibc_proto::ibc::core::channel::v1::{ QueryPacketReceiptRequest, QueryPacketReceiptResponse, QueryUnreceivedAcksRequest, QueryUnreceivedAcksResponse, QueryUnreceivedPacketsRequest, QueryUnreceivedPacketsResponse, }; -use ibc_proto::ibc::core::client::v1::Height; +use ibc_proto::ibc::core::client::v1::{Height, IdentifiedClientState}; +use ibc_types::path::{ + AckPath, ChannelEndPath, ClientConsensusStatePath, ClientStatePath, CommitmentPath, + ReceiptPath, SeqRecvPath, SeqSendPath, +}; +use ibc_types::DomainType; + use ibc_types::core::channel::{ChannelId, IdentifiedChannelEnd, PortId}; use ibc_types::core::connection::ConnectionId; +use prost::Message; use std::str::FromStr; use crate::component::rpc::{Snapshot, Storage}; -use crate::component::ChannelStateReadExt; +use crate::component::{ChannelStateReadExt, ConnectionStateReadExt}; use super::IbcQuery; @@ -30,9 +39,45 @@ impl> ConsensusQuery fo /// Channel queries an IBC Channel. async fn channel( &self, - _request: tonic::Request, + request: tonic::Request, ) -> std::result::Result, tonic::Status> { - Err(tonic::Status::unimplemented("not implemented")) + let snapshot = self.0.latest_snapshot(); + let channel_id = ChannelId::from_str(request.get_ref().channel_id.as_str()) + .map_err(|e| tonic::Status::aborted(format!("invalid channel id: {e}")))?; + let port_id = PortId::from_str(request.get_ref().port_id.as_str()) + .map_err(|e| tonic::Status::aborted(format!("invalid port id: {e}")))?; + + let (channel, proof) = snapshot + .get_with_proof( + IBC_COMMITMENT_PREFIX + .apply_string(ChannelEndPath::new(&port_id, &channel_id).to_string()) + .as_bytes() + .to_vec(), + ) + .await + .map(|res| { + let channel = res + .0 + .map(|chan_bytes| Channel::decode(chan_bytes.as_ref())) + .transpose(); + + (channel, res.1) + }) + .map_err(|e| tonic::Status::aborted(format!("couldn't get channel: {e}")))?; + + let channel = + channel.map_err(|e| tonic::Status::aborted(format!("couldn't decode channel: {e}")))?; + + let res = QueryChannelResponse { + channel, + proof: proof.encode_to_vec(), + proof_height: Some(Height { + revision_number: 0, + revision_height: snapshot.version(), + }), + }; + + Ok(tonic::Response::new(res)) } /// Channels queries all the IBC channels of a chain. async fn channels( @@ -137,25 +182,209 @@ impl> ConsensusQuery fo /// with the provided channel identifiers. async fn channel_client_state( &self, - _request: tonic::Request, + request: tonic::Request, ) -> std::result::Result, tonic::Status> { - Err(tonic::Status::unimplemented("not implemented")) + let snapshot = self.0.latest_snapshot(); + + // 1. get the channel + let channel_id = ChannelId::from_str(request.get_ref().channel_id.as_str()) + .map_err(|e| tonic::Status::aborted(format!("invalid channel id: {e}")))?; + let port_id = PortId::from_str(request.get_ref().port_id.as_str()) + .map_err(|e| tonic::Status::aborted(format!("invalid port id: {e}")))?; + + let channel = snapshot + .get_channel(&channel_id, &port_id) + .await + .map_err(|e| { + tonic::Status::aborted(format!( + "couldn't get channel {channel_id} for port {port_id}: {e}" + )) + })? + .ok_or("unable to get channel") + .map_err(|e| { + tonic::Status::aborted(format!( + "couldn't get channel {channel_id} for port {port_id}: {e}" + )) + })?; + + // 2. get the connection for the channel + let connection_id = channel + .connection_hops + .first() + .ok_or("channel has no connection hops") + .map_err(|e| { + tonic::Status::aborted(format!( + "couldn't get connection for channel {channel_id} for port {port_id}: {e}" + )) + })?; + + let connection = snapshot.get_connection(&connection_id).await.map_err(|e| { + tonic::Status::aborted(format!( + "couldn't get connection {connection_id} for channel {channel_id} for port {port_id}: {e}" + )) + })?.ok_or("unable to get connection").map_err(|e| { + tonic::Status::aborted(format!( + "couldn't get connection {connection_id} for channel {channel_id} for port {port_id}: {e}" + )) + })?; + + // 3. get the client state for the connection + let (client_state, proof) = snapshot + .get_with_proof( + IBC_COMMITMENT_PREFIX + .apply_string(ClientStatePath::new(&connection.client_id).to_string()) + .as_bytes() + .to_vec(), + ) + .await + .map_err(|e| tonic::Status::aborted(format!("couldn't get client state: {e}")))?; + + let client_state_any = client_state + .map(|cs_bytes| ibc_proto::google::protobuf::Any::decode(cs_bytes.as_ref())) + .transpose() + .map_err(|e| tonic::Status::aborted(format!("couldn't decode client state: {e}")))?; + + let identified_client_state = IdentifiedClientState { + client_id: connection.client_id.clone().to_string(), + client_state: client_state_any, + }; + + Ok(tonic::Response::new(QueryChannelClientStateResponse { + identified_client_state: Some(identified_client_state), + proof: proof.encode_to_vec(), + proof_height: Some(Height { + revision_number: 0, + revision_height: snapshot.version(), + }), + })) } /// ChannelConsensusState queries for the consensus state for the channel /// associated with the provided channel identifiers. async fn channel_consensus_state( &self, - _request: tonic::Request, + request: tonic::Request, ) -> std::result::Result, tonic::Status> { - Err(tonic::Status::unimplemented("not implemented")) + let snapshot = self.0.latest_snapshot(); + let consensus_state_height = ibc_types::core::client::Height { + revision_number: request.get_ref().revision_number, + revision_height: request.get_ref().revision_height, + }; + + // 1. get the channel + let channel_id = ChannelId::from_str(request.get_ref().channel_id.as_str()) + .map_err(|e| tonic::Status::aborted(format!("invalid channel id: {e}")))?; + let port_id = PortId::from_str(request.get_ref().port_id.as_str()) + .map_err(|e| tonic::Status::aborted(format!("invalid port id: {e}")))?; + + let channel = snapshot + .get_channel(&channel_id, &port_id) + .await + .map_err(|e| { + tonic::Status::aborted(format!( + "couldn't get channel {channel_id} for port {port_id}: {e}" + )) + })? + .ok_or("unable to get channel") + .map_err(|e| { + tonic::Status::aborted(format!( + "couldn't get channel {channel_id} for port {port_id}: {e}" + )) + })?; + + // 2. get the connection for the channel + let connection_id = channel + .connection_hops + .first() + .ok_or("channel has no connection hops") + .map_err(|e| { + tonic::Status::aborted(format!( + "couldn't get connection for channel {channel_id} for port {port_id}: {e}" + )) + })?; + + let connection = snapshot.get_connection(&connection_id).await.map_err(|e| { + tonic::Status::aborted(format!( + "couldn't get connection {connection_id} for channel {channel_id} for port {port_id}: {e}" + )) + })?.ok_or("unable to get connection").map_err(|e| { + tonic::Status::aborted(format!( + "couldn't get connection {connection_id} for channel {channel_id} for port {port_id}: {e}" + )) + })?; + + // 3. get the consensus state for the connection + let (consensus_state, proof) = snapshot + .get_with_proof( + IBC_COMMITMENT_PREFIX + .apply_string( + ClientConsensusStatePath::new( + &connection.client_id, + &consensus_state_height, + ) + .to_string(), + ) + .as_bytes() + .to_vec(), + ) + .await + .map_err(|e| tonic::Status::aborted(format!("couldn't get client state: {e}")))?; + + let consensus_state_any = consensus_state + .map(|cs_bytes| ibc_proto::google::protobuf::Any::decode(cs_bytes.as_ref())) + .transpose() + .map_err(|e| tonic::Status::aborted(format!("couldn't decode client state: {e}")))?; + + Ok(tonic::Response::new(QueryChannelConsensusStateResponse { + consensus_state: consensus_state_any, + client_id: connection.client_id.clone().to_string(), + proof: proof.encode_to_vec(), + proof_height: Some(Height { + revision_number: 0, + revision_height: snapshot.version(), + }), + })) } /// PacketCommitment queries a stored packet commitment hash. async fn packet_commitment( &self, - _request: tonic::Request, + request: tonic::Request, ) -> std::result::Result, tonic::Status> { - Err(tonic::Status::unimplemented("not implemented")) + let snapshot = self.0.latest_snapshot(); + + let port_id = PortId::from_str(&request.get_ref().port_id) + .map_err(|e| tonic::Status::aborted(format!("invalid port id: {e}")))?; + let channel_id = ChannelId::from_str(&request.get_ref().channel_id) + .map_err(|e| tonic::Status::aborted(format!("invalid channel id: {e}")))?; + + let (commitment, proof) = snapshot + .get_with_proof( + IBC_COMMITMENT_PREFIX + .apply_string( + CommitmentPath::new( + &port_id, + &channel_id, + request.get_ref().sequence.into(), + ) + .to_string(), + ) + .as_bytes() + .to_vec(), + ) + .await + .map_err(|e| tonic::Status::aborted(format!("couldn't get packet commitment: {e}")))?; + + let commitment = + commitment.ok_or_else(|| tonic::Status::aborted("commitment not found"))?; + + Ok(tonic::Response::new(QueryPacketCommitmentResponse { + commitment, + proof: proof.encode_to_vec(), + proof_height: Some(Height { + revision_number: 0, + revision_height: snapshot.version(), + }), + })) } /// PacketCommitments returns all the packet commitments hashes associated /// with a channel. @@ -223,17 +452,75 @@ impl> ConsensusQuery fo /// queried chain async fn packet_receipt( &self, - _request: tonic::Request, + request: tonic::Request, ) -> std::result::Result, tonic::Status> { - Err(tonic::Status::unimplemented("not implemented")) + let snapshot = self.0.latest_snapshot(); + + let port_id = PortId::from_str(&request.get_ref().port_id) + .map_err(|e| tonic::Status::aborted(format!("invalid port id: {e}")))?; + let channel_id = ChannelId::from_str(&request.get_ref().channel_id) + .map_err(|e| tonic::Status::aborted(format!("invalid channel id: {e}")))?; + + let (receipt, proof) = snapshot + .get_with_proof( + IBC_COMMITMENT_PREFIX + .apply_string( + ReceiptPath::new(&port_id, &channel_id, request.get_ref().sequence.into()) + .to_string(), + ) + .as_bytes() + .to_vec(), + ) + .await + .map_err(|e| tonic::Status::aborted(format!("couldn't get packet commitment: {e}")))?; + + Ok(tonic::Response::new(QueryPacketReceiptResponse { + received: receipt.is_some(), + proof: proof.encode_to_vec(), + proof_height: Some(Height { + revision_number: 0, + revision_height: snapshot.version(), + }), + })) } /// PacketAcknowledgement queries a stored packet acknowledgement hash. async fn packet_acknowledgement( &self, - _request: tonic::Request, + request: tonic::Request, ) -> std::result::Result, tonic::Status> { - Err(tonic::Status::unimplemented("not implemented")) + let snapshot = self.0.latest_snapshot(); + let channel_id = ChannelId::from_str(request.get_ref().channel_id.as_str()) + .map_err(|e| tonic::Status::aborted(format!("invalid channel id: {e}")))?; + let port_id = PortId::from_str(request.get_ref().port_id.as_str()) + .map_err(|e| tonic::Status::aborted(format!("invalid port id: {e}")))?; + + let (acknowledgement, proof) = snapshot + .get_with_proof( + IBC_COMMITMENT_PREFIX + .apply_string( + AckPath::new(&port_id, &channel_id, request.get_ref().sequence.into()) + .to_string(), + ) + .as_bytes() + .to_vec(), + ) + .await + .map_err(|e| { + tonic::Status::aborted(format!("couldn't get packet acknowledgement: {e}")) + })?; + + let acknowledgement = + acknowledgement.ok_or_else(|| tonic::Status::aborted("acknowledgement not found"))?; + + Ok(tonic::Response::new(QueryPacketAcknowledgementResponse { + acknowledgement, + proof: proof.encode_to_vec(), + proof_height: Some(Height { + revision_number: 0, + revision_height: snapshot.version(), + }), + })) } /// PacketAcknowledgements returns all the packet acknowledgements associated /// with a channel. @@ -396,16 +683,72 @@ impl> ConsensusQuery fo /// NextSequenceReceive returns the next receive sequence for a given channel. async fn next_sequence_receive( &self, - _request: tonic::Request, + request: tonic::Request, ) -> std::result::Result, tonic::Status> { - Err(tonic::Status::unimplemented("not implemented")) + let snapshot = self.0.latest_snapshot(); + + let channel_id = ChannelId::from_str(request.get_ref().channel_id.as_str()) + .map_err(|e| tonic::Status::aborted(format!("invalid channel id: {e}")))?; + let port_id = PortId::from_str(request.get_ref().port_id.as_str()) + .map_err(|e| tonic::Status::aborted(format!("invalid port id: {e}")))?; + + let (next_recv_sequence, proof) = snapshot + .get_with_proof( + IBC_COMMITMENT_PREFIX + .apply_string(SeqRecvPath::new(&port_id, &channel_id).to_string()) + .as_bytes() + .to_vec(), + ) + .await + .map_err(|e| tonic::Status::aborted(format!("couldn't get channel: {e}")))?; + + let next_recv_sequence = next_recv_sequence + .map(|seq_bytes| u64::from_be_bytes(seq_bytes.try_into().expect("invalid sequence"))) + .ok_or_else(|| tonic::Status::aborted("next receive sequence not found"))?; + + Ok(tonic::Response::new(QueryNextSequenceReceiveResponse { + next_sequence_receive: next_recv_sequence, + proof: proof.encode_to_vec(), + proof_height: Some(Height { + revision_number: 0, + revision_height: snapshot.version(), + }), + })) } /// NextSequenceSend returns the next send sequence for a given channel. async fn next_sequence_send( &self, - _request: tonic::Request, + request: tonic::Request, ) -> std::result::Result, tonic::Status> { - Err(tonic::Status::unimplemented("not implemented")) + let snapshot = self.0.latest_snapshot(); + + let channel_id = ChannelId::from_str(request.get_ref().channel_id.as_str()) + .map_err(|e| tonic::Status::aborted(format!("invalid channel id: {e}")))?; + let port_id = PortId::from_str(request.get_ref().port_id.as_str()) + .map_err(|e| tonic::Status::aborted(format!("invalid port id: {e}")))?; + + let (next_send_sequence, proof) = snapshot + .get_with_proof( + IBC_COMMITMENT_PREFIX + .apply_string(SeqSendPath::new(&port_id, &channel_id).to_string()) + .as_bytes() + .to_vec(), + ) + .await + .map_err(|e| tonic::Status::aborted(format!("couldn't get channel: {e}")))?; + + let next_send_sequence = next_send_sequence + .map(|seq_bytes| u64::from_be_bytes(seq_bytes.try_into().expect("invalid sequence"))) + .ok_or_else(|| tonic::Status::aborted("next receive sequence not found"))?; + + Ok(tonic::Response::new(QueryNextSequenceSendResponse { + next_sequence_send: next_send_sequence, + proof: proof.encode_to_vec(), + proof_height: Some(Height { + revision_number: 0, + revision_height: snapshot.version(), + }), + })) } } diff --git a/crates/core/component/ibc/src/ibc_action.rs b/crates/core/component/ibc/src/ibc_action.rs index 8926471dfa..29ac6c5cd2 100644 --- a/crates/core/component/ibc/src/ibc_action.rs +++ b/crates/core/component/ibc/src/ibc_action.rs @@ -33,6 +33,7 @@ use ibc_types::DomainType as IbcTypesDomainType; use penumbra_proto::penumbra::core::component::ibc::v1alpha1::{self as pb}; use penumbra_proto::{DomainType, Name}; +use penumbra_txhash::{EffectHash, EffectingData}; use serde::{Deserialize, Serialize}; #[derive(Debug, Clone, Serialize, Deserialize)] @@ -131,6 +132,12 @@ impl IbcRelay { } } +impl EffectingData for IbcRelay { + fn effect_hash(&self) -> EffectHash { + EffectHash::from_proto_effecting_data(&self.to_proto()) + } +} + impl DomainType for IbcRelay { type Proto = pb::IbcRelay; } diff --git a/crates/core/component/sct/src/source.rs b/crates/core/component/sct/src/source.rs index 3f999d7e05..5795586bc9 100644 --- a/crates/core/component/sct/src/source.rs +++ b/crates/core/component/sct/src/source.rs @@ -17,8 +17,8 @@ pub enum CommitmentSource { }, /// The commitment was created through a validator's funding stream. FundingStreamReward { epoch_index: u64 }, - /// The commitment was created through a `DaoOutput` in a governance-initated transaction. - DaoOutput, + /// The commitment was created through a `CommunityPoolOutput` in a governance-initated transaction. + CommunityPoolOutput, /// The commitment was created by an inbound ICS20 transfer. Ics20Transfer { /// The sequence number of the transfer packet. @@ -70,7 +70,9 @@ impl From for pb::CommitmentSource { CommitmentSource::FundingStreamReward { epoch_index } => { Source::FundingStreamReward(pbcs::FundingStreamReward { epoch_index }) } - CommitmentSource::DaoOutput => Source::DaoOutput(pbcs::DaoOutput {}), + CommitmentSource::CommunityPoolOutput => { + Source::CommunityPoolOutput(pbcs::CommunityPoolOutput {}) + } CommitmentSource::Ics20Transfer { packet_seq, channel_id, @@ -94,7 +96,7 @@ impl TryFrom for CommitmentSource { Ok(match source { Source::Genesis(_) => Self::Genesis, - Source::DaoOutput(_) => Self::DaoOutput, + Source::CommunityPoolOutput(_) => Self::CommunityPoolOutput, Source::FundingStreamReward(x) => Self::FundingStreamReward { epoch_index: x.epoch_index, }, diff --git a/crates/core/component/shielded-pool/Cargo.toml b/crates/core/component/shielded-pool/Cargo.toml index f7ac791dc3..f7a2573cce 100644 --- a/crates/core/component/shielded-pool/Cargo.toml +++ b/crates/core/component/shielded-pool/Cargo.toml @@ -43,11 +43,12 @@ penumbra-chain = { path = "../chain", default-features = false } penumbra-asset = { path = "../../../core/asset", default-features = false } penumbra-num = { path = "../../../core/num", default-features = false } penumbra-keys = { path = "../../../core/keys", default-features = false } +penumbra-txhash = { path = "../../../core/txhash", default-features = false } decaf377-ka = { path = "../../../crypto/decaf377-ka/" } decaf377-fmd = { path = "../../../crypto/decaf377-fmd/" } # Penumbra dependencies -ibc-types = { version = "0.10.0", default-features = false } +ibc-types = { version = "0.11.0", default-features = false } decaf377-rdsa = { version = "0.7" } decaf377 = { version = "0.5", features = ["r1cs"] } poseidon377 = { version = "0.6", features = ["r1cs"] } diff --git a/crates/core/component/shielded-pool/src/component/action_handler/output.rs b/crates/core/component/shielded-pool/src/component/action_handler/output.rs index ec2d35956f..a0fc312da6 100644 --- a/crates/core/component/shielded-pool/src/component/action_handler/output.rs +++ b/crates/core/component/shielded-pool/src/component/action_handler/output.rs @@ -8,7 +8,7 @@ use penumbra_proof_params::OUTPUT_PROOF_VERIFICATION_KEY; use penumbra_proto::StateWriteProto as _; use penumbra_sct::component::SourceContext; -use crate::{component::NoteManager, event, Output}; +use crate::{component::NoteManager, event, output::OutputProofPublic, Output}; #[async_trait] impl ActionHandler for Output { @@ -18,8 +18,10 @@ impl ActionHandler for Output { output.proof.verify( &OUTPUT_PROOF_VERIFICATION_KEY, - output.body.balance_commitment, - output.body.note_payload.note_commitment, + OutputProofPublic { + balance_commitment: output.body.balance_commitment, + note_commitment: output.body.note_payload.note_commitment, + }, )?; Ok(()) diff --git a/crates/core/component/shielded-pool/src/component/action_handler/spend.rs b/crates/core/component/shielded-pool/src/component/action_handler/spend.rs index 0c74eb6e78..a75375c54c 100644 --- a/crates/core/component/shielded-pool/src/component/action_handler/spend.rs +++ b/crates/core/component/shielded-pool/src/component/action_handler/spend.rs @@ -4,12 +4,12 @@ use anyhow::{Context, Result}; use async_trait::async_trait; use cnidarium::{StateRead, StateWrite}; use cnidarium_component::ActionHandler; -use penumbra_chain::TransactionContext; use penumbra_proof_params::SPEND_PROOF_VERIFICATION_KEY; use penumbra_proto::StateWriteProto as _; use penumbra_sct::component::{SctManager, SourceContext, StateReadExt as _}; +use penumbra_txhash::TransactionContext; -use crate::{event, Spend}; +use crate::{event, Spend, SpendProofPublic}; #[async_trait] impl ActionHandler for Spend { @@ -24,15 +24,15 @@ impl ActionHandler for Spend { .context("spend auth signature failed to verify")?; // 3. Check that the proof verifies. + let public = SpendProofPublic { + anchor: context.anchor, + balance_commitment: spend.body.balance_commitment, + nullifier: spend.body.nullifier, + rk: spend.body.rk, + }; spend .proof - .verify( - &SPEND_PROOF_VERIFICATION_KEY, - context.anchor, - spend.body.balance_commitment, - spend.body.nullifier, - spend.body.rk, - ) + .verify(&SPEND_PROOF_VERIFICATION_KEY, public) .context("a spend proof did not verify")?; Ok(()) diff --git a/crates/core/component/shielded-pool/src/component/metrics.rs b/crates/core/component/shielded-pool/src/component/metrics.rs index 8f5131ec82..668c4d13b5 100644 --- a/crates/core/component/shielded-pool/src/component/metrics.rs +++ b/crates/core/component/shielded-pool/src/component/metrics.rs @@ -11,6 +11,7 @@ //! This trick is probably good to avoid in general, because it could be //! confusing, but in this limited case, it seems like a clean option. +#[allow(unused_imports)] pub use metrics::*; /// Registers all metrics used by this crate. diff --git a/crates/core/component/shielded-pool/src/convert.rs b/crates/core/component/shielded-pool/src/convert.rs new file mode 100644 index 0000000000..e0e91cff8d --- /dev/null +++ b/crates/core/component/shielded-pool/src/convert.rs @@ -0,0 +1,299 @@ +use anyhow::{anyhow, Result}; +use ark_ff::ToConstraintField; +use ark_groth16::{ + r1cs_to_qap::LibsnarkReduction, Groth16, PreparedVerifyingKey, Proof, ProvingKey, +}; +use ark_relations::r1cs; +use ark_serialize::{CanonicalDeserialize, CanonicalSerialize}; +use ark_snark::SNARK; +use decaf377::{Bls12_377, FieldExt, Fq, Fr}; +use penumbra_asset::{ + asset::{self, AssetIdVar}, + balance::{self, commitment::BalanceCommitmentVar, BalanceVar}, + Balance, Value, ValueVar, STAKING_TOKEN_ASSET_ID, +}; +use penumbra_num::{ + fixpoint::{U128x128, U128x128Var}, + Amount, AmountVar, +}; +use penumbra_proof_params::{DummyWitness, VerifyingKeyExt, GROTH16_PROOF_LENGTH_BYTES}; + +/// The public input for a [`ConvertProof`]. +#[derive(Clone, Debug)] +pub struct ConvertProofPublic { + /// The source asset being consumed. + pub from: asset::Id, + /// The destination asset being produced. + pub to: asset::Id, + /// The exchange rate: how many units of `to` we get for each unit of `from`. + pub rate: U128x128, + /// A commitment to the balance of this transaction: what assets were consumed and produced. + pub balance_commitment: balance::Commitment, +} + +/// The private input for a [`ConvertProof`]. +#[derive(Clone, Debug)] +pub struct ConvertProofPrivate { + /// The private amount of the source asset we're converting. + pub amount: Amount, + /// The blinding we used to create the public commitment. + pub balance_blinding: Fr, +} + +#[cfg(test)] +fn check_satisfaction(public: &ConvertProofPublic, private: &ConvertProofPrivate) -> Result<()> { + let consumed = Value { + amount: private.amount, + asset_id: public.from, + }; + let produced = Value { + amount: public.rate.apply_to_amount(&private.amount)?, + asset_id: public.to, + }; + let balance: Balance = Balance::from(produced) - consumed; + let commitment = balance.commit(private.balance_blinding); + if commitment != public.balance_commitment { + anyhow::bail!("balance commitment did not match public input"); + } + Ok(()) +} + +#[cfg(test)] +fn check_circuit_satisfaction( + public: ConvertProofPublic, + private: ConvertProofPrivate, +) -> Result<()> { + use ark_relations::r1cs::{ConstraintSynthesizer, ConstraintSystem}; + + let cs = ConstraintSystem::new_ref(); + let circuit = ConvertCircuit::new(public, private); + cs.set_optimization_goal(r1cs::OptimizationGoal::Constraints); + // For why this is ok, see `generate_test_parameters`. + circuit + .generate_constraints(cs.clone()) + .expect("can generate constraints from circuit"); + cs.finalize(); + if !cs.is_satisfied()? { + anyhow::bail!("constraints are not satisfied"); + } + Ok(()) +} + +/// A circuit that converts a private amount of one asset into another, by some rate. +#[derive(Clone, Debug)] +pub struct ConvertCircuit { + /// The amount of the source token being converted. + amount: Amount, + /// A randomizer for the commitment. + balance_blinding: Fr, + /// The source asset. + from: asset::Id, + /// The target asset + to: asset::Id, + /// The conversion rate from source to target. + rate: U128x128, + /// A commitment to a balance of `-amount[from] + (rate * amount)[to]`. + balance_commitment: balance::Commitment, +} + +impl ConvertCircuit { + fn new( + ConvertProofPublic { + from, + to, + rate, + balance_commitment, + }: ConvertProofPublic, + ConvertProofPrivate { + amount, + balance_blinding, + }: ConvertProofPrivate, + ) -> Self { + Self { + amount, + balance_blinding, + balance_commitment, + from, + to, + rate, + } + } +} + +impl r1cs::ConstraintSynthesizer for ConvertCircuit { + fn generate_constraints(self, cs: r1cs::ConstraintSystemRef) -> r1cs::Result<()> { + use ark_r1cs_std::prelude::*; + + // Witnesses + let amount_var = AmountVar::new_witness(cs.clone(), || Ok(self.amount))?; + let balance_blinding_var = { + let balance_blinding_arr: [u8; 32] = self.balance_blinding.to_bytes(); + UInt8::new_witness_vec(cs.clone(), &balance_blinding_arr)? + }; + + // Public Inputs + let from = AssetIdVar::new_input(cs.clone(), || Ok(self.from))?; + let to = AssetIdVar::new_input(cs.clone(), || Ok(self.to))?; + let rate = U128x128Var::new_input(cs.clone(), || Ok(self.rate))?; + let balance_commitment = + BalanceCommitmentVar::new_input(cs.clone(), || Ok(self.balance_commitment))?; + + // Constraints + let expected_balance = { + let taken = BalanceVar::from_negative_value_var(ValueVar { + amount: amount_var.clone(), + asset_id: from, + }); + + let produced = BalanceVar::from_positive_value_var(ValueVar { + amount: rate.apply_to_amount(amount_var)?, + asset_id: to, + }); + + taken + produced + }; + let expected_commitment = expected_balance.commit(balance_blinding_var)?; + expected_commitment.enforce_equal(&balance_commitment)?; + + Ok(()) + } +} + +impl DummyWitness for ConvertCircuit { + fn with_dummy_witness() -> Self { + let amount = Amount::from(1u64); + let balance_blinding = Fr::from(1); + let from = *STAKING_TOKEN_ASSET_ID; + let to = *STAKING_TOKEN_ASSET_ID; + let rate = U128x128::from(1u64); + let balance = Balance::from(Value { + asset_id: to, + amount, + }) - Balance::from(Value { + asset_id: from, + amount, + }); + let balance_commitment = balance.commit(balance_blinding); + Self { + amount, + balance_blinding, + from, + to, + rate, + balance_commitment, + } + } +} + +/// A proof that one asset was correctly converted into another. +/// +/// This checks that: `COMMITMENT = COMMIT(-amount[FROM] + (RATE * amount)[TO])`, +/// where `amount` is private, and other variables are public. +#[derive(Clone, Debug)] +pub struct ConvertProof([u8; GROTH16_PROOF_LENGTH_BYTES]); + +impl ConvertProof { + /// Generate a [`ConvertProof`] + pub fn prove( + blinding_r: Fq, + blinding_s: Fq, + pk: &ProvingKey, + public: ConvertProofPublic, + private: ConvertProofPrivate, + ) -> Result { + let circuit = ConvertCircuit::new(public, private); + let proof = Groth16::::create_proof_with_reduction( + circuit, pk, blinding_r, blinding_s, + )?; + let mut proof_bytes = [0u8; GROTH16_PROOF_LENGTH_BYTES]; + Proof::serialize_compressed(&proof, &mut proof_bytes[..]).expect("can serialize Proof"); + Ok(Self(proof_bytes)) + } + + #[tracing::instrument(level="debug", skip(self, vk), fields(self = ?base64::encode(&self.0), vk = ?vk.debug_id()))] + pub fn verify( + &self, + vk: &PreparedVerifyingKey, + public: ConvertProofPublic, + ) -> Result<()> { + let proof = Proof::deserialize_compressed_unchecked(&self.0[..]).map_err(|e| anyhow!(e))?; + + let mut public_inputs = Vec::new(); + public_inputs.extend( + public + .from + .to_field_elements() + .ok_or_else(|| anyhow!("could not convert `from` asset ID to field elements"))?, + ); + public_inputs.extend( + public + .to + .to_field_elements() + .ok_or_else(|| anyhow!("could not convert `to` asset ID to field elements"))?, + ); + public_inputs.extend( + public + .rate + .to_field_elements() + .ok_or_else(|| anyhow!("could not convert exchange rate to field elements"))?, + ); + public_inputs.extend( + public + .balance_commitment + .0 + .to_field_elements() + .ok_or_else(|| anyhow!("could not convert balance commitment to field elements"))?, + ); + + tracing::trace!(?public_inputs); + let start = std::time::Instant::now(); + let proof_result = Groth16::::verify_with_processed_vk( + vk, + public_inputs.as_slice(), + &proof, + )?; + tracing::debug!(?proof_result, elapsed = ?start.elapsed()); + proof_result + .then_some(()) + .ok_or_else(|| anyhow!("undelegate claim proof did not verify")) + } + + pub fn to_vec(&self) -> Vec { + self.0.to_vec() + } +} + +impl TryFrom<&[u8]> for ConvertProof { + type Error = anyhow::Error; + + fn try_from(value: &[u8]) -> Result { + Ok(Self(value.try_into()?)) + } +} + +#[cfg(test)] +mod tests { + use super::*; + use proptest::prelude::*; + + prop_compose! { + fn arb_valid_convert_statement(balance_blinding: Fr)(amount in any::(), from_asset_id64 in any::(), to_asset_id64 in any::(), rate in any::<(u64, u128)>()) -> (ConvertProofPublic, ConvertProofPrivate) { + let rate = U128x128::ratio(u128::from(rate.0), rate.1).expect("the bounds will make this not overflow"); + let from = asset::Id(Fq::from(from_asset_id64)); + let to = asset::Id(Fq::from(to_asset_id64)); + let amount = Amount::from(amount); + let balance = Balance::from(Value { asset_id: to, amount: rate.apply_to_amount(&amount).expect("the bounds will make this not overflow")}) - Value {asset_id: from, amount}; + let public = ConvertProofPublic { from, to, rate, balance_commitment: balance.commit(balance_blinding) }; + let private = ConvertProofPrivate { amount, balance_blinding }; + (public, private) + } + } + + proptest! { + #[test] + fn convert_proof_happy_path((public, private) in arb_valid_convert_statement(Fr::from(1u64))) { + assert!(check_satisfaction(&public, &private).is_ok()); + assert!(check_circuit_satisfaction(public, private).is_ok()); + } + } +} diff --git a/crates/core/component/shielded-pool/src/ics20_withdrawal.rs b/crates/core/component/shielded-pool/src/ics20_withdrawal.rs index f9e69c38f0..79d363d9ab 100644 --- a/crates/core/component/shielded-pool/src/ics20_withdrawal.rs +++ b/crates/core/component/shielded-pool/src/ics20_withdrawal.rs @@ -9,6 +9,7 @@ use penumbra_proto::{ penumbra::core::component::ibc::v1alpha1::{self as pb, FungibleTokenPacketData}, DomainType, }; +use penumbra_txhash::{EffectHash, EffectingData}; use serde::{Deserialize, Serialize}; use std::str::FromStr; @@ -83,6 +84,12 @@ impl Ics20Withdrawal { } } +impl EffectingData for Ics20Withdrawal { + fn effect_hash(&self) -> EffectHash { + EffectHash::from_proto_effecting_data(&self.to_proto()) + } +} + impl DomainType for Ics20Withdrawal { type Proto = pb::Ics20Withdrawal; } diff --git a/crates/core/component/shielded-pool/src/lib.rs b/crates/core/component/shielded-pool/src/lib.rs index 49ac0a67e5..1361210945 100644 --- a/crates/core/component/shielded-pool/src/lib.rs +++ b/crates/core/component/shielded-pool/src/lib.rs @@ -20,10 +20,17 @@ pub use note::{Note, NoteCiphertext, NoteView}; pub use note_payload::NotePayload; pub use rseed::Rseed; +pub mod convert; pub mod nullifier_derivation; pub mod output; pub mod spend; -pub use nullifier_derivation::{NullifierDerivationCircuit, NullifierDerivationProof}; +pub use convert::{ConvertCircuit, ConvertProof, ConvertProofPrivate, ConvertProofPublic}; +pub use nullifier_derivation::{ + NullifierDerivationCircuit, NullifierDerivationProof, NullifierDerivationProofPrivate, + NullifierDerivationProofPublic, +}; pub use output::{Output, OutputCircuit, OutputPlan, OutputProof, OutputView}; -pub use spend::{Spend, SpendCircuit, SpendPlan, SpendProof, SpendView}; +pub use spend::{ + Spend, SpendCircuit, SpendPlan, SpendProof, SpendProofPrivate, SpendProofPublic, SpendView, +}; diff --git a/crates/core/component/shielded-pool/src/nullifier_derivation.rs b/crates/core/component/shielded-pool/src/nullifier_derivation.rs index f5af7ee9eb..86b4d4bfd8 100644 --- a/crates/core/component/shielded-pool/src/nullifier_derivation.rs +++ b/crates/core/component/shielded-pool/src/nullifier_derivation.rs @@ -1,5 +1,6 @@ use std::str::FromStr; +use anyhow::Result; use ark_r1cs_std::prelude::*; use ark_serialize::{CanonicalDeserialize, CanonicalSerialize}; use decaf377::{Bls12_377, Fq}; @@ -21,14 +22,10 @@ use penumbra_keys::keys::{Bip44Path, NullifierKey, NullifierKeyVar, SeedPhrase, use penumbra_proof_params::{DummyWitness, VerifyingKeyExt, GROTH16_PROOF_LENGTH_BYTES}; use penumbra_sct::{Nullifier, NullifierVar}; -/// Groth16 proof for correct nullifier derivation. +/// The public input for a ['NullifierDerivationProof']. #[derive(Clone, Debug)] -pub struct NullifierDerivationCircuit { - // Witnesses - /// The nullifier deriving key. - nk: NullifierKey, - // Public inputs - /// the position of the spent note. +pub struct NullifierDerivationProofPublic { + /// The position of the spent note. pub position: tct::Position, /// A commitment to the spent note. pub note_commitment: StateCommitment, @@ -36,32 +33,64 @@ pub struct NullifierDerivationCircuit { pub nullifier: Nullifier, } -impl NullifierDerivationCircuit { - pub fn new( - position: tct::Position, - note_commitment: StateCommitment, - nk: NullifierKey, - nullifier: Nullifier, - ) -> Self { - Self { - nk, - note_commitment, - nullifier, - position, - } +/// The private input for a ['NullifierDerivationProof']. +#[derive(Clone, Debug)] +pub struct NullifierDerivationProofPrivate { + /// The nullifier deriving key. + pub nk: NullifierKey, +} + +#[cfg(test)] +fn check_satisfaction( + public: &NullifierDerivationProofPublic, + private: &NullifierDerivationProofPrivate, +) -> Result<()> { + let nullifier = Nullifier::derive(&private.nk, public.position, &public.note_commitment); + if nullifier != public.nullifier { + anyhow::bail!("nullifier did not match public input"); } + Ok(()) +} + +#[cfg(test)] +fn check_circuit_satisfaction( + public: NullifierDerivationProofPublic, + private: NullifierDerivationProofPrivate, +) -> Result<()> { + use ark_relations::r1cs::{self, ConstraintSystem}; + + let cs = ConstraintSystem::new_ref(); + let circuit = NullifierDerivationCircuit { public, private }; + cs.set_optimization_goal(r1cs::OptimizationGoal::Constraints); + circuit + .generate_constraints(cs.clone()) + .expect("can generate constraints from circuit"); + cs.finalize(); + if !cs.is_satisfied()? { + anyhow::bail!("constraints are not satisfied"); + } + Ok(()) +} + +/// Groth16 proof for correct nullifier derivation. +#[derive(Clone, Debug)] +pub struct NullifierDerivationCircuit { + public: NullifierDerivationProofPublic, + private: NullifierDerivationProofPrivate, } impl ConstraintSynthesizer for NullifierDerivationCircuit { fn generate_constraints(self, cs: ConstraintSystemRef) -> ark_relations::r1cs::Result<()> { // Witnesses - let nk_var = NullifierKeyVar::new_witness(cs.clone(), || Ok(self.nk))?; + let nk_var = NullifierKeyVar::new_witness(cs.clone(), || Ok(self.private.nk))?; // Public inputs - let claimed_nullifier_var = NullifierVar::new_input(cs.clone(), || Ok(self.nullifier))?; - let note_commitment_var = - tct::r1cs::StateCommitmentVar::new_input(cs.clone(), || Ok(self.note_commitment))?; - let position_var = tct::r1cs::PositionVar::new_input(cs, || Ok(self.position))?; + let claimed_nullifier_var = + NullifierVar::new_input(cs.clone(), || Ok(self.public.nullifier))?; + let note_commitment_var = tct::r1cs::StateCommitmentVar::new_input(cs.clone(), || { + Ok(self.public.note_commitment) + })?; + let position_var = tct::r1cs::PositionVar::new_input(cs, || Ok(self.public.position))?; // Nullifier integrity. let nullifier_var = NullifierVar::derive(&nk_var, &position_var, ¬e_commitment_var)?; @@ -96,12 +125,14 @@ impl DummyWitness for NullifierDerivationCircuit { .expect("able to witness just-inserted note commitment"); let position = state_commitment_proof.position(); - Self { + let public = NullifierDerivationProofPublic { + position, note_commitment, - nk, nullifier, - position, - } + }; + let private = NullifierDerivationProofPrivate { nk }; + + Self { public, private } } } @@ -109,22 +140,13 @@ impl DummyWitness for NullifierDerivationCircuit { pub struct NullifierDerivationProof([u8; GROTH16_PROOF_LENGTH_BYTES]); impl NullifierDerivationProof { - #![allow(clippy::too_many_arguments)] pub fn prove( rng: &mut R, pk: &ProvingKey, - position: tct::Position, - note: Note, - nk: NullifierKey, - nullifier: Nullifier, + public: NullifierDerivationProofPublic, + private: NullifierDerivationProofPrivate, ) -> anyhow::Result { - let note_commitment = note.commit(); - let circuit = NullifierDerivationCircuit { - note_commitment, - position, - nk, - nullifier, - }; + let circuit = NullifierDerivationCircuit { public, private }; let proof = Groth16::::prove(pk, circuit, rng) .map_err(|err| anyhow::anyhow!(err))?; let mut proof_bytes = [0u8; GROTH16_PROOF_LENGTH_BYTES]; @@ -133,29 +155,35 @@ impl NullifierDerivationProof { } /// Called to verify the proof using the provided public inputs. - #[tracing::instrument(level="debug", skip(self, vk), fields(self = ?base64::encode(self.clone().encode_to_vec()), vk = ?vk.debug_id()))] + #[tracing::instrument(level="debug", skip(self, vk), fields(self = ?base64::encode(&self.0), vk = ?vk.debug_id()))] pub fn verify( &self, vk: &PreparedVerifyingKey, - position: tct::Position, - note_commitment: StateCommitment, - nullifier: Nullifier, + public: NullifierDerivationProofPublic, ) -> anyhow::Result<()> { let proof = Proof::deserialize_compressed_unchecked(&self.0[..]).map_err(|e| anyhow::anyhow!(e))?; let mut public_inputs = Vec::new(); public_inputs.extend( - nullifier + public + .nullifier .0 .to_field_elements() .ok_or_else(|| anyhow::anyhow!("could not convert nullifier to field elements"))?, ); - public_inputs.extend(note_commitment.0.to_field_elements().ok_or_else(|| { - anyhow::anyhow!("could not convert note commitment to field elements") - })?); public_inputs.extend( - position + public + .note_commitment + .0 + .to_field_elements() + .ok_or_else(|| { + anyhow::anyhow!("could not convert note commitment to field elements") + })?, + ); + public_inputs.extend( + public + .position .to_field_elements() .ok_or_else(|| anyhow::anyhow!("could not convert position to field elements"))?, ); @@ -171,7 +199,7 @@ impl NullifierDerivationProof { tracing::debug!(?proof_result, elapsed = ?start.elapsed()); proof_result .then_some(()) - .ok_or_else(|| anyhow::anyhow!("spend proof did not verify")) + .ok_or_else(|| anyhow::anyhow!("nullifier derivation proof did not verify")) } } @@ -200,55 +228,45 @@ mod tests { use super::*; use penumbra_asset::{asset, Value}; use penumbra_keys::keys::{SeedPhrase, SpendKey}; - use penumbra_proof_params::generate_prepared_test_parameters; + use penumbra_num::Amount; use penumbra_sct::Nullifier; - use penumbra_tct as tct; use proptest::prelude::*; - use rand_core::OsRng; use crate::Note; - proptest! { - #![proptest_config(ProptestConfig::with_cases(2))] - #[test] - fn nullifier_derivation_proof_happy_path(seed_phrase_randomness in any::<[u8; 32]>(), value_amount in 2..200u64) { - let mut rng = OsRng; - let (pk, vk) = generate_prepared_test_parameters::(&mut rng); - + prop_compose! { + fn arb_valid_nullifier_derivation_statement()(amount in any::(), address_index in any::(), position in any::<(u16, u16, u16)>(), asset_id64 in any::(), seed_phrase_randomness in any::<[u8; 32]>(), rseed_randomness in any::<[u8; 32]>()) -> (NullifierDerivationProofPublic, NullifierDerivationProofPrivate) { let seed_phrase = SeedPhrase::from_randomness(&seed_phrase_randomness); let sk_sender = SpendKey::from_seed_phrase_bip44(seed_phrase, &Bip44Path::new(0)); let fvk_sender = sk_sender.full_viewing_key(); let ivk_sender = fvk_sender.incoming(); - let (sender, _dtk_d) = ivk_sender.payment_address(0u32.into()); - - let value_to_send = Value { - amount: value_amount.into(), - asset_id: asset::Cache::with_known_assets().get_unit("upenumbra").unwrap().id(), + let (sender, _dtk_d) = ivk_sender.payment_address(address_index.into()); + let nk = *sk_sender.nullifier_key(); + let note = Note::from_parts( + sender, + Value { + amount: Amount::from(amount), + asset_id: asset::Id(Fq::from(asset_id64)), + }, + Rseed(rseed_randomness), + ).expect("should be able to create note"); + let public = NullifierDerivationProofPublic { + position: position.into(), + note_commitment: note.commit(), + nullifier: Nullifier::derive(&nk, position.into(), ¬e.commit()) }; + let private = NullifierDerivationProofPrivate { + nk, + }; + (public, private) + } + } - let note = Note::generate(&mut rng, &sender, value_to_send); - let note_commitment = note.commit(); - let nk = *sk_sender.nullifier_key(); - let mut sct = tct::Tree::new(); - - sct.insert(tct::Witness::Keep, note_commitment).unwrap(); - let state_commitment_proof = sct.witness(note_commitment).unwrap(); - let position = state_commitment_proof.position(); - let nullifier = Nullifier::derive(&nk, state_commitment_proof.position(), ¬e_commitment); - - let proof = NullifierDerivationProof::prove( - &mut rng, - &pk, - position, - note, - nk, - nullifier, - ) - .expect("can create proof"); - - let proof_result = proof.verify(&vk, position, note_commitment, nullifier); - - assert!(proof_result.is_ok()); + proptest! { + #[test] + fn nullifier_derivation_proof_happy_path((public, private) in arb_valid_nullifier_derivation_statement()) { + assert!(check_satisfaction(&public, &private).is_ok()); + assert!(check_circuit_satisfaction(public, private).is_ok()); } } } diff --git a/crates/core/component/shielded-pool/src/output.rs b/crates/core/component/shielded-pool/src/output.rs index be6ed1c4f7..ae6969c1b1 100644 --- a/crates/core/component/shielded-pool/src/output.rs +++ b/crates/core/component/shielded-pool/src/output.rs @@ -5,5 +5,5 @@ mod view; pub use action::{Body, Output}; pub use plan::OutputPlan; -pub use proof::{OutputCircuit, OutputProof}; +pub use proof::{OutputCircuit, OutputProof, OutputProofPrivate, OutputProofPublic}; pub use view::OutputView; diff --git a/crates/core/component/shielded-pool/src/output/action.rs b/crates/core/component/shielded-pool/src/output/action.rs index ff4ee9c2e7..b23be1d2ca 100644 --- a/crates/core/component/shielded-pool/src/output/action.rs +++ b/crates/core/component/shielded-pool/src/output/action.rs @@ -7,6 +7,7 @@ use penumbra_proto::{ core::component::shielded_pool::v1alpha1 as pb, penumbra::core::component::shielded_pool::v1alpha1 as pbc, DomainType, }; +use penumbra_txhash::{EffectHash, EffectingData}; use serde::{Deserialize, Serialize}; use crate::{NotePayload, OutputProof}; @@ -26,6 +27,20 @@ pub struct Body { pub wrapped_memo_key: WrappedMemoKey, } +impl EffectingData for Body { + fn effect_hash(&self) -> EffectHash { + EffectHash::from_proto_effecting_data(&self.to_proto()) + } +} + +impl EffectingData for Output { + fn effect_hash(&self) -> EffectHash { + // The effecting data is in the body of the output, so we can + // just use hash the proto-encoding of the body. + self.body.effect_hash() + } +} + impl DomainType for Output { type Proto = pb::Output; } diff --git a/crates/core/component/shielded-pool/src/output/plan.rs b/crates/core/component/shielded-pool/src/output/plan.rs index bea8f7e515..8c0cb2da82 100644 --- a/crates/core/component/shielded-pool/src/output/plan.rs +++ b/crates/core/component/shielded-pool/src/output/plan.rs @@ -11,7 +11,7 @@ use penumbra_proto::{core::component::shielded_pool::v1alpha1 as pb, DomainType} use rand_core::{CryptoRng, RngCore}; use serde::{Deserialize, Serialize}; -use super::{Body, Output, OutputProof}; +use super::{Body, Output, OutputProof, OutputProofPrivate, OutputProofPublic}; use crate::{Note, Rseed}; /// A planned [`Output`](Output). @@ -82,10 +82,14 @@ impl OutputPlan { self.proof_blinding_r, self.proof_blinding_s, &penumbra_proof_params::OUTPUT_PROOF_PROVING_KEY, - note, - self.value_blinding, - balance_commitment, - note_commitment, + OutputProofPublic { + balance_commitment, + note_commitment, + }, + OutputProofPrivate { + note, + balance_blinding: self.value_blinding, + }, ) .expect("can generate ZKOutputProof") } @@ -165,6 +169,8 @@ impl TryFrom for OutputPlan { #[cfg(test)] mod test { + use crate::output::OutputProofPublic; + use super::OutputPlan; use penumbra_asset::Value; use penumbra_keys::{ @@ -200,8 +206,10 @@ mod test { output_proof .verify( &OUTPUT_PROOF_VERIFICATION_KEY, - balance_commitment, - note_commitment, + OutputProofPublic { + balance_commitment, + note_commitment, + }, ) .unwrap(); } diff --git a/crates/core/component/shielded-pool/src/output/proof.rs b/crates/core/component/shielded-pool/src/output/proof.rs index 19e27f72f0..22ae5f7f0c 100644 --- a/crates/core/component/shielded-pool/src/output/proof.rs +++ b/crates/core/component/shielded-pool/src/output/proof.rs @@ -26,6 +26,24 @@ use penumbra_asset::{ }; use penumbra_proof_params::{DummyWitness, VerifyingKeyExt, GROTH16_PROOF_LENGTH_BYTES}; +/// The public input for an [`OutputProof`]. +#[derive(Clone, Debug)] +pub struct OutputProofPublic { + /// A hiding commitment to the balance. + pub balance_commitment: balance::Commitment, + /// + pub note_commitment: note::StateCommitment, +} + +/// The private input for an [`OutputProof`]. +#[derive(Clone, Debug)] +pub struct OutputProofPrivate { + /// The note being created. + pub note: Note, + /// A blinding factor to hide the balance of the transaction. + pub balance_blinding: Fr, +} + /// Public: /// * vcm (value commitment) /// * ncm (note commitment) @@ -42,22 +60,22 @@ pub struct OutputCircuit { /// The note being created. note: Note, /// The blinding factor used for generating the balance commitment. - v_blinding: Fr, + balance_blinding: Fr, // Public inputs /// balance commitment of the new note, - pub balance_commitment: balance::Commitment, + balance_commitment: balance::Commitment, /// note commitment of the new note, - pub note_commitment: note::StateCommitment, + note_commitment: note::StateCommitment, } impl OutputCircuit { - pub fn new(note: Note, v_blinding: Fr, balance_commitment: balance::Commitment) -> Self { + fn new(public: OutputProofPublic, private: OutputProofPrivate) -> Self { Self { - note: note.clone(), - v_blinding, - balance_commitment, - note_commitment: note.commit(), + note: private.note, + balance_blinding: private.balance_blinding, + balance_commitment: public.balance_commitment, + note_commitment: public.note_commitment, } } } @@ -66,8 +84,8 @@ impl ConstraintSynthesizer for OutputCircuit { fn generate_constraints(self, cs: ConstraintSystemRef) -> ark_relations::r1cs::Result<()> { // Witnesses let note_var = note::NoteVar::new_witness(cs.clone(), || Ok(self.note.clone()))?; - let v_blinding_arr: [u8; 32] = self.v_blinding.to_bytes(); - let v_blinding_vars = UInt8::new_witness_vec(cs.clone(), &v_blinding_arr)?; + let balance_blinding_arr: [u8; 32] = self.balance_blinding.to_bytes(); + let balance_blinding_vars = UInt8::new_witness_vec(cs.clone(), &balance_blinding_arr)?; // Public inputs let claimed_note_commitment = @@ -82,7 +100,7 @@ impl ConstraintSynthesizer for OutputCircuit { // Check integrity of balance commitment. let balance_commitment = - BalanceVar::from_negative_value_var(note_var.value()).commit(v_blinding_vars)?; + BalanceVar::from_negative_value_var(note_var.value()).commit(balance_blinding_vars)?; balance_commitment.enforce_equal(&claimed_balance_commitment)?; // Note commitment integrity @@ -111,11 +129,11 @@ impl DummyWitness for OutputCircuit { Rseed([1u8; 32]), ) .expect("can make a note"); - let v_blinding = Fr::from(1); + let balance_blinding = Fr::from(1); OutputCircuit { note: note.clone(), note_commitment: note.commit(), - v_blinding, + balance_blinding, balance_commitment: balance::Commitment(decaf377::basepoint()), } } @@ -132,17 +150,10 @@ impl OutputProof { blinding_r: Fq, blinding_s: Fq, pk: &ProvingKey, - note: Note, - v_blinding: Fr, - balance_commitment: balance::Commitment, - note_commitment: note::StateCommitment, + public: OutputProofPublic, + private: OutputProofPrivate, ) -> anyhow::Result { - let circuit = OutputCircuit { - note, - note_commitment, - v_blinding, - balance_commitment, - }; + let circuit = OutputCircuit::new(public, private); let proof = Groth16::::create_proof_with_reduction( circuit, pk, blinding_r, blinding_s, ) @@ -163,23 +174,27 @@ impl OutputProof { pub fn verify( &self, vk: &PreparedVerifyingKey, - balance_commitment: balance::Commitment, - note_commitment: note::StateCommitment, + public: OutputProofPublic, ) -> anyhow::Result<()> { let proof = Proof::deserialize_compressed_unchecked(&self.0[..]).map_err(|e| anyhow::anyhow!(e))?; let mut public_inputs = Vec::new(); public_inputs.extend( - note_commitment + public + .note_commitment .0 .to_field_elements() .ok_or_else(|| anyhow::anyhow!("note commitment is not a valid field element"))?, ); public_inputs.extend( - balance_commitment.0.to_field_elements().ok_or_else(|| { - anyhow::anyhow!("balance commitment is not a valid field element") - })?, + public + .balance_commitment + .0 + .to_field_elements() + .ok_or_else(|| { + anyhow::anyhow!("balance commitment is not a valid field element") + })?, ); tracing::trace!(?public_inputs); @@ -247,13 +262,12 @@ mod tests { } proptest! { - #![proptest_config(ProptestConfig::with_cases(2))] - #[test] - fn output_proof_happy_path(seed_phrase_randomness in any::<[u8; 32]>(), v_blinding in fr_strategy(), value_amount in 2..200u64) { + #![proptest_config(ProptestConfig::with_cases(2))] + #[test] + fn output_proof_happy_path(seed_phrase_randomness in any::<[u8; 32]>(), balance_blinding in fr_strategy(), value_amount in 2..200u64) { let mut rng = OsRng; let (pk, vk) = generate_prepared_test_parameters::(&mut rng); - let seed_phrase = SeedPhrase::from_randomness(&seed_phrase_randomness); let sk_recipient = SpendKey::from_seed_phrase_bip44(seed_phrase, &Bip44Path::new(0)); let fvk_recipient = sk_recipient.full_viewing_key(); @@ -267,7 +281,10 @@ mod tests { let note = Note::generate(&mut rng, &dest, value_to_send); let note_commitment = note.commit(); - let balance_commitment = (-Balance::from(value_to_send)).commit(v_blinding); + let balance_commitment = (-Balance::from(value_to_send)).commit(balance_blinding); + + let public = OutputProofPublic { balance_commitment, note_commitment }; + let private = OutputProofPrivate { note, balance_blinding}; let blinding_r = Fq::rand(&mut OsRng); let blinding_s = Fq::rand(&mut OsRng); @@ -275,110 +292,114 @@ mod tests { blinding_r, blinding_s, &pk, - note, - v_blinding, - balance_commitment, - note_commitment, + public.clone(), + private ) .expect("can create proof"); let serialized_proof: pb::ZkOutputProof = proof.into(); let deserialized_proof = OutputProof::try_from(serialized_proof).expect("can deserialize proof"); - let proof_result = deserialized_proof.verify(&vk, balance_commitment, note_commitment); + let proof_result = deserialized_proof.verify(&vk, public); assert!(proof_result.is_ok()); } } proptest! { - #![proptest_config(ProptestConfig::with_cases(2))] - #[test] - fn output_proof_verification_note_commitment_integrity_failure(seed_phrase_randomness in any::<[u8; 32]>(), v_blinding in fr_strategy(), value_amount in 2..200u64, note_blinding in fq_strategy()) { - let mut rng = OsRng; - let (pk, vk) = generate_prepared_test_parameters::(&mut rng); - - let seed_phrase = SeedPhrase::from_randomness(&seed_phrase_randomness); - let sk_recipient = SpendKey::from_seed_phrase_bip44(seed_phrase, &Bip44Path::new(0)); - let fvk_recipient = sk_recipient.full_viewing_key(); - let ivk_recipient = fvk_recipient.incoming(); - let (dest, _dtk_d) = ivk_recipient.payment_address(0u32.into()); - - let value_to_send = Value { - amount: value_amount.into(), - asset_id: asset::Cache::with_known_assets().get_unit("upenumbra").unwrap().id(), - }; - - let note = Note::generate(&mut rng, &dest, value_to_send); - let note_commitment = note.commit(); - let balance_commitment = (-Balance::from(value_to_send)).commit(v_blinding); - - let blinding_r = Fq::rand(&mut OsRng); - let blinding_s = Fq::rand(&mut OsRng); - let proof = OutputProof::prove( - blinding_r, - blinding_s, - &pk, - note.clone(), - v_blinding, - balance_commitment, - note_commitment, - ) - .expect("can create proof"); - - let incorrect_note_commitment = note::commitment( - note_blinding, - value_to_send, - note.diversified_generator(), - note.transmission_key_s(), - note.clue_key(), - ); + #![proptest_config(ProptestConfig::with_cases(2))] + #[test] + fn output_proof_verification_note_commitment_integrity_failure(seed_phrase_randomness in any::<[u8; 32]>(), balance_blinding in fr_strategy(), value_amount in 2..200u64, note_blinding in fq_strategy()) { + let mut rng = OsRng; + let (pk, vk) = generate_prepared_test_parameters::(&mut rng); - let proof_result = proof.verify(&vk, balance_commitment, incorrect_note_commitment); + let seed_phrase = SeedPhrase::from_randomness(&seed_phrase_randomness); + let sk_recipient = SpendKey::from_seed_phrase_bip44(seed_phrase, &Bip44Path::new(0)); + let fvk_recipient = sk_recipient.full_viewing_key(); + let ivk_recipient = fvk_recipient.incoming(); + let (dest, _dtk_d) = ivk_recipient.payment_address(0u32.into()); - assert!(proof_result.is_err()); - } + let value_to_send = Value { + amount: value_amount.into(), + asset_id: asset::Cache::with_known_assets().get_unit("upenumbra").unwrap().id(), + }; + + let note = Note::generate(&mut rng, &dest, value_to_send); + let note_commitment = note.commit(); + let balance_commitment = (-Balance::from(value_to_send)).commit(balance_blinding); + + let blinding_r = Fq::rand(&mut OsRng); + let blinding_s = Fq::rand(&mut OsRng); + + let public = OutputProofPublic { balance_commitment, note_commitment }; + let private = OutputProofPrivate { note: note.clone(), balance_blinding}; + + let proof = OutputProof::prove( + blinding_r, + blinding_s, + &pk, + public.clone(), + private + ) + .expect("can create proof"); + + let incorrect_note_commitment = note::commitment( + note_blinding, + value_to_send, + note.diversified_generator(), + note.transmission_key_s(), + note.clue_key(), + ); + + let bad_public = OutputProofPublic { balance_commitment, note_commitment: incorrect_note_commitment }; + + let proof_result = proof.verify(&vk, bad_public); + + assert!(proof_result.is_err()); + } } proptest! { #![proptest_config(ProptestConfig::with_cases(2))] #[test] - fn output_proof_verification_balance_commitment_integrity_failure(seed_phrase_randomness in any::<[u8; 32]>(), v_blinding in fr_strategy(), value_amount in 2..200u64, incorrect_v_blinding in fr_strategy()) { - let mut rng = OsRng; - let (pk, vk) = generate_prepared_test_parameters::(&mut rng); - - let seed_phrase = SeedPhrase::from_randomness(&seed_phrase_randomness); - let sk_recipient = SpendKey::from_seed_phrase_bip44(seed_phrase, &Bip44Path::new(0)); - let fvk_recipient = sk_recipient.full_viewing_key(); - let ivk_recipient = fvk_recipient.incoming(); - let (dest, _dtk_d) = ivk_recipient.payment_address(0u32.into()); - - let value_to_send = Value { - amount: value_amount.into(), - asset_id: asset::Cache::with_known_assets().get_unit("upenumbra").unwrap().id(), - }; - - let note = Note::generate(&mut rng, &dest, value_to_send); - let note_commitment = note.commit(); - let balance_commitment = (-Balance::from(value_to_send)).commit(v_blinding); - - let blinding_r = Fq::rand(&mut OsRng); - let blinding_s = Fq::rand(&mut OsRng); - let proof = OutputProof::prove( - blinding_r, - blinding_s, - &pk, - note, - v_blinding, - balance_commitment, - note_commitment, - ) - .expect("can create proof"); + fn output_proof_verification_balance_commitment_integrity_failure(seed_phrase_randomness in any::<[u8; 32]>(), balance_blinding in fr_strategy(), value_amount in 2..200u64, incorrect_v_blinding in fr_strategy()) { + let mut rng = OsRng; + let (pk, vk) = generate_prepared_test_parameters::(&mut rng); + + let seed_phrase = SeedPhrase::from_randomness(&seed_phrase_randomness); + let sk_recipient = SpendKey::from_seed_phrase_bip44(seed_phrase, &Bip44Path::new(0)); + let fvk_recipient = sk_recipient.full_viewing_key(); + let ivk_recipient = fvk_recipient.incoming(); + let (dest, _dtk_d) = ivk_recipient.payment_address(0u32.into()); - let incorrect_balance_commitment = (-Balance::from(value_to_send)).commit(incorrect_v_blinding); + let value_to_send = Value { + amount: value_amount.into(), + asset_id: asset::Cache::with_known_assets().get_unit("upenumbra").unwrap().id(), + }; - let proof_result = proof.verify(&vk, incorrect_balance_commitment, note_commitment); + let note = Note::generate(&mut rng, &dest, value_to_send); + let note_commitment = note.commit(); + let balance_commitment = (-Balance::from(value_to_send)).commit(balance_blinding); - assert!(proof_result.is_err()); - } + let public = OutputProofPublic { balance_commitment, note_commitment }; + let private = OutputProofPrivate { note, balance_blinding}; + + let blinding_r = Fq::rand(&mut OsRng); + let blinding_s = Fq::rand(&mut OsRng); + let proof = OutputProof::prove( + blinding_r, + blinding_s, + &pk, + public.clone(), + private + ) + .expect("can create proof"); + + let incorrect_balance_commitment = (-Balance::from(value_to_send)).commit(incorrect_v_blinding); + let bad_public = OutputProofPublic { balance_commitment: incorrect_balance_commitment, note_commitment }; + + let proof_result = proof.verify(&vk, bad_public); + + assert!(proof_result.is_err()); } + } } diff --git a/crates/core/component/shielded-pool/src/spend.rs b/crates/core/component/shielded-pool/src/spend.rs index 0fdb17f111..10c4aa69d9 100644 --- a/crates/core/component/shielded-pool/src/spend.rs +++ b/crates/core/component/shielded-pool/src/spend.rs @@ -5,5 +5,5 @@ mod view; pub use action::{Body, Spend}; pub use plan::SpendPlan; -pub use proof::{SpendCircuit, SpendProof}; +pub use proof::{SpendCircuit, SpendProof, SpendProofPrivate, SpendProofPublic}; pub use view::SpendView; diff --git a/crates/core/component/shielded-pool/src/spend/action.rs b/crates/core/component/shielded-pool/src/spend/action.rs index 7a8bebcf7b..db10402ab1 100644 --- a/crates/core/component/shielded-pool/src/spend/action.rs +++ b/crates/core/component/shielded-pool/src/spend/action.rs @@ -5,6 +5,7 @@ use decaf377_rdsa::{Signature, SpendAuth, VerificationKey}; use penumbra_asset::balance; use penumbra_proto::{core::component::shielded_pool::v1alpha1 as pb, DomainType}; use penumbra_sct::Nullifier; +use penumbra_txhash::{EffectHash, EffectingData}; use serde::{Deserialize, Serialize}; use crate::SpendProof; @@ -24,6 +25,20 @@ pub struct Body { pub rk: VerificationKey, } +impl EffectingData for Body { + fn effect_hash(&self) -> EffectHash { + EffectHash::from_proto_effecting_data(&self.to_proto()) + } +} + +impl EffectingData for Spend { + fn effect_hash(&self) -> EffectHash { + // The effecting data is in the body of the spend, so we can + // just use hash the proto-encoding of the body. + self.body.effect_hash() + } +} + impl DomainType for Spend { type Proto = pb::Spend; } @@ -72,12 +87,10 @@ impl DomainType for Body { impl From for pb::SpendBody { fn from(msg: Body) -> Self { - let nullifier_bytes: [u8; 32] = msg.nullifier.into(); - let rk_bytes: [u8; 32] = msg.rk.into(); pb::SpendBody { balance_commitment: Some(msg.balance_commitment.into()), - nullifier: nullifier_bytes.to_vec(), - rk: rk_bytes.to_vec(), + nullifier: Some(msg.nullifier.into()), + rk: Some(msg.rk.into()), } } } @@ -92,14 +105,17 @@ impl TryFrom for Body { .try_into() .context("malformed balance commitment")?; - let nullifier = (proto.nullifier[..]) + let nullifier = proto + .nullifier + .ok_or_else(|| anyhow::anyhow!("missing nullifier"))? .try_into() .context("malformed nullifier")?; - let rk_bytes: [u8; 32] = (proto.rk[..]) + let rk = proto + .rk + .ok_or_else(|| anyhow::anyhow!("missing rk"))? .try_into() - .map_err(|_| anyhow::anyhow!("expected 32-byte rk"))?; - let rk = rk_bytes.try_into().context("malformed rk")?; + .context("malformed rk")?; Ok(Body { balance_commitment, diff --git a/crates/core/component/shielded-pool/src/spend/plan.rs b/crates/core/component/shielded-pool/src/spend/plan.rs index a78606bb40..4a1e2fe177 100644 --- a/crates/core/component/shielded-pool/src/spend/plan.rs +++ b/crates/core/component/shielded-pool/src/spend/plan.rs @@ -10,7 +10,7 @@ use rand_core::{CryptoRng, RngCore}; use serde::{Deserialize, Serialize}; use super::{Body, Spend, SpendProof}; -use crate::{Note, Rseed}; +use crate::{Note, Rseed, SpendProofPrivate, SpendProofPublic}; /// A planned [`Spend`](Spend). #[derive(Clone, Debug, Deserialize, Serialize)] @@ -100,20 +100,26 @@ impl SpendPlan { state_commitment_proof: tct::Proof, anchor: tct::Root, ) -> SpendProof { + let public = SpendProofPublic { + anchor, + balance_commitment: self.balance().commit(self.value_blinding), + nullifier: self.nullifier(fvk), + rk: self.rk(fvk), + }; + let private = SpendProofPrivate { + state_commitment_proof, + note: self.note.clone(), + v_blinding: self.value_blinding, + spend_auth_randomizer: self.randomizer, + ak: *fvk.spend_verification_key(), + nk: *fvk.nullifier_key(), + }; SpendProof::prove( self.proof_blinding_r, self.proof_blinding_s, &penumbra_proof_params::SPEND_PROOF_PROVING_KEY, - state_commitment_proof.clone(), - self.note.clone(), - self.value_blinding, - self.randomizer, - *fvk.spend_verification_key(), - *fvk.nullifier_key(), - anchor, - self.balance().commit(self.value_blinding), - self.nullifier(fvk), - self.rk(fvk), + public, + private, ) .expect("can generate ZKSpendProof") } diff --git a/crates/core/component/shielded-pool/src/spend/proof.rs b/crates/core/component/shielded-pool/src/spend/proof.rs index 8528bbf81f..0a05b307c8 100644 --- a/crates/core/component/shielded-pool/src/spend/proof.rs +++ b/crates/core/component/shielded-pool/src/spend/proof.rs @@ -1,5 +1,6 @@ use std::str::FromStr; +use anyhow::Result; use ark_r1cs_std::{ prelude::{EqGadget, FieldVar}, uint8::UInt8, @@ -30,24 +31,9 @@ use penumbra_keys::keys::{ use penumbra_proof_params::{DummyWitness, VerifyingKeyExt, GROTH16_PROOF_LENGTH_BYTES}; use penumbra_sct::{Nullifier, NullifierVar}; -/// Groth16 proof for spending existing notes. +/// The public input for a [`SpendProof`]. #[derive(Clone, Debug)] -pub struct SpendCircuit { - // Witnesses - /// Inclusion proof for the note commitment. - state_commitment_proof: tct::Proof, - /// The note being spent. - note: Note, - /// The blinding factor used for generating the value commitment. - v_blinding: Fr, - /// The randomizer used for generating the randomized spend auth key. - spend_auth_randomizer: Fr, - /// The spend authorization key. - ak: VerificationKey, - /// The nullifier deriving key. - nk: NullifierKey, - - // Public inputs +pub struct SpendProofPublic { /// the merkle root of the state commitment tree. pub anchor: tct::Root, /// value commitment of the note to be spent. @@ -58,66 +44,132 @@ pub struct SpendCircuit { pub rk: VerificationKey, } -impl SpendCircuit { - #[allow(clippy::too_many_arguments)] - pub fn new( - state_commitment_proof: tct::Proof, - note: Note, - v_blinding: Fr, - spend_auth_randomizer: Fr, - ak: VerificationKey, - nk: NullifierKey, - anchor: tct::Root, - balance_commitment: balance::Commitment, - nullifier: Nullifier, - rk: VerificationKey, - ) -> Self { - Self { - state_commitment_proof, - note, - v_blinding, - spend_auth_randomizer, - ak, - nk, - anchor, - balance_commitment, - nullifier, - rk, - } +/// The private input for a [`SpendProof`]. +#[derive(Clone, Debug)] +pub struct SpendProofPrivate { + /// Inclusion proof for the note commitment. + pub state_commitment_proof: tct::Proof, + /// The note being spent. + pub note: Note, + /// The blinding factor used for generating the value commitment. + pub v_blinding: Fr, + /// The randomizer used for generating the randomized spend auth key. + pub spend_auth_randomizer: Fr, + /// The spend authorization key. + pub ak: VerificationKey, + /// The nullifier deriving key. + pub nk: NullifierKey, +} + +#[cfg(test)] +fn check_satisfaction(public: &SpendProofPublic, private: &SpendProofPrivate) -> Result<()> { + use penumbra_keys::keys::FullViewingKey; + + let amount_u128: u128 = private.note.value().amount.into(); + if amount_u128 == 0u128 { + return Ok(()); + } + + let note_commitment = private.note.commit(); + if note_commitment != private.state_commitment_proof.commitment() { + anyhow::bail!("note commitment did not match state commitment proof"); } + + let nullifier = Nullifier::derive( + &private.nk, + private.state_commitment_proof.position(), + ¬e_commitment, + ); + if nullifier != public.nullifier { + anyhow::bail!("nullifier did not match public input"); + } + + private.state_commitment_proof.verify(public.anchor)?; + + let rk = private.ak.randomize(&private.spend_auth_randomizer); + if rk != public.rk { + anyhow::bail!("randomized spend auth key did not match public input"); + } + + let fvk = FullViewingKey::from_components(private.ak, private.nk); + let ivk = fvk.incoming(); + let transmission_key = ivk.diversified_public(&private.note.diversified_generator()); + if transmission_key != *private.note.transmission_key() { + anyhow::bail!("transmission key did not match note"); + } + + let balance_commitment = private.note.value().commit(private.v_blinding); + if balance_commitment != public.balance_commitment { + anyhow::bail!("balance commitment did not match public input"); + } + + if private.note.diversified_generator() == decaf377::Element::default() { + anyhow::bail!("diversified generator is identity"); + } + if private.ak.is_identity() { + anyhow::bail!("ak is identity"); + } + + Ok(()) +} + +#[cfg(test)] +fn check_circuit_satisfaction(public: SpendProofPublic, private: SpendProofPrivate) -> Result<()> { + use ark_relations::r1cs::{self, ConstraintSystem}; + + let cs = ConstraintSystem::new_ref(); + let circuit = SpendCircuit { public, private }; + cs.set_optimization_goal(r1cs::OptimizationGoal::Constraints); + circuit + .generate_constraints(cs.clone()) + .expect("can generate constraints from circuit"); + cs.finalize(); + if !cs.is_satisfied()? { + anyhow::bail!("constraints are not satisfied"); + } + Ok(()) +} + +/// Groth16 proof for spending existing notes. +#[derive(Clone, Debug)] +pub struct SpendCircuit { + public: SpendProofPublic, + private: SpendProofPrivate, } impl ConstraintSynthesizer for SpendCircuit { fn generate_constraints(self, cs: ConstraintSystemRef) -> ark_relations::r1cs::Result<()> { // Witnesses - let note_var = note::NoteVar::new_witness(cs.clone(), || Ok(self.note.clone()))?; + let note_var = note::NoteVar::new_witness(cs.clone(), || Ok(self.private.note.clone()))?; let claimed_note_commitment = StateCommitmentVar::new_witness(cs.clone(), || { - Ok(self.state_commitment_proof.commitment()) + Ok(self.private.state_commitment_proof.commitment()) })?; let position_var = tct::r1cs::PositionVar::new_witness(cs.clone(), || { - Ok(self.state_commitment_proof.position()) + Ok(self.private.state_commitment_proof.position()) })?; let position_bits = position_var.to_bits_le()?; let merkle_path_var = tct::r1cs::MerkleAuthPathVar::new_witness(cs.clone(), || { - Ok(self.state_commitment_proof) + Ok(self.private.state_commitment_proof) })?; - let v_blinding_arr: [u8; 32] = self.v_blinding.to_bytes(); + let v_blinding_arr: [u8; 32] = self.private.v_blinding.to_bytes(); let v_blinding_vars = UInt8::new_witness_vec(cs.clone(), &v_blinding_arr)?; - let spend_auth_randomizer_var = - SpendAuthRandomizerVar::new_witness(cs.clone(), || Ok(self.spend_auth_randomizer))?; + let spend_auth_randomizer_var = SpendAuthRandomizerVar::new_witness(cs.clone(), || { + Ok(self.private.spend_auth_randomizer) + })?; let ak_element_var: AuthorizationKeyVar = - AuthorizationKeyVar::new_witness(cs.clone(), || Ok(self.ak))?; - let nk_var = NullifierKeyVar::new_witness(cs.clone(), || Ok(self.nk))?; + AuthorizationKeyVar::new_witness(cs.clone(), || Ok(self.private.ak))?; + let nk_var = NullifierKeyVar::new_witness(cs.clone(), || Ok(self.private.nk))?; // Public inputs - let anchor_var = FqVar::new_input(cs.clone(), || Ok(Fq::from(self.anchor)))?; + let anchor_var = FqVar::new_input(cs.clone(), || Ok(Fq::from(self.public.anchor)))?; let claimed_balance_commitment_var = - BalanceCommitmentVar::new_input(cs.clone(), || Ok(self.balance_commitment))?; - let claimed_nullifier_var = NullifierVar::new_input(cs.clone(), || Ok(self.nullifier))?; - let rk_var = RandomizedVerificationKey::new_input(cs.clone(), || Ok(self.rk))?; + BalanceCommitmentVar::new_input(cs.clone(), || Ok(self.public.balance_commitment))?; + let claimed_nullifier_var = + NullifierVar::new_input(cs.clone(), || Ok(self.public.nullifier))?; + let rk_var = RandomizedVerificationKey::new_input(cs.clone(), || Ok(self.public.rk))?; // We short circuit to true if value released is 0. That means this is a _dummy_ spend. let is_dummy = note_var.amount().is_eq(&FqVar::zero())?; @@ -198,18 +250,22 @@ impl DummyWitness for SpendCircuit { .witness(note_commitment) .expect("able to witness just-inserted note commitment"); - Self { + let public = SpendProofPublic { + anchor, + balance_commitment: balance::Commitment(decaf377::basepoint()), + nullifier, + rk, + }; + let private = SpendProofPrivate { state_commitment_proof, note, v_blinding, spend_auth_randomizer, ak, nk, - anchor, - balance_commitment: balance::Commitment(decaf377::basepoint()), - nullifier, - rk, - } + }; + + Self { public, private } } } @@ -217,36 +273,16 @@ impl DummyWitness for SpendCircuit { pub struct SpendProof([u8; GROTH16_PROOF_LENGTH_BYTES]); impl SpendProof { - #![allow(clippy::too_many_arguments)] /// Generate a `SpendProof` given the proving key, public inputs, /// witness data, and two random elements `blinding_r` and `blinding_s`. pub fn prove( blinding_r: Fq, blinding_s: Fq, pk: &ProvingKey, - state_commitment_proof: tct::Proof, - note: Note, - v_blinding: Fr, - spend_auth_randomizer: Fr, - ak: VerificationKey, - nk: NullifierKey, - anchor: tct::Root, - balance_commitment: balance::Commitment, - nullifier: Nullifier, - rk: VerificationKey, + public: SpendProofPublic, + private: SpendProofPrivate, ) -> anyhow::Result { - let circuit = SpendCircuit { - state_commitment_proof, - note, - v_blinding, - spend_auth_randomizer, - ak, - nk, - anchor, - balance_commitment, - nullifier, - rk, - }; + let circuit = SpendCircuit { public, private }; let proof = Groth16::::create_proof_with_reduction( circuit, pk, blinding_r, blinding_s, ) @@ -263,29 +299,28 @@ impl SpendProof { pub fn verify( &self, vk: &PreparedVerifyingKey, - anchor: tct::Root, - balance_commitment: balance::Commitment, - nullifier: Nullifier, - rk: VerificationKey, + public: SpendProofPublic, ) -> anyhow::Result<()> { let proof = Proof::deserialize_compressed_unchecked(&self.0[..]).map_err(|e| anyhow::anyhow!(e))?; let mut public_inputs = Vec::new(); - public_inputs.extend([Fq::from(anchor.0)]); + public_inputs.extend([Fq::from(public.anchor.0)]); public_inputs.extend( - balance_commitment + public + .balance_commitment .0 .to_field_elements() .ok_or_else(|| anyhow::anyhow!("balance commitment is not a valid element"))?, ); public_inputs.extend( - nullifier + public + .nullifier .0 .to_field_elements() .ok_or_else(|| anyhow::anyhow!("nullifier is not a valid element"))?, ); - let element_rk = decaf377::Encoding(rk.to_bytes()) + let element_rk = decaf377::Encoding(public.rk.to_bytes()) .vartime_decompress() .expect("expect only valid element points"); public_inputs.extend( @@ -340,6 +375,7 @@ mod tests { keys::{Bip44Path, SeedPhrase, SpendKey}, Address, }; + use penumbra_num::Amount; use penumbra_proof_params::generate_prepared_test_parameters; use penumbra_sct::Nullifier; use penumbra_tct::StateCommitment; @@ -359,68 +395,69 @@ mod tests { .boxed() } - proptest! { - #![proptest_config(ProptestConfig::with_cases(2))] - #[test] - /// Check that the `SpendProof` verification succeeds. - fn spend_proof_verification_success(seed_phrase_randomness in any::<[u8; 32]>(), spend_auth_randomizer in fr_strategy(), value_amount in 2..2000000000u64, num_commitments in 1..2000u64, v_blinding in fr_strategy()) { - let mut rng = OsRng; - let (pk, vk) = generate_prepared_test_parameters::(&mut rng); + prop_compose! { + fn arb_valid_spend_statement()(v_blinding in fr_strategy(), spend_auth_randomizer in fr_strategy(), asset_id64 in any::(), address_index in any::(), amount in any::(), seed_phrase_randomness in any::<[u8; 32]>(), rseed_randomness in any::<[u8; 32]>(), num_commitments in 0..100) -> (SpendProofPublic, SpendProofPrivate) { + let seed_phrase = SeedPhrase::from_randomness(&seed_phrase_randomness); + let sk_sender = SpendKey::from_seed_phrase_bip44(seed_phrase, &Bip44Path::new(0)); + let fvk_sender = sk_sender.full_viewing_key(); + let ivk_sender = fvk_sender.incoming(); + let (sender, _dtk_d) = ivk_sender.payment_address(address_index.into()); + let value_to_send = Value { + amount: Amount::from(amount), + asset_id: asset::Id(Fq::from(asset_id64)), + }; + let note = Note::from_parts( + sender, + value_to_send, + Rseed(rseed_randomness), + ).expect("should be able to create note"); + let note_commitment = note.commit(); + let rsk = sk_sender.spend_auth_key().randomize(&spend_auth_randomizer); + let nk = *sk_sender.nullifier_key(); + let ak: VerificationKey = sk_sender.spend_auth_key().into(); - let seed_phrase = SeedPhrase::from_randomness(&seed_phrase_randomness); - let sk_sender = SpendKey::from_seed_phrase_bip44(seed_phrase, &Bip44Path::new(0)); - let fvk_sender = sk_sender.full_viewing_key(); - let ivk_sender = fvk_sender.incoming(); - let (sender, _dtk_d) = ivk_sender.payment_address(0u32.into()); + let mut sct = tct::Tree::new(); - let value_to_send = Value { - amount: value_amount.into(), - asset_id: asset::Cache::with_known_assets().get_unit("upenumbra").unwrap().id(), - }; + // Next, we simulate the case where the SCT is not empty by adding `num_commitments` + // unrelated items in the SCT. + for i in 0..num_commitments { + // To avoid duplicate note commitments, we use the `i` counter as the Rseed randomness + let rseed = Rseed([i as u8; 32]); + let dummy_note_commitment = Note::from_parts(sender, value_to_send, rseed).expect("can create note").commit(); + sct.insert(tct::Witness::Keep, dummy_note_commitment).expect("should be able to insert note commitments into the SCT"); + } - let note = Note::generate(&mut rng, &sender, value_to_send); - let note_commitment = note.commit(); - let rsk = sk_sender.spend_auth_key().randomize(&spend_auth_randomizer); - let nk = *sk_sender.nullifier_key(); - let ak: VerificationKey = sk_sender.spend_auth_key().into(); - let mut sct = tct::Tree::new(); + sct.insert(tct::Witness::Keep, note_commitment).expect("should be able to insert note commitments into the SCT"); + let anchor = sct.root(); + let state_commitment_proof = sct.witness(note_commitment).expect("can witness note commitment"); + let balance_commitment = value_to_send.commit(v_blinding); + let rk: VerificationKey = rsk.into(); + let nullifier = Nullifier::derive(&nk, state_commitment_proof.position(), ¬e_commitment); - // Next, we simulate the case where the SCT is not empty by adding `num_commitments` - // unrelated items in the SCT. - for _ in 0..num_commitments { - let random_note_commitment = Note::generate(&mut rng, &sender, value_to_send).commit(); - sct.insert(tct::Witness::Keep, random_note_commitment).unwrap(); + let public = SpendProofPublic { + anchor, + balance_commitment, + nullifier, + rk, + }; + let private = SpendProofPrivate { + state_commitment_proof, + note, + v_blinding, + spend_auth_randomizer, + ak, + nk, + }; + (public, private) } - - sct.insert(tct::Witness::Keep, note_commitment).unwrap(); - let anchor = sct.root(); - let state_commitment_proof = sct.witness(note_commitment).unwrap(); - let balance_commitment = value_to_send.commit(v_blinding); - let rk: VerificationKey = rsk.into(); - let nf = Nullifier::derive(&nk, state_commitment_proof.position(), ¬e_commitment); - - let blinding_r = Fq::rand(&mut OsRng); - let blinding_s = Fq::rand(&mut OsRng); - let proof = SpendProof::prove( - blinding_r, - blinding_s, - &pk, - state_commitment_proof, - note, - v_blinding, - spend_auth_randomizer, - ak, - nk, - anchor, - balance_commitment, - nf, - rk, - ) - .expect("can create proof"); - - let proof_result = proof.verify(&vk, anchor, balance_commitment, nf, rk); - assert!(proof_result.is_ok()); } + + proptest! { + #[test] + fn spend_proof_happy_path((public, private) in arb_valid_spend_statement()) { + assert!(check_satisfaction(&public, &private).is_ok()); + assert!(check_circuit_satisfaction(public, private).is_ok()); + } } proptest! { @@ -459,24 +496,36 @@ mod tests { let blinding_r = Fq::rand(&mut OsRng); let blinding_s = Fq::rand(&mut OsRng); - let proof = SpendProof::prove( - blinding_r, - blinding_s, - &pk, + let public = SpendProofPublic { + anchor, + balance_commitment, + nullifier: nf, + rk, + }; + let private = SpendProofPrivate { state_commitment_proof, note, v_blinding, spend_auth_randomizer, ak, nk, - anchor, - balance_commitment, - nf, - rk, + }; + let proof = SpendProof::prove( + blinding_r, + blinding_s, + &pk, + public, + private ) .expect("can create proof"); - let proof_result = proof.verify(&vk, incorrect_anchor, balance_commitment, nf, rk); + let incorrect_public = SpendProofPublic { + anchor: incorrect_anchor, + balance_commitment, + nullifier: nf, + rk, + }; + let proof_result = proof.verify(&vk, incorrect_public); assert!(proof_result.is_err()); } } @@ -523,23 +572,29 @@ mod tests { // In release mode the proof will be created, but will fail to verify. let blinding_r = Fq::rand(&mut OsRng); let blinding_s = Fq::rand(&mut OsRng); - let proof = SpendProof::prove( - blinding_r, - blinding_s, - &pk, + let public = SpendProofPublic { + anchor, + balance_commitment, + nullifier: nf, + rk, + }; + let private = SpendProofPrivate { state_commitment_proof, note, v_blinding, spend_auth_randomizer, ak, nk, - anchor, - balance_commitment, - nf, - rk, + }; + let proof = SpendProof::prove( + blinding_r, + blinding_s, + &pk, + public.clone(), + private ).expect("can create proof in release mode"); - proof.verify(&vk, anchor, balance_commitment, nf, rk).expect("boom"); + proof.verify(&vk, public).expect("boom"); } } @@ -580,24 +635,35 @@ mod tests { let blinding_r = Fq::rand(&mut OsRng); let blinding_s = Fq::rand(&mut OsRng); - let proof = SpendProof::prove( - blinding_r, - blinding_s, - &pk, + let public = SpendProofPublic { + anchor, + balance_commitment, + nullifier: nf, + rk, + }; + let private = SpendProofPrivate { state_commitment_proof, note, v_blinding, spend_auth_randomizer, ak, nk, - anchor, - balance_commitment, - nf, - rk, + }; + let proof = SpendProof::prove( + blinding_r, + blinding_s, + &pk, + public, private ) .expect("can create proof"); - let proof_result = proof.verify(&vk, anchor, balance_commitment, incorrect_nf, rk); + let incorrect_public = SpendProofPublic { + anchor, + balance_commitment, + nullifier: incorrect_nf, + rk, + }; + let proof_result = proof.verify(&vk, incorrect_public); assert!(proof_result.is_err()); } } @@ -637,26 +703,38 @@ mod tests { let blinding_r = Fq::rand(&mut OsRng); let blinding_s = Fq::rand(&mut OsRng); - let proof = SpendProof::prove( - blinding_r, - blinding_s, - &pk, + let public = SpendProofPublic { + anchor, + balance_commitment, + nullifier: nf, + rk, + }; + let private = SpendProofPrivate { state_commitment_proof, note, v_blinding, spend_auth_randomizer, ak, nk, - anchor, - balance_commitment, - nf, - rk, + }; + let proof = SpendProof::prove( + blinding_r, + blinding_s, + &pk, + public, private + ) .expect("can create proof"); let incorrect_balance_commitment = value_to_send.commit(incorrect_blinding_factor); + let incorrect_public = SpendProofPublic { + anchor, + balance_commitment: incorrect_balance_commitment, + nullifier: nf, + rk, + }; - let proof_result = proof.verify(&vk, anchor, incorrect_balance_commitment, nf, rk); + let proof_result = proof.verify(&vk, incorrect_public); assert!(proof_result.is_err()); } } @@ -700,24 +778,35 @@ mod tests { let blinding_r = Fq::rand(&mut OsRng); let blinding_s = Fq::rand(&mut OsRng); - let proof = SpendProof::prove( - blinding_r, - blinding_s, - &pk, + let public = SpendProofPublic { + anchor, + balance_commitment, + nullifier: nf, + rk, + }; + let private = SpendProofPrivate { state_commitment_proof, note, v_blinding, spend_auth_randomizer, ak, nk, - anchor, - balance_commitment, - nf, - rk, + }; + let proof = SpendProof::prove( + blinding_r, + blinding_s, + &pk, + public, private ) .expect("should be able to form proof"); - let proof_result = proof.verify(&vk, anchor, balance_commitment, nf, incorrect_rk); + let incorrect_public = SpendProofPublic { + anchor, + balance_commitment, + nullifier: nf, + rk: incorrect_rk, + }; + let proof_result = proof.verify(&vk, incorrect_public); assert!(proof_result.is_err()); } } @@ -758,24 +847,29 @@ mod tests { let blinding_r = Fq::rand(&mut OsRng); let blinding_s = Fq::rand(&mut OsRng); - let proof = SpendProof::prove( - blinding_r, - blinding_s, - &pk, + let public = SpendProofPublic { + anchor, + balance_commitment, + nullifier: nf, + rk, + }; + let private = SpendProofPrivate { state_commitment_proof, note, v_blinding, spend_auth_randomizer, ak, nk, - anchor, - balance_commitment, - nf, - rk, + }; + let proof = SpendProof::prove( + blinding_r, + blinding_s, + &pk, + public.clone(), private ) .expect("should be able to form proof"); - let proof_result = proof.verify(&vk, anchor, balance_commitment, nf, rk); + let proof_result = proof.verify(&vk, public); assert!(proof_result.is_ok()); } } diff --git a/crates/core/component/stake/Cargo.toml b/crates/core/component/stake/Cargo.toml index a94fc8f7f4..da57cd70ac 100644 --- a/crates/core/component/stake/Cargo.toml +++ b/crates/core/component/stake/Cargo.toml @@ -14,7 +14,7 @@ component = [ "penumbra-chain/component", "penumbra-sct/component", "penumbra-shielded-pool/component", - "penumbra-dao/component", + "penumbra-community-pool/component", "penumbra-distributions/component", "tokio", "im", @@ -42,9 +42,10 @@ cnidarium = { path = "../../../cnidarium", default-features = false, optional = cnidarium-component = { path = "../../../cnidarium-component", default-features = false, optional = true } penumbra-asset = { path = "../../../core/asset", default-features = false } penumbra-chain = { path = "../chain", default-features = false } -penumbra-dao = { path = "../dao", default-features = false } +penumbra-community-pool = { path = "../community-pool", default-features = false } penumbra-distributions = { path = "../distributions", default-features = false } penumbra-keys = { path = "../../../core/keys", default-features = false } +penumbra-txhash = { path = "../../../core/txhash", default-features = false } penumbra-num = { path = "../../../core/num", default-features = false } penumbra-proof-params = { path = "../../../crypto/proof-params" } penumbra-proto = { path = "../../../proto" } diff --git a/crates/core/component/stake/proptest-regressions/undelegate_claim/proof.txt b/crates/core/component/stake/proptest-regressions/undelegate_claim/proof.txt new file mode 100644 index 0000000000..d7e7ebc9ad --- /dev/null +++ b/crates/core/component/stake/proptest-regressions/undelegate_claim/proof.txt @@ -0,0 +1,7 @@ +# Seeds for failure cases proptest has generated in the past. It is +# automatically read and these particular cases re-run before any +# novel cases are generated. +# +# It is recommended to check this file in to source control so that +# everyone who runs the test benefits from these saved cases. +cc 268e09dabd00548b6ce748f76b5e39104c9161dfd105b4a993f525ca98bc05f2 # shrinks to validator_randomness = BigInt([17614246279131841307, 7571284855640941685, 13271551846766545027, 97259222361261000]), balance_blinding = BigInt([15203842769407007026, 13547731313853933246, 12820089889910798158, 300984408317658221]), value1_amount = 94, penalty_amount = 72 diff --git a/crates/core/component/stake/src/action_handler/undelegate_claim.rs b/crates/core/component/stake/src/action_handler/undelegate_claim.rs index cb76d59894..de615231d1 100644 --- a/crates/core/component/stake/src/action_handler/undelegate_claim.rs +++ b/crates/core/component/stake/src/action_handler/undelegate_claim.rs @@ -4,8 +4,9 @@ use anyhow::{ensure, Result}; use async_trait::async_trait; use cnidarium::{StateRead, StateWrite}; use penumbra_chain::component::StateReadExt; -use penumbra_proof_params::UNDELEGATECLAIM_PROOF_VERIFICATION_KEY; +use penumbra_proof_params::CONVERT_PROOF_VERIFICATION_KEY; +use crate::undelegate_claim::UndelegateClaimProofPublic; use crate::UndelegateClaim; use crate::{action_handler::ActionHandler, StateReadExt as _, UnbondingToken}; @@ -17,10 +18,12 @@ impl ActionHandler for UndelegateClaim { UnbondingToken::new(self.body.validator_identity, self.body.start_epoch_index).id(); self.proof.verify( - &UNDELEGATECLAIM_PROOF_VERIFICATION_KEY, - self.body.balance_commitment, - unbonding_id, - self.body.penalty, + &CONVERT_PROOF_VERIFICATION_KEY, + UndelegateClaimProofPublic { + balance_commitment: self.body.balance_commitment, + unbonding_id, + penalty: self.body.penalty, + }, )?; Ok(()) diff --git a/crates/core/component/stake/src/component.rs b/crates/core/component/stake/src/component.rs index a470443d10..9afbfaba6b 100644 --- a/crates/core/component/stake/src/component.rs +++ b/crates/core/component/stake/src/component.rs @@ -21,7 +21,7 @@ use penumbra_chain::{ component::{StateReadExt as _, StateWriteExt as _}, Epoch, }; -use penumbra_dao::component::StateWriteExt as _; +use penumbra_community_pool::component::StateWriteExt as _; use cnidarium::{StateRead, StateWrite}; use penumbra_distributions::component::StateReadExt as _; @@ -508,9 +508,9 @@ pub(crate) trait StakingImpl: StateWriteExt { ) .await?; } - // If the recipient is the DAO, deposit the funds into the DAO - Recipient::Dao => { - self.dao_deposit(Value { + // If the recipient is the Community Pool, deposit the funds into the Community Pool + Recipient::CommunityPool => { + self.community_pool_deposit(Value { amount: commission_reward_amount.into(), asset_id: *STAKING_TOKEN_ASSET_ID, }) diff --git a/crates/core/component/stake/src/delegate.rs b/crates/core/component/stake/src/delegate.rs index 302e4b6ec4..899e15268e 100644 --- a/crates/core/component/stake/src/delegate.rs +++ b/crates/core/component/stake/src/delegate.rs @@ -1,6 +1,7 @@ use penumbra_asset::{Balance, Value, STAKING_TOKEN_ASSET_ID}; use penumbra_num::Amount; use penumbra_proto::{penumbra::core::component::stake::v1alpha1 as pb, DomainType}; +use penumbra_txhash::{EffectHash, EffectingData}; use serde::{Deserialize, Serialize}; use crate::{DelegationToken, IdentityKey}; @@ -26,6 +27,13 @@ pub struct Delegate { pub delegation_amount: Amount, } +impl EffectingData for Delegate { + fn effect_hash(&self) -> EffectHash { + // For delegations, the entire action is considered effecting data. + EffectHash::from_proto_effecting_data(&self.to_proto()) + } +} + impl Delegate { /// Return the balance resulting from issuing delegation tokens from staking tokens. pub fn balance(&self) -> Balance { diff --git a/crates/core/component/stake/src/funding_stream.rs b/crates/core/component/stake/src/funding_stream.rs index ed8bbf1233..73a8dcad4f 100644 --- a/crates/core/component/stake/src/funding_stream.rs +++ b/crates/core/component/stake/src/funding_stream.rs @@ -18,7 +18,7 @@ pub enum FundingStream { /// validator's total staking reward that goes to this funding stream. rate_bps: u16, }, - ToDao { + ToCommunityPool { /// The portion (in terms of [basis points](https://en.wikipedia.org/wiki/Basis_point)) of the /// validator's total staking reward that goes to this funding stream. rate_bps: u16, @@ -29,21 +29,21 @@ pub enum FundingStream { #[derive(Debug, PartialEq, Eq, Clone, Copy)] pub enum Recipient { Address(Address), - Dao, + CommunityPool, } impl FundingStream { pub fn rate_bps(&self) -> u16 { match self { FundingStream::ToAddress { rate_bps, .. } => *rate_bps, - FundingStream::ToDao { rate_bps } => *rate_bps, + FundingStream::ToCommunityPool { rate_bps } => *rate_bps, } } pub fn recipient(&self) -> Recipient { match self { FundingStream::ToAddress { address, .. } => Recipient::Address(*address), - FundingStream::ToDao { .. } => Recipient::Dao, + FundingStream::ToCommunityPool { .. } => Recipient::CommunityPool, } } } @@ -83,11 +83,13 @@ impl From for pb::FundingStream { rate_bps: rate_bps.into(), }), ), - FundingStream::ToDao { rate_bps } => Some(pb::funding_stream::Recipient::ToDao( - pb::funding_stream::ToDao { - rate_bps: rate_bps.into(), - }, - )), + FundingStream::ToCommunityPool { rate_bps } => { + Some(pb::funding_stream::Recipient::ToCommunityPool( + pb::funding_stream::ToCommunityPool { + rate_bps: rate_bps.into(), + }, + )) + } }, } } @@ -115,15 +117,15 @@ impl TryFrom for FundingStream { } Ok(FundingStream::ToAddress { address, rate_bps }) } - pb::funding_stream::Recipient::ToDao(to_dao) => { - let rate_bps = to_dao + pb::funding_stream::Recipient::ToCommunityPool(to_community_pool) => { + let rate_bps = to_community_pool .rate_bps .try_into() .map_err(|e| anyhow::anyhow!("invalid funding stream rate: {}", e))?; if rate_bps > 10_000 { anyhow::bail!("funding stream rate exceeds 100% (10,000bps)"); } - Ok(FundingStream::ToDao { rate_bps }) + Ok(FundingStream::ToCommunityPool { rate_bps }) } } } diff --git a/crates/core/component/stake/src/lib.rs b/crates/core/component/stake/src/lib.rs index bf8f09f233..b0f083ecdf 100644 --- a/crates/core/component/stake/src/lib.rs +++ b/crates/core/component/stake/src/lib.rs @@ -28,8 +28,7 @@ pub mod validator; pub use delegate::Delegate; pub use undelegate::Undelegate; pub use undelegate_claim::{ - UndelegateClaim, UndelegateClaimBody, UndelegateClaimCircuit, UndelegateClaimPlan, - UndelegateClaimProof, + UndelegateClaim, UndelegateClaimBody, UndelegateClaimPlan, UndelegateClaimProof, }; mod delegation_token; @@ -41,7 +40,7 @@ mod unbonding_token; pub use delegation_token::DelegationToken; pub use governance_key::GovernanceKey; pub use identity_key::IdentityKey; -pub use penalty::{Penalty, PenaltyVar}; +pub use penalty::Penalty; pub use unbonding_token::UnbondingToken; pub use changes::DelegationChanges; diff --git a/crates/core/component/stake/src/penalty.rs b/crates/core/component/stake/src/penalty.rs index 43e785238d..ed0fd76928 100644 --- a/crates/core/component/stake/src/penalty.rs +++ b/crates/core/component/stake/src/penalty.rs @@ -1,19 +1,10 @@ use ark_ff::ToConstraintField; -use ark_r1cs_std::prelude::*; -use ark_relations::r1cs::SynthesisError; use decaf377::Fq; use penumbra_proto::{penumbra::core::component::stake::v1alpha1 as pbs, DomainType}; use serde::{Deserialize, Serialize}; -use penumbra_asset::{ - asset::{self, AssetIdVar}, - balance::BalanceVar, - Balance, Value, ValueVar, STAKING_TOKEN_ASSET_ID, -}; -use penumbra_num::{ - fixpoint::{U128x128, U128x128Var}, - Amount, AmountVar, -}; +use penumbra_asset::{asset, Balance, Value, STAKING_TOKEN_ASSET_ID}; +use penumbra_num::{fixpoint::U128x128, Amount}; /// Tracks slashing penalties applied to a validator in some epoch. /// @@ -58,6 +49,13 @@ impl Penalty { ) } + /// A rate representing how much of an asset remains after applying a penalty. + /// + /// e.g. a 1% penalty will yield a rate of 0.99 here. + pub fn kept_rate(&self) -> U128x128 { + self.0 + } + /// Compound this `Penalty` with another `Penalty`. pub fn compound(&self, other: Penalty) -> Penalty { Self((self.0 * other.0).expect("compounding penalities will not overflow")) @@ -65,10 +63,9 @@ impl Penalty { /// Apply this `Penalty` to an `Amount` of unbonding tokens. pub fn apply_to_amount(&self, amount: Amount) -> Amount { - self.apply_to(amount) - .round_down() - .try_into() - .expect("converting integral U128xU128 into Amount will succeed") + self.0 + .apply_to_amount(&amount) + .expect("should not overflow, because penalty is <= 1") } /// Apply this `Penalty` to some fraction. @@ -118,73 +115,6 @@ impl<'a> TryFrom<&'a [u8]> for Penalty { } } -/// One explicit choice in this in circuit representation is that we -/// DO NOT CHECK THAT THE PENALTY IS <= 1 IN CIRCUIT. This is in practice -/// the UndelegateClaim circuit is the ONLY consumer of this type, and -/// in the context of that circuit, the penalty is checked out of circuit -/// to conform to a real value which will be <= 1. -/// -/// I repeat myself: IF YOU EVER USE THIS IN A DIFFERENT CIRCUIT, MAKE ABSOLUTELY -/// CERTAIN THAT A PENALTY BEING > 1 IN CIRCUIT IS NOT AN ISSUE. -pub struct PenaltyVar { - inner: U128x128Var, -} - -impl AllocVar for PenaltyVar { - fn new_variable>( - cs: impl Into>, - f: impl FnOnce() -> Result, - mode: ark_r1cs_std::prelude::AllocationMode, - ) -> Result { - assert!( - matches!(mode, ark_r1cs_std::prelude::AllocationMode::Input), - "Penalty must be an input variable" - ); - Ok(Self { - inner: U128x128Var::new_variable(cs, || Ok(f()?.borrow().0), mode)?, - }) - } -} - -impl PenaltyVar { - pub fn apply_to(&self, amount: AmountVar) -> Result { - U128x128Var::from_amount_var(amount)? - .checked_mul(&self.inner)? - .round_down_to_amount() - } - - pub fn balance_for_claim( - &self, - unbonding_id: AssetIdVar, - unbonding_amount: AmountVar, - ) -> Result { - let negative_value = BalanceVar::from_negative_value_var(ValueVar { - amount: unbonding_amount.clone(), - asset_id: unbonding_id, - }); - let staking_token_asset_id_var = - AssetIdVar::new_witness(self.cs(), || Ok(*STAKING_TOKEN_ASSET_ID))?; - - let positive_value = BalanceVar::from_positive_value_var(ValueVar { - amount: self.apply_to(unbonding_amount)?, - asset_id: staking_token_asset_id_var, - }); - Ok(negative_value + positive_value) - } -} - -impl R1CSVar for PenaltyVar { - type Value = Penalty; - - fn cs(&self) -> ark_relations::r1cs::ConstraintSystemRef { - self.inner.cs() - } - - fn value(&self) -> Result { - Ok(Penalty(self.inner.value()?)) - } -} - impl DomainType for Penalty { type Proto = pbs::Penalty; } diff --git a/crates/core/component/stake/src/undelegate.rs b/crates/core/component/stake/src/undelegate.rs index a36f8c87f8..34ff6aa2aa 100644 --- a/crates/core/component/stake/src/undelegate.rs +++ b/crates/core/component/stake/src/undelegate.rs @@ -1,6 +1,7 @@ use penumbra_asset::{Balance, Value}; use penumbra_num::Amount; use penumbra_proto::{penumbra::core::component::stake::v1alpha1 as pb, DomainType}; +use penumbra_txhash::{EffectHash, EffectingData}; use serde::{Deserialize, Serialize}; use crate::{DelegationToken, IdentityKey, UnbondingToken}; @@ -24,6 +25,13 @@ pub struct Undelegate { pub delegation_amount: Amount, } +impl EffectingData for Undelegate { + fn effect_hash(&self) -> EffectHash { + // For undelegations, the entire action is considered effecting data. + EffectHash::from_proto_effecting_data(&self.to_proto()) + } +} + impl Undelegate { /// Return the balance after consuming delegation tokens, and producing unbonding tokens. pub fn balance(&self) -> Balance { diff --git a/crates/core/component/stake/src/undelegate_claim/action.rs b/crates/core/component/stake/src/undelegate_claim/action.rs index a9c89315d2..ace21b54bb 100644 --- a/crates/core/component/stake/src/undelegate_claim/action.rs +++ b/crates/core/component/stake/src/undelegate_claim/action.rs @@ -1,5 +1,6 @@ use penumbra_asset::balance; use penumbra_proto::{penumbra::core::component::stake::v1alpha1 as pb, DomainType}; +use penumbra_txhash::{EffectHash, EffectingData}; use serde::{Deserialize, Serialize}; use crate::{IdentityKey, Penalty, UndelegateClaimProof}; @@ -24,6 +25,19 @@ pub struct UndelegateClaim { pub proof: UndelegateClaimProof, } +impl EffectingData for UndelegateClaimBody { + fn effect_hash(&self) -> EffectHash { + EffectHash::from_proto_effecting_data(&self.to_proto()) + } +} +impl EffectingData for UndelegateClaim { + fn effect_hash(&self) -> EffectHash { + // The effecting data is in the body of the undelegate claim, so we can + // just use hash the proto-encoding of the body. + self.body.effect_hash() + } +} + impl DomainType for UndelegateClaimBody { type Proto = pb::UndelegateClaimBody; } diff --git a/crates/core/component/stake/src/undelegate_claim/mod.rs b/crates/core/component/stake/src/undelegate_claim/mod.rs index 5091b350f7..7880b7e074 100644 --- a/crates/core/component/stake/src/undelegate_claim/mod.rs +++ b/crates/core/component/stake/src/undelegate_claim/mod.rs @@ -4,4 +4,4 @@ mod proof; pub use action::{UndelegateClaim, UndelegateClaimBody}; pub use plan::UndelegateClaimPlan; -pub use proof::{UndelegateClaimCircuit, UndelegateClaimProof}; +pub use proof::{UndelegateClaimProof, UndelegateClaimProofPrivate, UndelegateClaimProofPublic}; diff --git a/crates/core/component/stake/src/undelegate_claim/plan.rs b/crates/core/component/stake/src/undelegate_claim/plan.rs index a55dad44bb..6eb60dfc93 100644 --- a/crates/core/component/stake/src/undelegate_claim/plan.rs +++ b/crates/core/component/stake/src/undelegate_claim/plan.rs @@ -1,7 +1,7 @@ use decaf377::{FieldExt, Fq, Fr}; use penumbra_asset::{asset, balance, Balance}; use penumbra_num::Amount; -use penumbra_proof_params::UNDELEGATECLAIM_PROOF_PROVING_KEY; +use penumbra_proof_params::CONVERT_PROOF_PROVING_KEY; use penumbra_proto::{penumbra::core::component::stake::v1alpha1 as pb, DomainType}; use serde::{Deserialize, Serialize}; @@ -11,6 +11,8 @@ use crate::{ UndelegateClaimProof, }; +use super::UndelegateClaimProofPublic; + #[derive(Clone, Debug, Deserialize, Serialize)] #[serde(try_from = "pb::UndelegateClaimPlan", into = "pb::UndelegateClaimPlan")] pub struct UndelegateClaimPlan { @@ -55,12 +57,16 @@ impl UndelegateClaimPlan { UndelegateClaimProof::prove( self.proof_blinding_r, self.proof_blinding_s, - &UNDELEGATECLAIM_PROOF_PROVING_KEY, - self.unbonding_amount, - self.balance_blinding, - self.balance_commitment(), - self.unbonding_id(), - self.penalty, + &CONVERT_PROOF_PROVING_KEY, + UndelegateClaimProofPublic { + balance_commitment: self.balance_commitment(), + unbonding_id: self.unbonding_id(), + penalty: self.penalty, + }, + super::UndelegateClaimProofPrivate { + unbonding_amount: self.unbonding_amount, + balance_blinding: self.balance_blinding, + }, ) .expect("can generate undelegate claim proof") } diff --git a/crates/core/component/stake/src/undelegate_claim/proof.rs b/crates/core/component/stake/src/undelegate_claim/proof.rs index fd5bf52e29..dfe8b9bb6e 100644 --- a/crates/core/component/stake/src/undelegate_claim/proof.rs +++ b/crates/core/component/stake/src/undelegate_claim/proof.rs @@ -1,99 +1,53 @@ -use ark_groth16::r1cs_to_qap::LibsnarkReduction; -use ark_r1cs_std::uint8::UInt8; -use ark_serialize::{CanonicalDeserialize, CanonicalSerialize}; use decaf377::Bls12_377; -use ark_ff::ToConstraintField; -use ark_groth16::{Groth16, PreparedVerifyingKey, Proof, ProvingKey}; -use ark_r1cs_std::prelude::*; -use ark_relations::r1cs::{ConstraintSynthesizer, ConstraintSystemRef}; -use ark_snark::SNARK; +use ark_groth16::{PreparedVerifyingKey, ProvingKey}; use penumbra_proto::{core::component::stake::v1alpha1 as pb, DomainType}; -use decaf377::{FieldExt, Fq, Fr}; -use penumbra_asset::{ - asset, asset::AssetIdVar, balance, balance::commitment::BalanceCommitmentVar, Balance, Value, - STAKING_TOKEN_ASSET_ID, -}; -use penumbra_num::{Amount, AmountVar}; -use penumbra_proof_params::{DummyWitness, VerifyingKeyExt, GROTH16_PROOF_LENGTH_BYTES}; +use decaf377::{Fq, Fr}; +use penumbra_asset::{asset, balance, STAKING_TOKEN_ASSET_ID}; +use penumbra_num::Amount; +use penumbra_proof_params::VerifyingKeyExt; +use penumbra_shielded_pool::{ConvertProof, ConvertProofPrivate, ConvertProofPublic}; -use crate::{Penalty, PenaltyVar}; +use crate::Penalty; +/// The public inputs to an [`UndelegateClaimProof`]. #[derive(Clone, Debug)] -pub struct UndelegateClaimCircuit { - unbonding_amount: Amount, - balance_blinding: Fr, +pub struct UndelegateClaimProofPublic { pub balance_commitment: balance::Commitment, pub unbonding_id: asset::Id, pub penalty: Penalty, } -impl UndelegateClaimCircuit { - pub fn new( - unbonding_amount: Amount, - balance_blinding: Fr, - balance_commitment: balance::Commitment, - unbonding_id: asset::Id, - penalty: Penalty, - ) -> Self { +impl From for ConvertProofPublic { + fn from(value: UndelegateClaimProofPublic) -> Self { Self { - unbonding_amount, - balance_blinding, - balance_commitment, - unbonding_id, - penalty, + from: value.unbonding_id, + to: *STAKING_TOKEN_ASSET_ID, + rate: value.penalty.kept_rate(), + balance_commitment: value.balance_commitment, } } } -impl ConstraintSynthesizer for UndelegateClaimCircuit { - fn generate_constraints(self, cs: ConstraintSystemRef) -> ark_relations::r1cs::Result<()> { - // Witnesses - let unbonding_amount_var = - AmountVar::new_witness(cs.clone(), || Ok(self.unbonding_amount))?; - let balance_blinding_arr: [u8; 32] = self.balance_blinding.to_bytes(); - let balance_blinding_vars = UInt8::new_witness_vec(cs.clone(), &balance_blinding_arr)?; - - // Inputs - let claimed_balance_commitment = - BalanceCommitmentVar::new_input(cs.clone(), || Ok(self.balance_commitment))?; - let unbonding_id = AssetIdVar::new_input(cs.clone(), || Ok(self.unbonding_id))?; - let penalty_var = PenaltyVar::new_input(cs, || Ok(self.penalty))?; - - // Constraints - let expected_balance = penalty_var.balance_for_claim(unbonding_id, unbonding_amount_var)?; - let expected_balance_commitment = expected_balance.commit(balance_blinding_vars)?; - expected_balance_commitment.enforce_equal(&claimed_balance_commitment)?; - - Ok(()) - } +/// The private inputs to an [`UndelegateClaimProof`]. +#[derive(Clone, Debug)] +pub struct UndelegateClaimProofPrivate { + pub unbonding_amount: Amount, + pub balance_blinding: Fr, } -impl DummyWitness for UndelegateClaimCircuit { - fn with_dummy_witness() -> Self { - let penalty = Penalty::from_percent(0); - let balance_blinding = Fr::from(1); - let unbonding_amount = Amount::from(1u64); - let unbonding_id = *STAKING_TOKEN_ASSET_ID; - let balance_commitment = Balance::from(Value { - asset_id: unbonding_id, - amount: unbonding_amount, - }) - .commit(balance_blinding); - +impl From for ConvertProofPrivate { + fn from(value: UndelegateClaimProofPrivate) -> Self { Self { - penalty, - unbonding_amount, - balance_blinding, - balance_commitment, - unbonding_id, + amount: value.unbonding_amount, + balance_blinding: value.balance_blinding, } } } #[derive(Clone, Debug)] -pub struct UndelegateClaimProof([u8; GROTH16_PROOF_LENGTH_BYTES]); +pub struct UndelegateClaimProof(ConvertProof); impl UndelegateClaimProof { #![allow(clippy::too_many_arguments)] @@ -103,26 +57,11 @@ impl UndelegateClaimProof { blinding_r: Fq, blinding_s: Fq, pk: &ProvingKey, - unbonding_amount: Amount, - balance_blinding: Fr, - balance_commitment: balance::Commitment, - unbonding_id: asset::Id, - penalty: Penalty, + public: UndelegateClaimProofPublic, + private: UndelegateClaimProofPrivate, ) -> anyhow::Result { - let circuit = UndelegateClaimCircuit { - unbonding_amount, - balance_blinding, - balance_commitment, - unbonding_id, - penalty, - }; - let proof = Groth16::::create_proof_with_reduction( - circuit, pk, blinding_r, blinding_s, - ) - .map_err(|err| anyhow::anyhow!(err))?; - let mut proof_bytes = [0u8; GROTH16_PROOF_LENGTH_BYTES]; - Proof::serialize_compressed(&proof, &mut proof_bytes[..]).expect("can serialize Proof"); - Ok(Self(proof_bytes)) + let proof = ConvertProof::prove(blinding_r, blinding_s, pk, public.into(), private.into())?; + Ok(Self(proof)) } /// Called to verify the proof using the provided public inputs. @@ -130,40 +69,9 @@ impl UndelegateClaimProof { pub fn verify( &self, vk: &PreparedVerifyingKey, - balance_commitment: balance::Commitment, - unbonding_id: asset::Id, - penalty: Penalty, + public: UndelegateClaimProofPublic, ) -> anyhow::Result<()> { - let proof = - Proof::deserialize_compressed_unchecked(&self.0[..]).map_err(|e| anyhow::anyhow!(e))?; - - let mut public_inputs = Vec::new(); - public_inputs.extend(balance_commitment.0.to_field_elements().ok_or_else(|| { - anyhow::anyhow!("could not convert balance commitment to field elements") - })?); - public_inputs.extend( - unbonding_id.0.to_field_elements().ok_or_else(|| { - anyhow::anyhow!("could not convert unbonding id to field elements") - })?, - ); - public_inputs.extend( - penalty - .to_field_elements() - .ok_or_else(|| anyhow::anyhow!("could not convert penalty to field elements"))?, - ); - - tracing::trace!(?public_inputs); - let start = std::time::Instant::now(); - let proof_result = Groth16::::verify_with_processed_vk( - vk, - public_inputs.as_slice(), - &proof, - ) - .map_err(|err| anyhow::anyhow!(err))?; - tracing::debug!(?proof_result, elapsed = ?start.elapsed()); - proof_result - .then_some(()) - .ok_or_else(|| anyhow::anyhow!("undelegate claim proof did not verify")) + self.0.verify(vk, public.into()) } } @@ -199,6 +107,7 @@ mod tests { use rand_core::OsRng; use crate::{IdentityKey, Penalty, UnbondingToken}; + use penumbra_shielded_pool::ConvertCircuit; fn fr_strategy() -> BoxedStrategy { any::<[u8; 32]>() @@ -211,7 +120,7 @@ mod tests { #[test] fn undelegate_claim_proof_happy_path(validator_randomness in fr_strategy(), balance_blinding in fr_strategy(), value1_amount in 2..200u64, penalty_amount in 0..100u64) { let mut rng = OsRng; - let (pk, vk) = generate_prepared_test_parameters::(&mut rng); + let (pk, vk) = generate_prepared_test_parameters::(&mut rng); let sk = rdsa::SigningKey::new_from_field(validator_randomness); let validator_identity = IdentityKey((&sk).into()); @@ -224,21 +133,21 @@ mod tests { let balance = penalty.balance_for_claim(unbonding_id, unbonding_amount); let balance_commitment = balance.commit(balance_blinding); + let public = UndelegateClaimProofPublic { balance_commitment, unbonding_id, penalty }; + let private = UndelegateClaimProofPrivate { unbonding_amount, balance_blinding }; + let blinding_r = Fq::rand(&mut rng); let blinding_s = Fq::rand(&mut rng); let proof = UndelegateClaimProof::prove( blinding_r, blinding_s, &pk, - unbonding_amount, - balance_blinding, - balance_commitment, - unbonding_id, - penalty + public.clone(), + private ) .expect("can create proof"); - let proof_result = proof.verify(&vk, balance_commitment, unbonding_id, penalty); + let proof_result = proof.verify(&vk, public); assert!(proof_result.is_ok()); } diff --git a/crates/core/component/stake/src/validator.rs b/crates/core/component/stake/src/validator.rs index 970ad3e7ff..ab45ea3e8c 100644 --- a/crates/core/component/stake/src/validator.rs +++ b/crates/core/component/stake/src/validator.rs @@ -163,16 +163,15 @@ pub enum FundingStreamToml { address: Address, rate_bps: u16, }, - Dao { - recipient: DAO, + CommunityPool { + recipient: CommunityPool, rate_bps: u16, }, } -// Unit struct solely to add a `recipient = "DAO"` field to the TOML representation -#[allow(non_camel_case_types)] // no way to use `rename` with `serde_unit_struct` +// Unit struct solely to add a `recipient = "CommunityPool"` field to the TOML representation #[derive(Debug, PartialEq, Eq, Clone, Deserialize_unit_struct, Serialize_unit_struct)] -pub struct DAO; +pub struct CommunityPool; impl From for FundingStreamToml { fn from(f: FundingStream) -> Self { @@ -180,9 +179,9 @@ impl From for FundingStreamToml { FundingStream::ToAddress { address, rate_bps } => { FundingStreamToml::Address { address, rate_bps } } - FundingStream::ToDao { rate_bps } => FundingStreamToml::Dao { + FundingStream::ToCommunityPool { rate_bps } => FundingStreamToml::CommunityPool { rate_bps, - recipient: DAO, + recipient: CommunityPool, }, } } @@ -194,7 +193,9 @@ impl From for FundingStream { FundingStreamToml::Address { address, rate_bps } => { FundingStream::ToAddress { address, rate_bps } } - FundingStreamToml::Dao { rate_bps, .. } => FundingStream::ToDao { rate_bps }, + FundingStreamToml::CommunityPool { rate_bps, .. } => { + FundingStream::ToCommunityPool { rate_bps } + } } } } diff --git a/crates/core/component/stake/src/validator/definition.rs b/crates/core/component/stake/src/validator/definition.rs index 2b07c34921..6c6cfcad8d 100644 --- a/crates/core/component/stake/src/validator/definition.rs +++ b/crates/core/component/stake/src/validator/definition.rs @@ -1,5 +1,6 @@ use decaf377_rdsa::{Signature, SpendAuth}; use penumbra_proto::{penumbra::core::component::stake::v1alpha1 as pb, DomainType}; +use penumbra_txhash::{EffectHash, EffectingData}; use serde::{Deserialize, Serialize}; use crate::validator::Validator; @@ -37,3 +38,9 @@ impl TryFrom for Definition { }) } } + +impl EffectingData for Definition { + fn effect_hash(&self) -> EffectHash { + EffectHash::from_proto_effecting_data(&self.to_proto()) + } +} diff --git a/crates/core/num/src/fixpoint.rs b/crates/core/num/src/fixpoint.rs index 8fc3d6d281..763d6a4a73 100644 --- a/crates/core/num/src/fixpoint.rs +++ b/crates/core/num/src/fixpoint.rs @@ -19,7 +19,7 @@ use ark_relations::r1cs::{ConstraintSystemRef, SynthesisError}; use decaf377::{r1cs::FqVar, Fq}; use ethnum::U256; -use crate::AmountVar; +use crate::{Amount, AmountVar}; use self::div::stub_div_rem_u384_by_u256; @@ -177,6 +177,16 @@ impl U128x128 { pub fn saturating_sub(self, rhs: &Self) -> Self { U128x128(self.0.saturating_sub(rhs.0)) } + + /// Multiply an amount by this fraction, then round down. + pub fn apply_to_amount(self, rhs: &Amount) -> Result { + let mul = (Self::from(rhs) * self)?; + let out = mul + .round_down() + .try_into() + .expect("converting integral U128xU128 into Amount will succeed"); + Ok(out) + } } #[derive(Clone)] @@ -631,6 +641,12 @@ impl U128x128Var { ], } } + /// Multiply an amount by this fraction, then round down. + pub fn apply_to_amount(self, rhs: AmountVar) -> Result { + U128x128Var::from_amount_var(rhs)? + .checked_mul(&self)? + .round_down_to_amount() + } pub fn round_down_to_amount(self) -> Result { let bits = self.limbs[2] diff --git a/crates/core/transaction/Cargo.toml b/crates/core/transaction/Cargo.toml index a21e3a2b78..e21739e7b6 100644 --- a/crates/core/transaction/Cargo.toml +++ b/crates/core/transaction/Cargo.toml @@ -16,18 +16,19 @@ penumbra-shielded-pool = { path = "../component/shielded-pool/", default-feature penumbra-sct = { path = "../component/sct/", default-features = false } penumbra-stake = { path = "../component/stake", default-features = false } penumbra-ibc = { path = "../component/ibc/", default-features = false } -penumbra-dao = { path = "../component/dao/", default-features = false } +penumbra-community-pool = { path = "../component/community-pool/", default-features = false } penumbra-dex = { path = "../component/dex/", default-features = false } penumbra-fee = { path = "../component/fee/", default-features = false } penumbra-num = { path = "../num", default-features = false } penumbra-asset = { path = "../asset", default-features = false } penumbra-keys = { path = "../keys", default-features = false } +penumbra-txhash = { path = "../txhash", default-features = false } # Git deps -ibc-types = { version = "0.10.0", default-features = false } +ibc-types = { version = "0.11.0", default-features = false } # Crates.io deps -ibc-proto = { version = "0.39.0", default-features = false } +ibc-proto = { version = "0.40.0", default-features = false } decaf377 = "0.5" decaf377-rdsa = { version = "0.7" } poseidon377 = { version = "0.6", features = ["r1cs"] } diff --git a/crates/core/transaction/src/action.rs b/crates/core/transaction/src/action.rs index 3e4a81540b..4a530a0912 100644 --- a/crates/core/transaction/src/action.rs +++ b/crates/core/transaction/src/action.rs @@ -1,4 +1,5 @@ use anyhow::anyhow; +use penumbra_txhash::{EffectHash, EffectingData}; use std::convert::{TryFrom, TryInto}; use penumbra_asset::balance; @@ -35,9 +36,38 @@ pub enum Action { Ics20Withdrawal(penumbra_shielded_pool::Ics20Withdrawal), - DaoSpend(penumbra_dao::DaoSpend), - DaoOutput(penumbra_dao::DaoOutput), - DaoDeposit(penumbra_dao::DaoDeposit), + CommunityPoolSpend(penumbra_community_pool::CommunityPoolSpend), + CommunityPoolOutput(penumbra_community_pool::CommunityPoolOutput), + CommunityPoolDeposit(penumbra_community_pool::CommunityPoolDeposit), +} + +impl EffectingData for Action { + fn effect_hash(&self) -> EffectHash { + match self { + Action::Output(output) => output.effect_hash(), + Action::Spend(spend) => spend.effect_hash(), + Action::Delegate(delegate) => delegate.effect_hash(), + Action::Undelegate(undelegate) => undelegate.effect_hash(), + Action::UndelegateClaim(claim) => claim.effect_hash(), + Action::ProposalSubmit(submit) => submit.effect_hash(), + Action::ProposalWithdraw(withdraw) => withdraw.effect_hash(), + Action::ProposalDepositClaim(claim) => claim.effect_hash(), + Action::DelegatorVote(vote) => vote.effect_hash(), + Action::ValidatorVote(vote) => vote.effect_hash(), + Action::SwapClaim(swap_claim) => swap_claim.effect_hash(), + Action::Swap(swap) => swap.effect_hash(), + Action::ValidatorDefinition(defn) => defn.effect_hash(), + Action::IbcRelay(payload) => payload.effect_hash(), + Action::PositionOpen(p) => p.effect_hash(), + Action::PositionClose(p) => p.effect_hash(), + Action::PositionWithdraw(p) => p.effect_hash(), + Action::PositionRewardClaim(p) => p.effect_hash(), + Action::Ics20Withdrawal(w) => w.effect_hash(), + Action::CommunityPoolSpend(d) => d.effect_hash(), + Action::CommunityPoolOutput(d) => d.effect_hash(), + Action::CommunityPoolDeposit(d) => d.effect_hash(), + } + } } impl Action { @@ -80,9 +110,9 @@ impl Action { Action::Undelegate(_) => tracing::info_span!("Undelegate", ?idx), Action::UndelegateClaim(_) => tracing::info_span!("UndelegateClaim", ?idx), Action::Ics20Withdrawal(_) => tracing::info_span!("Ics20Withdrawal", ?idx), - Action::DaoDeposit(_) => tracing::info_span!("DaoDeposit", ?idx), - Action::DaoSpend(_) => tracing::info_span!("DaoSpend", ?idx), - Action::DaoOutput(_) => tracing::info_span!("DaoOutput", ?idx), + Action::CommunityPoolDeposit(_) => tracing::info_span!("CommunityPoolDeposit", ?idx), + Action::CommunityPoolSpend(_) => tracing::info_span!("CommunityPoolSpend", ?idx), + Action::CommunityPoolOutput(_) => tracing::info_span!("CommunityPoolOutput", ?idx), } } } @@ -107,9 +137,9 @@ impl IsAction for Action { Action::PositionWithdraw(p) => p.balance_commitment(), Action::PositionRewardClaim(p) => p.balance_commitment(), Action::Ics20Withdrawal(withdrawal) => withdrawal.balance_commitment(), - Action::DaoDeposit(deposit) => deposit.balance_commitment(), - Action::DaoSpend(spend) => spend.balance_commitment(), - Action::DaoOutput(output) => output.balance_commitment(), + Action::CommunityPoolDeposit(deposit) => deposit.balance_commitment(), + Action::CommunityPoolSpend(spend) => spend.balance_commitment(), + Action::CommunityPoolOutput(output) => output.balance_commitment(), // These actions just post Protobuf data to the chain, and leave the // value balance unchanged. Action::IbcRelay(x) => x.balance_commitment(), @@ -136,9 +166,9 @@ impl IsAction for Action { Action::PositionWithdraw(x) => x.view_from_perspective(txp), Action::PositionRewardClaim(x) => x.view_from_perspective(txp), Action::Ics20Withdrawal(x) => x.view_from_perspective(txp), - Action::DaoSpend(x) => x.view_from_perspective(txp), - Action::DaoOutput(x) => x.view_from_perspective(txp), - Action::DaoDeposit(x) => x.view_from_perspective(txp), + Action::CommunityPoolSpend(x) => x.view_from_perspective(txp), + Action::CommunityPoolOutput(x) => x.view_from_perspective(txp), + Action::CommunityPoolDeposit(x) => x.view_from_perspective(txp), // TODO: figure out where to implement the actual decryption methods for these? where are their action definitions? Action::ValidatorDefinition(x) => ActionView::ValidatorDefinition(x.to_owned()), Action::IbcRelay(x) => ActionView::IbcRelay(x.to_owned()), @@ -210,14 +240,14 @@ impl From for pb::Action { Action::Ics20Withdrawal(withdrawal) => pb::Action { action: Some(pb::action::Action::Ics20Withdrawal(withdrawal.into())), }, - Action::DaoSpend(inner) => pb::Action { - action: Some(pb::action::Action::DaoSpend(inner.into())), + Action::CommunityPoolSpend(inner) => pb::Action { + action: Some(pb::action::Action::CommunityPoolSpend(inner.into())), }, - Action::DaoOutput(inner) => pb::Action { - action: Some(pb::action::Action::DaoOutput(inner.into())), + Action::CommunityPoolOutput(inner) => pb::Action { + action: Some(pb::action::Action::CommunityPoolOutput(inner.into())), }, - Action::DaoDeposit(inner) => pb::Action { - action: Some(pb::action::Action::DaoDeposit(inner.into())), + Action::CommunityPoolDeposit(inner) => pb::Action { + action: Some(pb::action::Action::CommunityPoolDeposit(inner.into())), }, } } @@ -275,9 +305,15 @@ impl TryFrom for Action { pb::action::Action::Ics20Withdrawal(inner) => { Ok(Action::Ics20Withdrawal(inner.try_into()?)) } - pb::action::Action::DaoSpend(inner) => Ok(Action::DaoSpend(inner.try_into()?)), - pb::action::Action::DaoOutput(inner) => Ok(Action::DaoOutput(inner.try_into()?)), - pb::action::Action::DaoDeposit(inner) => Ok(Action::DaoDeposit(inner.try_into()?)), + pb::action::Action::CommunityPoolSpend(inner) => { + Ok(Action::CommunityPoolSpend(inner.try_into()?)) + } + pb::action::Action::CommunityPoolOutput(inner) => { + Ok(Action::CommunityPoolOutput(inner.try_into()?)) + } + pb::action::Action::CommunityPoolDeposit(inner) => { + Ok(Action::CommunityPoolDeposit(inner.try_into()?)) + } } } } diff --git a/crates/core/transaction/src/auth_data.rs b/crates/core/transaction/src/auth_data.rs index 626db5148e..d94abd9577 100644 --- a/crates/core/transaction/src/auth_data.rs +++ b/crates/core/transaction/src/auth_data.rs @@ -1,6 +1,6 @@ use decaf377_rdsa::{Signature, SpendAuth}; -use penumbra_chain::EffectHash; use penumbra_proto::{core::transaction::v1alpha1 as pb, DomainType}; +use penumbra_txhash::EffectHash; /// Authorization data returned in response to a /// [`TransactionDescription`](crate::TransactionDescription). diff --git a/crates/core/transaction/src/detection_data.rs b/crates/core/transaction/src/detection_data.rs new file mode 100644 index 0000000000..9adb9c4185 --- /dev/null +++ b/crates/core/transaction/src/detection_data.rs @@ -0,0 +1,44 @@ +use anyhow::Error; +use decaf377_fmd::Clue; +use penumbra_proto::core::transaction::v1alpha1 as pbt; +use penumbra_proto::DomainType; +use penumbra_txhash::{EffectHash, EffectingData}; + +/// Detection data used by a detection server using Fuzzy Message Detection. +/// +/// Only present if outputs are present. +#[derive(Clone, Debug, Default)] +pub struct DetectionData { + pub fmd_clues: Vec, +} + +impl EffectingData for DetectionData { + fn effect_hash(&self) -> EffectHash { + EffectHash::from_proto_effecting_data(&self.to_proto()) + } +} + +impl DomainType for DetectionData { + type Proto = pbt::DetectionData; +} + +impl TryFrom for DetectionData { + type Error = Error; + + fn try_from(proto: pbt::DetectionData) -> anyhow::Result { + let fmd_clues = proto + .fmd_clues + .into_iter() + .map(|x| x.try_into()) + .collect::, Error>>()?; + Ok(DetectionData { fmd_clues }) + } +} + +impl From for pbt::DetectionData { + fn from(msg: DetectionData) -> Self { + let fmd_clues = msg.fmd_clues.into_iter().map(|x| x.into()).collect(); + + pbt::DetectionData { fmd_clues } + } +} diff --git a/crates/core/transaction/src/effect_hash.rs b/crates/core/transaction/src/effect_hash.rs deleted file mode 100644 index 56ff6a8b8a..0000000000 --- a/crates/core/transaction/src/effect_hash.rs +++ /dev/null @@ -1,588 +0,0 @@ -use decaf377_fmd::Clue; -use penumbra_chain::EffectHash; -use penumbra_dao::{DaoDeposit, DaoOutput, DaoSpend}; -use penumbra_dex::{ - lp::action::{PositionClose, PositionOpen, PositionRewardClaim, PositionWithdraw}, - swap, swap_claim, -}; -use penumbra_fee::Fee; -use penumbra_governance::{ - DelegatorVote, DelegatorVoteBody, Proposal, ProposalDepositClaim, ProposalSubmit, - ProposalWithdraw, ValidatorVote, ValidatorVoteBody, Vote, -}; -use penumbra_ibc::IbcRelay; -use penumbra_keys::{FullViewingKey, PayloadKey}; -use penumbra_proto::{ - core::component::dex::v1alpha1 as pbd, core::component::fee::v1alpha1 as pbf, - core::component::governance::v1alpha1 as pbg, core::component::ibc::v1alpha1 as pbi, - core::component::shielded_pool::v1alpha1 as pb_sp, core::component::stake::v1alpha1 as pbs, - core::transaction::v1alpha1 as pbt, crypto::decaf377_fmd::v1alpha1 as pb_fmd, Message, Name, -}; -use penumbra_shielded_pool::{output, spend, Ics20Withdrawal}; -use penumbra_stake::{validator, Delegate, Undelegate, UndelegateClaimBody}; - -use crate::{ - memo::MemoCiphertext, plan::TransactionPlan, transaction::DetectionData, Action, Transaction, - TransactionBody, TransactionParameters, -}; - -// Note: temporarily duplicate of chain/EffectingData -pub trait EffectingData { - fn effect_hash(&self) -> EffectHash; -} - -impl<'a, T: penumbra_chain::EffectingData> EffectingData for crate::Compat<'a, T> { - fn effect_hash(&self) -> EffectHash { - self.0.effect_hash() - } -} - -impl Transaction { - pub fn effect_hash(&self) -> EffectHash { - self.transaction_body.effect_hash() - } -} - -impl TransactionBody { - pub fn expiry_height(&self) -> u64 { - self.transaction_parameters.expiry_height - } - - pub fn chain_id(&self) -> &str { - &self.transaction_parameters.chain_id - } - - pub fn effect_hash(&self) -> EffectHash { - let mut state = create_personalized_state(&pbt::TransactionBody::type_url()); - - // Hash the fixed data of the transaction body. - state.update(self.transaction_parameters.effect_hash().as_bytes()); - state.update(self.fee.effect_hash().as_bytes()); - if self.memo.is_some() { - let memo_ciphertext = self.memo.clone(); - state.update( - memo_ciphertext - .expect("memo is some") - .effect_hash() - .as_bytes(), - ); - } - if self.detection_data.is_some() { - let detection_data = self.detection_data.clone(); - state.update( - detection_data - .expect("detection data is some") - .effect_hash() - .as_bytes(), - ); - } - - // Hash the number of actions, then each action. - let num_actions = self.actions.len() as u32; - state.update(&num_actions.to_le_bytes()); - for action in &self.actions { - state.update(action.effect_hash().as_bytes()); - } - - EffectHash(state.finalize().as_array().clone()) - } -} - -impl TransactionPlan { - /// Computes the [`EffectHash`] for the [`Transaction`] described by this - /// [`TransactionPlan`]. - /// - /// This method does not require constructing the entire [`Transaction`], - /// but it does require the associated [`FullViewingKey`] to derive - /// effecting data that will be fed into the [`EffectHash`]. - pub fn effect_hash(&self, fvk: &FullViewingKey) -> EffectHash { - // This implementation is identical to the one above, except that we - // don't need to actually construct the entire `TransactionBody` with - // complete `Action`s, we just need to construct the bodies of the - // actions the transaction will have when constructed. - - let mut state = create_personalized_state(&pbt::TransactionBody::type_url()); - - // Hash the fixed data of the transaction body. - let tx_params = TransactionParameters { - chain_id: self.chain_id.clone(), - expiry_height: self.expiry_height, - }; - state.update(tx_params.effect_hash().as_bytes()); - state.update(self.fee.effect_hash().as_bytes()); - - // Hash the memo and save the memo key for use with outputs later. - let mut memo_key: Option = None; - if self.memo_plan.is_some() { - let memo_plan = self - .memo_plan - .clone() - .expect("memo_plan must be present in TransactionPlan"); - let memo_ciphertext = memo_plan.memo().expect("can compute ciphertext"); - state.update(memo_ciphertext.effect_hash().as_bytes()); - memo_key = Some(memo_plan.key); - } - - // Hash the detection data. - if !self.clue_plans.is_empty() { - let detection_data = DetectionData { - fmd_clues: self - .clue_plans - .iter() - .map(|clue_plan| clue_plan.clue()) - .collect(), - }; - state.update(detection_data.effect_hash().as_bytes()); - } - - let num_actions = self.actions.len() as u32; - state.update(&num_actions.to_le_bytes()); - - // If the memo_key is None, then there is no memo, and we populate the memo key - // field with a dummy key. - let dummy_payload_key: PayloadKey = [0u8; 32].into(); - - // Hash the effecting data of each action, in the order it appears in the plan, - // which will be the order it appears in the transaction. - for action_plan in &self.actions { - state.update( - action_plan - .effect_hash(fvk, memo_key.as_ref().unwrap_or(&dummy_payload_key)) - .as_bytes(), - ); - } - - EffectHash(state.finalize().as_array().clone()) - } -} - -impl EffectingData for Action { - fn effect_hash(&self) -> EffectHash { - match self { - Action::Output(output) => output.body.effect_hash(), - Action::Spend(spend) => spend.body.effect_hash(), - Action::Delegate(delegate) => delegate.effect_hash(), - Action::Undelegate(undelegate) => undelegate.effect_hash(), - Action::UndelegateClaim(claim) => claim.body.effect_hash(), - Action::ProposalSubmit(submit) => submit.effect_hash(), - Action::ProposalWithdraw(withdraw) => withdraw.effect_hash(), - Action::ProposalDepositClaim(claim) => claim.effect_hash(), - Action::DelegatorVote(vote) => vote.effect_hash(), - Action::ValidatorVote(vote) => vote.effect_hash(), - Action::SwapClaim(swap_claim) => swap_claim.body.effect_hash(), - Action::Swap(swap) => swap.body.effect_hash(), - Action::ValidatorDefinition(defn) => defn.effect_hash(), - Action::IbcRelay(payload) => payload.effect_hash(), - Action::PositionOpen(p) => p.effect_hash(), - Action::PositionClose(p) => p.effect_hash(), - Action::PositionWithdraw(p) => p.effect_hash(), - Action::PositionRewardClaim(p) => p.effect_hash(), - Action::Ics20Withdrawal(w) => w.effect_hash(), - Action::DaoSpend(d) => d.effect_hash(), - Action::DaoOutput(d) => d.effect_hash(), - Action::DaoDeposit(d) => d.effect_hash(), - } - } -} - -/// A helper function to hash the data of a proto-encoded message, using -/// the variable-length `TypeUrl` of the corresponding domain type as a -/// personalization string. -fn hash_proto_effecting_data(personalization: &str, message: &M) -> EffectHash { - let mut state = create_personalized_state(personalization); - state.update(&message.encode_to_vec()); - - EffectHash(*state.finalize().as_array()) -} - -/// A helper function to create a BLAKE2b `State` instance given a variable-length personalization string. -fn create_personalized_state(personalization: &str) -> blake2b_simd::State { - let mut state = blake2b_simd::State::new(); - - // The `TypeUrl` provided as a personalization string is variable length, - // so we first include the length in bytes as a fixed-length prefix. - let length = personalization.len() as u64; - state.update(&length.to_le_bytes()); - state.update(personalization.as_bytes()); - - state -} - -impl EffectingData for validator::Definition { - fn effect_hash(&self) -> EffectHash { - let effecting_data: pbs::ValidatorDefinition = self.clone().into(); - hash_proto_effecting_data(&pbs::ValidatorDefinition::type_url(), &effecting_data) - } -} - -impl EffectingData for IbcRelay { - fn effect_hash(&self) -> EffectHash { - let effecting_data: pbi::IbcRelay = self.clone().into(); - hash_proto_effecting_data(&pbi::IbcRelay::type_url(), &effecting_data) - } -} - -impl EffectingData for Ics20Withdrawal { - fn effect_hash(&self) -> EffectHash { - let effecting_data: pbi::Ics20Withdrawal = self.clone().into(); - hash_proto_effecting_data(&pbi::Ics20Withdrawal::type_url(), &effecting_data) - } -} - -impl EffectingData for output::Body { - fn effect_hash(&self) -> EffectHash { - // The effecting data is in the body of the output, so we can - // just use hash the proto-encoding of the body. - let body: pb_sp::OutputBody = self.clone().into(); - hash_proto_effecting_data(&pb_sp::OutputBody::type_url(), &body) - } -} - -impl EffectingData for spend::Body { - fn effect_hash(&self) -> EffectHash { - // The effecting data is in the body of the spend, so we can - // just use hash the proto-encoding of the body. - let body: pb_sp::SpendBody = self.clone().into(); - hash_proto_effecting_data(&pb_sp::SpendBody::type_url(), &body) - } -} - -impl EffectingData for DaoDeposit { - fn effect_hash(&self) -> EffectHash { - let effecting_data: pbg::DaoDeposit = self.clone().into(); - hash_proto_effecting_data(&pbg::DaoDeposit::type_url(), &effecting_data) - } -} - -impl EffectingData for DaoSpend { - fn effect_hash(&self) -> EffectHash { - let effecting_data: pbg::DaoSpend = self.clone().into(); - hash_proto_effecting_data(&pbg::DaoSpend::type_url(), &effecting_data) - } -} - -impl EffectingData for DaoOutput { - fn effect_hash(&self) -> EffectHash { - let effecting_data: pbg::DaoOutput = self.clone().into(); - hash_proto_effecting_data(&pbg::DaoOutput::type_url(), &effecting_data) - } -} - -impl EffectingData for swap::Body { - fn effect_hash(&self) -> EffectHash { - // The effecting data is in the body of the swap, so we can - // just use hash the proto-encoding of the body. - let effecting_data: pbd::SwapBody = self.clone().into(); - hash_proto_effecting_data(&pbd::SwapBody::type_url(), &effecting_data) - } -} - -impl EffectingData for swap_claim::Body { - fn effect_hash(&self) -> EffectHash { - // The effecting data is in the body of the swap claim, so we can - // just use hash the proto-encoding of the body. - let effecting_data: pbd::SwapClaimBody = self.clone().into(); - hash_proto_effecting_data(&pbd::SwapClaimBody::type_url(), &effecting_data) - } -} - -impl EffectingData for Delegate { - fn effect_hash(&self) -> EffectHash { - // For delegations, the entire action is considered effecting data. - let effecting_data: pbs::Delegate = self.clone().into(); - hash_proto_effecting_data(&pbs::Delegate::type_url(), &effecting_data) - } -} - -impl EffectingData for Undelegate { - fn effect_hash(&self) -> EffectHash { - // For undelegations, the entire action is considered effecting data. - let effecting_data: pbs::Undelegate = self.clone().into(); - hash_proto_effecting_data(&pbs::Undelegate::type_url(), &effecting_data) - } -} - -impl EffectingData for UndelegateClaimBody { - fn effect_hash(&self) -> EffectHash { - // The effecting data is in the body of the undelegate claim, so we can - // just use hash the proto-encoding of the body. - let effecting_data: pbs::UndelegateClaimBody = self.clone().into(); - hash_proto_effecting_data(&pbs::UndelegateClaimBody::type_url(), &effecting_data) - } -} - -impl EffectingData for Proposal { - fn effect_hash(&self) -> EffectHash { - let effecting_data: pbg::Proposal = self.clone().into(); - hash_proto_effecting_data(&pbg::Proposal::type_url(), &effecting_data) - } -} - -impl EffectingData for ProposalSubmit { - fn effect_hash(&self) -> EffectHash { - let effecting_data: pbg::ProposalSubmit = self.clone().into(); - hash_proto_effecting_data(&pbg::ProposalSubmit::type_url(), &effecting_data) - } -} - -impl EffectingData for ProposalWithdraw { - fn effect_hash(&self) -> EffectHash { - let effecting_data: pbg::ProposalWithdraw = self.clone().into(); - hash_proto_effecting_data(&pbg::ProposalWithdraw::type_url(), &effecting_data) - } -} - -impl EffectingData for ValidatorVote { - fn effect_hash(&self) -> EffectHash { - self.body.effect_hash() - } -} - -impl EffectingData for DelegatorVote { - fn effect_hash(&self) -> EffectHash { - self.body.effect_hash() - } -} - -impl EffectingData for Vote { - fn effect_hash(&self) -> EffectHash { - let effecting_data: pbg::Vote = self.clone().into(); - hash_proto_effecting_data(&pbg::Vote::type_url(), &effecting_data) - } -} - -impl EffectingData for ValidatorVoteBody { - fn effect_hash(&self) -> EffectHash { - let effecting_data: pbg::ValidatorVoteBody = self.clone().into(); - hash_proto_effecting_data(&pbg::ValidatorVoteBody::type_url(), &effecting_data) - } -} - -impl EffectingData for DelegatorVoteBody { - fn effect_hash(&self) -> EffectHash { - let effecting_data: pbg::DelegatorVoteBody = self.clone().into(); - hash_proto_effecting_data(&pbg::DelegatorVoteBody::type_url(), &effecting_data) - } -} - -impl EffectingData for ProposalDepositClaim { - fn effect_hash(&self) -> EffectHash { - let effecting_data: pbg::ProposalDepositClaim = self.clone().into(); - hash_proto_effecting_data(&pbg::ProposalDepositClaim::type_url(), &effecting_data) - } -} - -impl EffectingData for PositionOpen { - fn effect_hash(&self) -> EffectHash { - // The position open action consists only of the position, which - // we consider effecting data. - let effecting_data: pbd::PositionOpen = self.clone().into(); - hash_proto_effecting_data(&pbd::PositionOpen::type_url(), &effecting_data) - } -} - -impl EffectingData for PositionClose { - fn effect_hash(&self) -> EffectHash { - let effecting_data: pbd::PositionClose = self.clone().into(); - hash_proto_effecting_data(&pbd::PositionClose::type_url(), &effecting_data) - } -} - -impl EffectingData for PositionWithdraw { - fn effect_hash(&self) -> EffectHash { - let effecting_data: pbd::PositionWithdraw = self.clone().into(); - hash_proto_effecting_data(&pbd::PositionWithdraw::type_url(), &effecting_data) - } -} - -impl EffectingData for PositionRewardClaim { - fn effect_hash(&self) -> EffectHash { - let effecting_data: pbd::PositionRewardClaim = self.clone().into(); - hash_proto_effecting_data(&pbd::PositionRewardClaim::type_url(), &effecting_data) - } -} - -impl EffectingData for DetectionData { - fn effect_hash(&self) -> EffectHash { - let effecting_data: pbt::DetectionData = self.clone().into(); - hash_proto_effecting_data(&pbt::DetectionData::type_url(), &effecting_data) - } -} - -impl EffectingData for Clue { - fn effect_hash(&self) -> EffectHash { - let data: pb_fmd::Clue = self.clone().into(); - hash_proto_effecting_data(&pb_fmd::Clue::type_url(), &data) - } -} - -impl EffectingData for TransactionParameters { - fn effect_hash(&self) -> EffectHash { - let params: pbt::TransactionParameters = self.clone().into(); - hash_proto_effecting_data(&pbt::TransactionParameters::type_url(), ¶ms) - } -} - -impl EffectingData for Fee { - fn effect_hash(&self) -> EffectHash { - let proto_encoded_fee: pbf::Fee = self.clone().into(); - hash_proto_effecting_data(&pbf::Fee::type_url(), &proto_encoded_fee) - } -} - -impl EffectingData for MemoCiphertext { - fn effect_hash(&self) -> EffectHash { - let proto_encoded_memo: pbt::MemoCiphertext = self.clone().into(); - hash_proto_effecting_data(&pbt::MemoCiphertext::type_url(), &proto_encoded_memo) - } -} - -#[cfg(test)] -mod tests { - use penumbra_asset::{asset, Value, STAKING_TOKEN_ASSET_ID}; - use penumbra_dex::{swap::SwapPlaintext, swap::SwapPlan, TradingPair}; - use penumbra_fee::Fee; - use penumbra_keys::{ - keys::{Bip44Path, SeedPhrase, SpendKey}, - Address, - }; - use penumbra_shielded_pool::Note; - use penumbra_shielded_pool::{OutputPlan, SpendPlan}; - use penumbra_tct as tct; - use rand_core::OsRng; - - use crate::{ - memo::MemoPlaintext, - plan::{CluePlan, MemoPlan, TransactionPlan}, - WitnessData, - }; - - /// This isn't an exhaustive test, but we don't currently have a - /// great way to generate actions for randomized testing. - /// - /// All we hope to check here is that, for a basic transaction plan, - /// we compute the same auth hash for the plan and for the transaction. - #[test] - fn plan_effect_hash_matches_transaction_effect_hash() { - let rng = OsRng; - let seed_phrase = SeedPhrase::generate(rng); - let sk = SpendKey::from_seed_phrase_bip44(seed_phrase, &Bip44Path::new(0)); - let fvk = sk.full_viewing_key(); - let (addr, _dtk) = fvk.incoming().payment_address(0u32.into()); - - let mut sct = tct::Tree::new(); - - let note0 = Note::generate( - &mut OsRng, - &addr, - Value { - amount: 10000u64.into(), - asset_id: *STAKING_TOKEN_ASSET_ID, - }, - ); - let note1 = Note::generate( - &mut OsRng, - &addr, - Value { - amount: 20000u64.into(), - asset_id: *STAKING_TOKEN_ASSET_ID, - }, - ); - - sct.insert(tct::Witness::Keep, note0.commit()).unwrap(); - sct.insert(tct::Witness::Keep, note1.commit()).unwrap(); - - let trading_pair = TradingPair::new( - asset::Cache::with_known_assets() - .get_unit("nala") - .unwrap() - .id(), - asset::Cache::with_known_assets() - .get_unit("upenumbra") - .unwrap() - .id(), - ); - - let swap_plaintext = SwapPlaintext::new( - &mut OsRng, - trading_pair, - 100000u64.into(), - 1u64.into(), - Fee(Value { - amount: 3u64.into(), - asset_id: asset::Cache::with_known_assets() - .get_unit("upenumbra") - .unwrap() - .id(), - }), - addr, - ); - - let mut rng = OsRng; - - let memo_plaintext = MemoPlaintext { - return_address: Address::dummy(&mut rng), - text: "".to_string(), - }; - let plan = TransactionPlan { - expiry_height: 0, - fee: Fee::default(), - chain_id: "penumbra-test".to_string(), - // Put outputs first to check that the auth hash - // computation is not affected by plan ordering. - actions: vec![ - OutputPlan::new( - &mut OsRng, - Value { - amount: 30000u64.into(), - asset_id: *STAKING_TOKEN_ASSET_ID, - }, - addr.clone(), - ) - .into(), - SpendPlan::new(&mut OsRng, note0, 0u64.into()).into(), - SpendPlan::new(&mut OsRng, note1, 1u64.into()).into(), - SwapPlan::new(&mut OsRng, swap_plaintext).into(), - ], - clue_plans: vec![CluePlan::new(&mut OsRng, addr, 1)], - memo_plan: Some(MemoPlan::new(&mut OsRng, memo_plaintext.clone()).unwrap()), - }; - - println!("{}", serde_json::to_string_pretty(&plan).unwrap()); - - let plan_effect_hash = plan.effect_hash(fvk); - - let auth_data = plan.authorize(rng, &sk); - let witness_data = WitnessData { - anchor: sct.root(), - state_commitment_proofs: plan - .spend_plans() - .map(|spend: &SpendPlan| { - ( - spend.note.commit(), - sct.witness(spend.note.commit()).unwrap(), - ) - }) - .collect(), - }; - let transaction = plan.build(fvk, &witness_data, &auth_data).unwrap(); - - let transaction_effect_hash = transaction.effect_hash(); - - assert_eq!(plan_effect_hash, transaction_effect_hash); - - let decrypted_memo = transaction.decrypt_memo(fvk).expect("can decrypt memo"); - assert_eq!(decrypted_memo, memo_plaintext); - - // TODO: fix this and move into its own test? - // // Also check the concurrent build results in the same effect hash. - // let rt = Runtime::new().unwrap(); - // let transaction = rt - // .block_on(async move { - // plan.build_concurrent(&mut OsRng, fvk, auth_data, witness_data) - // .await - // }) - // .expect("can build"); - // assert_eq!(plan_effect_hash, transaction.effect_hash()); - } -} diff --git a/crates/core/transaction/src/gas.rs b/crates/core/transaction/src/gas.rs index 9876069885..fb8e23aa15 100644 --- a/crates/core/transaction/src/gas.rs +++ b/crates/core/transaction/src/gas.rs @@ -1,5 +1,5 @@ use penumbra_chain::params::ChainParameters; -use penumbra_dao::{DaoDeposit, DaoOutput, DaoSpend}; +use penumbra_community_pool::{CommunityPoolDeposit, CommunityPoolOutput, CommunityPoolSpend}; use penumbra_dex::{ PositionClose, PositionOpen, PositionRewardClaim, PositionWithdraw, Swap, SwapClaim, }; @@ -260,9 +260,9 @@ impl GasCost for ActionPlan { ActionPlan::PositionClose(pc) => pc.gas_cost(), ActionPlan::PositionWithdraw(_) => position_withdraw_gas_cost(), ActionPlan::PositionRewardClaim(_) => position_reward_claim_gas_cost(), - ActionPlan::DaoSpend(ds) => ds.gas_cost(), - ActionPlan::DaoOutput(d) => d.gas_cost(), - ActionPlan::DaoDeposit(dd) => dd.gas_cost(), + ActionPlan::CommunityPoolSpend(ds) => ds.gas_cost(), + ActionPlan::CommunityPoolOutput(d) => d.gas_cost(), + ActionPlan::CommunityPoolDeposit(dd) => dd.gas_cost(), ActionPlan::Withdrawal(w) => w.gas_cost(), } } @@ -288,9 +288,9 @@ impl GasCost for Action { Action::PositionWithdraw(p) => p.gas_cost(), Action::PositionRewardClaim(p) => p.gas_cost(), Action::Ics20Withdrawal(withdrawal) => withdrawal.gas_cost(), - Action::DaoDeposit(deposit) => deposit.gas_cost(), - Action::DaoSpend(spend) => spend.gas_cost(), - Action::DaoOutput(output) => output.gas_cost(), + Action::CommunityPoolDeposit(deposit) => deposit.gas_cost(), + Action::CommunityPoolSpend(spend) => spend.gas_cost(), + Action::CommunityPoolOutput(output) => output.gas_cost(), Action::IbcRelay(x) => x.gas_cost(), Action::ValidatorDefinition(x) => x.gas_cost(), } @@ -487,7 +487,7 @@ impl GasCost for Ics20Withdrawal { } } -impl GasCost for DaoDeposit { +impl GasCost for CommunityPoolDeposit { fn gas_cost(&self) -> Gas { Gas { // Each [`Action`] has a `0` `block_space` cost, since the [`Transaction`] itself @@ -495,7 +495,7 @@ impl GasCost for DaoDeposit { block_space: 0, // The compact block space cost is based on the byte size of the data the [`Action`] adds // to the compact block. - // For a DaoDeposit the compact block is not modified. + // For a CommunityPoolDeposit the compact block is not modified. compact_block_space: 0u64, // Does not include a zk-SNARK proof, so there's no verification cost. verification: 0, @@ -505,7 +505,7 @@ impl GasCost for DaoDeposit { } } -impl GasCost for DaoSpend { +impl GasCost for CommunityPoolSpend { fn gas_cost(&self) -> Gas { Gas { // Each [`Action`] has a `0` `block_space` cost, since the [`Transaction`] itself @@ -513,7 +513,7 @@ impl GasCost for DaoSpend { block_space: 0, // The compact block space cost is based on the byte size of the data the [`Action`] adds // to the compact block. - // For a DaoSpend the compact block is not modified. + // For a CommunityPoolSpend the compact block is not modified. compact_block_space: 0u64, // Does not include a zk-SNARK proof, so there's no verification cost. verification: 0, @@ -523,9 +523,9 @@ impl GasCost for DaoSpend { } } -impl GasCost for DaoOutput { +impl GasCost for CommunityPoolOutput { fn gas_cost(&self) -> Gas { - // We hardcode the gas costs of a `DaoOutput` to 0, since it's a protocol action. + // We hardcode the gas costs of a `CommunityPoolOutput` to 0, since it's a protocol action. Gas { block_space: 0, compact_block_space: 0, diff --git a/crates/core/transaction/src/is_action.rs b/crates/core/transaction/src/is_action.rs index 2f388c3f8b..6e0ee23498 100644 --- a/crates/core/transaction/src/is_action.rs +++ b/crates/core/transaction/src/is_action.rs @@ -1,7 +1,7 @@ use ark_ff::Zero; use decaf377::Fr; use penumbra_asset::{balance, Value}; -use penumbra_dao::{DaoDeposit, DaoOutput, DaoSpend}; +use penumbra_community_pool::{CommunityPoolDeposit, CommunityPoolOutput, CommunityPoolSpend}; use penumbra_dex::{ lp::{ action::{PositionClose, PositionOpen, PositionRewardClaim, PositionWithdraw}, @@ -215,34 +215,34 @@ impl IsAction for Ics20Withdrawal { } } -impl IsAction for DaoDeposit { +impl IsAction for CommunityPoolDeposit { fn balance_commitment(&self) -> balance::Commitment { self.balance().commit(Fr::zero()) } fn view_from_perspective(&self, _txp: &TransactionPerspective) -> ActionView { - ActionView::DaoDeposit(self.clone()) + ActionView::CommunityPoolDeposit(self.clone()) } } -impl IsAction for DaoOutput { +impl IsAction for CommunityPoolOutput { fn balance_commitment(&self) -> balance::Commitment { - // Outputs from the DAO require value + // Outputs from the Community Pool require value self.balance().commit(Fr::zero()) } fn view_from_perspective(&self, _txp: &TransactionPerspective) -> ActionView { - ActionView::DaoOutput(self.clone()) + ActionView::CommunityPoolOutput(self.clone()) } } -impl IsAction for DaoSpend { +impl IsAction for CommunityPoolSpend { fn balance_commitment(&self) -> balance::Commitment { self.balance().commit(Fr::zero()) } fn view_from_perspective(&self, _txp: &TransactionPerspective) -> ActionView { - ActionView::DaoSpend(self.clone()) + ActionView::CommunityPoolSpend(self.clone()) } } diff --git a/crates/core/transaction/src/lib.rs b/crates/core/transaction/src/lib.rs index cb6ccf19db..bdbaf0a5f9 100644 --- a/crates/core/transaction/src/lib.rs +++ b/crates/core/transaction/src/lib.rs @@ -16,11 +16,10 @@ #![allow(clippy::clone_on_copy)] mod auth_data; -mod auth_hash; -mod effect_hash; +mod detection_data; mod error; -mod id; mod is_action; +mod parameters; mod transaction; mod witness_data; @@ -32,16 +31,17 @@ pub mod view; pub use action::Action; pub use auth_data::AuthorizationData; -pub use auth_hash::{AuthHash, AuthorizingData}; -pub use effect_hash::EffectingData; +pub use detection_data::DetectionData; pub use error::Error; -pub use id::Id; pub use is_action::IsAction; +pub use parameters::TransactionParameters; pub use plan::ActionPlan; -pub use transaction::{Transaction, TransactionBody, TransactionParameters}; +pub use transaction::{Transaction, TransactionBody}; pub use view::{ActionView, MemoPlaintextView, MemoView, TransactionPerspective, TransactionView}; pub use witness_data::WitnessData; +pub use penumbra_txhash as txhash; + /// A compatibility wrapper for trait implementations that are temporarily duplicated /// in multiple crates as an orphan rule work around until we finish splitting crates (#2288). pub struct Compat<'a, T>(pub &'a T); diff --git a/crates/core/transaction/src/memo.rs b/crates/core/transaction/src/memo.rs index bba1cf8ec4..59022e96db 100644 --- a/crates/core/transaction/src/memo.rs +++ b/crates/core/transaction/src/memo.rs @@ -8,25 +8,70 @@ use anyhow::anyhow; use decaf377_ka as ka; use penumbra_asset::balance; use penumbra_keys::{ + address::ADDRESS_LEN_BYTES, keys::OutgoingViewingKey, symmetric::{OvkWrappedKey, PayloadKey, PayloadKind, WrappedMemoKey}, Address, }; -use penumbra_proto::core::transaction::v1alpha1 as pbt; +use penumbra_proto::{core::transaction::v1alpha1 as pbt, DomainType}; use penumbra_shielded_pool::{note, Note}; +use penumbra_txhash::{EffectHash, EffectingData}; pub const MEMO_CIPHERTEXT_LEN_BYTES: usize = 528; // This is the `MEMO_CIPHERTEXT_LEN_BYTES` - MAC size (16 bytes). pub const MEMO_LEN_BYTES: usize = 512; +// This is the largest text length we can support +const MAX_TEXT_LEN: usize = MEMO_LEN_BYTES - ADDRESS_LEN_BYTES; + +/// A method which reads out bytes in a lossy way, and trims out null bytes +fn raw_bytes_to_text(data: &[u8]) -> String { + String::from_utf8_lossy(data) + .trim_end_matches(0u8 as char) + .to_string() +} + #[derive(Clone, Debug)] pub struct MemoCiphertext(pub [u8; MEMO_CIPHERTEXT_LEN_BYTES]); +impl EffectingData for MemoCiphertext { + fn effect_hash(&self) -> EffectHash { + EffectHash::from_proto_effecting_data(&self.to_proto()) + } +} + #[derive(Clone, Debug, PartialEq)] pub struct MemoPlaintext { - pub return_address: Address, - pub text: String, + return_address: Address, + text: String, +} + +impl MemoPlaintext { + /// Create a new MemoPlaintext, checking that the text isn't long enough. + /// + /// The text being too long is the only reason this function will fail. + pub fn new(return_address: Address, text: String) -> anyhow::Result { + if text.len() > MAX_TEXT_LEN { + anyhow::bail!( + "memo text length must be <= {}, found {}", + MAX_TEXT_LEN, + text.len() + ); + } + Ok(Self { + return_address, + text, + }) + } + + pub fn return_address(&self) -> Address { + self.return_address + } + + pub fn text(&self) -> &str { + self.text.as_str() + } } impl From<&MemoPlaintext> for Vec { @@ -47,14 +92,9 @@ impl TryFrom> for MemoPlaintext { } let return_address_bytes = &bytes[..80]; let return_address: Address = return_address_bytes.try_into()?; - let text = String::from_utf8_lossy(&bytes[80..]) - .trim_end_matches(0u8 as char) - .to_string(); + let text = raw_bytes_to_text(&bytes[80..]); - Ok(MemoPlaintext { - return_address, - text, - }) + MemoPlaintext::new(return_address, text) } } @@ -101,14 +141,9 @@ impl MemoCiphertext { let return_address_bytes = &plaintext_bytes[..80]; let return_address: Address = return_address_bytes.try_into()?; - let text = String::from_utf8_lossy(&plaintext_bytes[80..]) - .trim_end_matches(0u8 as char) - .to_string(); + let text = raw_bytes_to_text(&plaintext_bytes[80..]); - Ok(MemoPlaintext { - return_address: return_address, - text, - }) + MemoPlaintext::new(return_address, text) } /// Decrypt a [`MemoCiphertext`] to generate a fixed-length slice of bytes. @@ -153,14 +188,9 @@ impl MemoCiphertext { let return_address_bytes = &plaintext_bytes[..80]; let return_address: Address = return_address_bytes.try_into()?; - let text = String::from_utf8_lossy(&plaintext_bytes[80..]) - .trim_end_matches(0u8 as char) - .to_string(); + let text = raw_bytes_to_text(&plaintext_bytes[80..]); - Ok(MemoPlaintext { - return_address: return_address, - text, - }) + MemoPlaintext::new(return_address, text) } } @@ -203,6 +233,10 @@ impl From for pbt::MemoCiphertext { } } +impl DomainType for MemoCiphertext { + type Proto = pbt::MemoCiphertext; +} + impl TryFrom for MemoPlaintext { type Error = anyhow::Error; @@ -211,6 +245,12 @@ impl TryFrom for MemoPlaintext { .return_address .ok_or_else(|| anyhow::anyhow!("message missing return address"))? .try_into()?; + if (msg.text).len() > MEMO_LEN_BYTES - ADDRESS_LEN_BYTES { + anyhow::bail!( + "provided memo text exceeds {} bytes", + MEMO_LEN_BYTES - ADDRESS_LEN_BYTES + ); + } Ok(Self { return_address: sender, text: msg.text, @@ -270,7 +310,7 @@ mod tests { } #[test] - fn test_memo_encryption_and_sender_decryption() { + fn test_memo_encryption_and_sender_decryption() -> anyhow::Result<()> { let mut rng = OsRng; let seed_phrase = SeedPhrase::generate(rng); @@ -291,10 +331,7 @@ mod tests { // On the sender side, we have to encrypt the memo to put into the transaction-level, // and also the memo key to put on the action-level (output). - let memo = MemoPlaintext { - return_address: dest, - text: String::from("Hello, friend"), - }; + let memo = MemoPlaintext::new(dest, "Hello, friend".into())?; let memo_key = PayloadKey::random_key(&mut OsRng); let ciphertext = MemoCiphertext::encrypt(memo_key.clone(), &memo).expect("can encrypt memo"); @@ -324,6 +361,8 @@ mod tests { .expect("can decrypt memo"); assert_eq!(plaintext, memo); + + Ok(()) } proptest! { @@ -340,9 +379,15 @@ mod tests { let memo_key = PayloadKey::random_key(&mut rng); let memo_address = Address::dummy(&mut rng); let memo_text = s; - let memo = MemoPlaintext { - return_address: memo_address, - text: memo_text, + let memo = { + let text_len = memo_text.len(); + let memo = MemoPlaintext::new(memo_address, memo_text); + if text_len > MAX_TEXT_LEN { + assert!(memo.is_err()); + return Ok(()); + } + assert!(memo.is_ok()); + memo.unwrap() }; let ciphertext_result = MemoCiphertext::encrypt(memo_key.clone(), &memo); if memo.to_vec().len() > MEMO_LEN_BYTES { diff --git a/crates/core/transaction/src/parameters.rs b/crates/core/transaction/src/parameters.rs new file mode 100644 index 0000000000..88e04b044d --- /dev/null +++ b/crates/core/transaction/src/parameters.rs @@ -0,0 +1,48 @@ +use anyhow::Error; +use penumbra_fee::Fee; +use penumbra_proto::core::transaction::v1alpha1 as pbt; +use penumbra_proto::DomainType; +use penumbra_txhash::{EffectHash, EffectingData}; + +/// Parameters determining when the transaction should be accepted to the chain. +#[derive(Clone, Debug, Default)] +pub struct TransactionParameters { + pub expiry_height: u64, + pub chain_id: String, + pub fee: Fee, +} + +impl EffectingData for TransactionParameters { + fn effect_hash(&self) -> EffectHash { + EffectHash::from_proto_effecting_data(&self.to_proto()) + } +} + +impl DomainType for TransactionParameters { + type Proto = pbt::TransactionParameters; +} + +impl TryFrom for TransactionParameters { + type Error = Error; + + fn try_from(proto: pbt::TransactionParameters) -> anyhow::Result { + Ok(TransactionParameters { + expiry_height: proto.expiry_height, + chain_id: proto.chain_id, + fee: proto + .fee + .ok_or_else(|| anyhow::anyhow!("transaction parameters missing fee"))? + .try_into()?, + }) + } +} + +impl From for pbt::TransactionParameters { + fn from(msg: TransactionParameters) -> Self { + pbt::TransactionParameters { + expiry_height: msg.expiry_height, + chain_id: msg.chain_id, + fee: Some(msg.fee.into()), + } + } +} diff --git a/crates/core/transaction/src/plan.rs b/crates/core/transaction/src/plan.rs index 822a7888bf..7ee9e1f92d 100644 --- a/crates/core/transaction/src/plan.rs +++ b/crates/core/transaction/src/plan.rs @@ -2,22 +2,22 @@ //! creation. use anyhow::Result; -use penumbra_dao::{DaoDeposit, DaoOutput, DaoSpend}; +use penumbra_community_pool::{CommunityPoolDeposit, CommunityPoolOutput, CommunityPoolSpend}; use penumbra_dex::{ lp::action::{PositionClose, PositionOpen}, lp::plan::PositionWithdrawPlan, swap::SwapPlan, swap_claim::SwapClaimPlan, }; -use penumbra_fee::Fee; use penumbra_governance::{ DelegatorVotePlan, ProposalDepositClaim, ProposalSubmit, ProposalWithdraw, ValidatorVote, }; use penumbra_ibc::IbcRelay; -use penumbra_keys::{Address, PayloadKey}; +use penumbra_keys::{Address, FullViewingKey, PayloadKey}; use penumbra_proto::{core::transaction::v1alpha1 as pb, DomainType}; use penumbra_shielded_pool::{Ics20Withdrawal, OutputPlan, SpendPlan}; use penumbra_stake::{Delegate, Undelegate, UndelegateClaimPlan}; +use penumbra_txhash::{EffectHash, EffectingData}; use rand::{CryptoRng, Rng}; use serde::{Deserialize, Serialize}; @@ -25,27 +25,84 @@ mod action; mod auth; mod build; mod clue; +mod detection_data; mod memo; pub use action::ActionPlan; pub use clue::CluePlan; +pub use detection_data::DetectionDataPlan; pub use memo::MemoPlan; +use crate::TransactionParameters; + /// A declaration of a planned [`Transaction`](crate::Transaction), /// for use in transaction authorization and creation. #[derive(Clone, Debug, Default, Serialize, Deserialize)] #[serde(try_from = "pb::TransactionPlan", into = "pb::TransactionPlan")] pub struct TransactionPlan { - /// A list of this transaction's actions. pub actions: Vec, - pub expiry_height: u64, - pub chain_id: String, - pub fee: Fee, - pub clue_plans: Vec, - pub memo_plan: Option, + pub transaction_parameters: TransactionParameters, + pub detection_data: Option, + pub memo: Option, } impl TransactionPlan { + /// Computes the [`EffectHash`] for the [`Transaction`] described by this + /// [`TransactionPlan`]. + /// + /// This method does not require constructing the entire [`Transaction`], + /// but it does require the associated [`FullViewingKey`] to derive + /// effecting data that will be fed into the [`EffectHash`]. + /// + /// This method is not an [`EffectingData`] impl because it needs an extra input, + /// the FVK, to partially construct the transaction. + pub fn effect_hash(&self, fvk: &FullViewingKey) -> Result { + // This implementation is identical to the one for Transaction, except that we + // don't need to actually construct the entire `TransactionBody` with + // complete `Action`s, we just need to construct the bodies of the + // actions the transaction will have when constructed. + + let mut state = blake2b_simd::Params::new() + .personal(b"PenumbraEfHs") + .to_state(); + + let parameters_hash = self.transaction_parameters.effect_hash(); + + let memo_hash = match self.memo { + Some(ref memo) => memo.memo()?.effect_hash(), + None => EffectHash::default(), + }; + + let detection_data_hash = self + .detection_data + .as_ref() + .map(|plan| plan.detection_data().effect_hash()) + // If the detection data is not present, use the all-zero hash to + // record its absence in the overall effect hash. + .unwrap_or_default(); + + // Hash the fixed data of the transaction body. + state.update(parameters_hash.as_bytes()); + state.update(memo_hash.as_bytes()); + state.update(detection_data_hash.as_bytes()); + + // Hash the number of actions, then each action. + let num_actions = self.actions.len() as u32; + state.update(&num_actions.to_le_bytes()); + + // If the memo_key is None, then there is no memo, so there will be no + // outputs that the memo key is passed to, so we can fill in a dummy key. + let memo_key = self.memo_key().unwrap_or([0u8; 32].into()); + + // Hash the effecting data of each action, in the order it appears in the plan, + // which will be the order it appears in the transaction. + for action_plan in &self.actions { + state.update(action_plan.effect_hash(fvk, &memo_key).as_bytes()); + } + + Ok(EffectHash(state.finalize().as_array().clone())) + } + pub fn spend_plans(&self) -> impl Iterator { self.actions.iter().filter_map(|action| { if let ActionPlan::Spend(s) = action { @@ -66,10 +123,6 @@ impl TransactionPlan { }) } - pub fn clue_plans(&self) -> impl Iterator { - self.clue_plans.iter() - } - pub fn delegations(&self) -> impl Iterator { self.actions.iter().filter_map(|action| { if let ActionPlan::Delegate(d) = action { @@ -192,9 +245,9 @@ impl TransactionPlan { }) } - pub fn dao_spends(&self) -> impl Iterator { + pub fn community_pool_spends(&self) -> impl Iterator { self.actions.iter().filter_map(|action| { - if let ActionPlan::DaoSpend(v) = action { + if let ActionPlan::CommunityPoolSpend(v) = action { Some(v) } else { None @@ -202,9 +255,9 @@ impl TransactionPlan { }) } - pub fn dao_deposits(&self) -> impl Iterator { + pub fn community_pool_deposits(&self) -> impl Iterator { self.actions.iter().filter_map(|action| { - if let ActionPlan::DaoDeposit(v) = action { + if let ActionPlan::CommunityPoolDeposit(v) = action { Some(v) } else { None @@ -212,9 +265,9 @@ impl TransactionPlan { }) } - pub fn dao_outputs(&self) -> impl Iterator { + pub fn community_pool_outputs(&self) -> impl Iterator { self.actions.iter().filter_map(|action| { - if let ActionPlan::DaoOutput(v) = action { + if let ActionPlan::CommunityPoolOutput(v) = action { Some(v) } else { None @@ -272,8 +325,12 @@ impl TransactionPlan { self.output_plans().count() } - /// Method to add `CluePlan`s to a `TransactionPlan`. - pub fn add_all_clue_plans(&mut self, mut rng: R, precision_bits: usize) { + /// Method to populate the detection data for this transaction plan. + pub fn populate_detection_data( + &mut self, + mut rng: R, + precision_bits: usize, + ) { // Add one clue per recipient. let mut clue_plans = vec![]; for dest_address in self.dest_addresses() { @@ -287,14 +344,16 @@ impl TransactionPlan { clue_plans.push(CluePlan::new(&mut rng, dummy_address, precision_bits)); } - self.clue_plans = clue_plans; + if !clue_plans.is_empty() { + self.detection_data = Some(DetectionDataPlan { clue_plans }); + } else { + self.detection_data = None; + } } /// Convenience method to grab the `MemoKey` from the plan. pub fn memo_key(&self) -> Option { - self.memo_plan - .as_ref() - .map(|memo_plan| memo_plan.key.clone()) + self.memo.as_ref().map(|memo_plan| memo_plan.key.clone()) } } @@ -306,11 +365,9 @@ impl From for pb::TransactionPlan { fn from(msg: TransactionPlan) -> Self { Self { actions: msg.actions.into_iter().map(Into::into).collect(), - expiry_height: msg.expiry_height, - chain_id: msg.chain_id, - fee: Some(msg.fee.into()), - clue_plans: msg.clue_plans.into_iter().map(Into::into).collect(), - memo_plan: msg.memo_plan.map(Into::into), + transaction_parameters: Some(msg.transaction_parameters.into()), + detection_data: msg.detection_data.map(Into::into), + memo: msg.memo.map(Into::into), } } } @@ -318,29 +375,170 @@ impl From for pb::TransactionPlan { impl TryFrom for TransactionPlan { type Error = anyhow::Error; fn try_from(value: pb::TransactionPlan) -> Result { - let memo_plan = match value.memo_plan { - Some(plan) => Some(plan.try_into()?), - None => None, - }; - Ok(Self { actions: value .actions .into_iter() .map(TryInto::try_into) .collect::>()?, - expiry_height: value.expiry_height, - chain_id: value.chain_id, - fee: value - .fee - .ok_or_else(|| anyhow::anyhow!("missing fee"))? + transaction_parameters: value + .transaction_parameters + .ok_or_else(|| anyhow::anyhow!("transaction plan missing transaction parameters"))? .try_into()?, - clue_plans: value - .clue_plans - .into_iter() - .map(TryInto::try_into) - .collect::>()?, - memo_plan, + detection_data: value.detection_data.map(TryInto::try_into).transpose()?, + memo: value.memo.map(TryInto::try_into).transpose()?, }) } } + +#[cfg(test)] +mod tests { + use penumbra_asset::{asset, Value, STAKING_TOKEN_ASSET_ID}; + use penumbra_dex::{swap::SwapPlaintext, swap::SwapPlan, TradingPair}; + use penumbra_fee::Fee; + use penumbra_keys::{ + keys::{Bip44Path, SeedPhrase, SpendKey}, + Address, + }; + use penumbra_shielded_pool::Note; + use penumbra_shielded_pool::{OutputPlan, SpendPlan}; + use penumbra_tct as tct; + use penumbra_txhash::EffectingData as _; + use rand_core::OsRng; + + use crate::{ + memo::MemoPlaintext, + plan::{CluePlan, DetectionDataPlan, MemoPlan, TransactionPlan}, + TransactionParameters, WitnessData, + }; + + /// This isn't an exhaustive test, but we don't currently have a + /// great way to generate actions for randomized testing. + /// + /// All we hope to check here is that, for a basic transaction plan, + /// we compute the same auth hash for the plan and for the transaction. + #[test] + fn plan_effect_hash_matches_transaction_effect_hash() { + let rng = OsRng; + let seed_phrase = SeedPhrase::generate(rng); + let sk = SpendKey::from_seed_phrase_bip44(seed_phrase, &Bip44Path::new(0)); + let fvk = sk.full_viewing_key(); + let (addr, _dtk) = fvk.incoming().payment_address(0u32.into()); + + let mut sct = tct::Tree::new(); + + let note0 = Note::generate( + &mut OsRng, + &addr, + Value { + amount: 10000u64.into(), + asset_id: *STAKING_TOKEN_ASSET_ID, + }, + ); + let note1 = Note::generate( + &mut OsRng, + &addr, + Value { + amount: 20000u64.into(), + asset_id: *STAKING_TOKEN_ASSET_ID, + }, + ); + + sct.insert(tct::Witness::Keep, note0.commit()).unwrap(); + sct.insert(tct::Witness::Keep, note1.commit()).unwrap(); + + let trading_pair = TradingPair::new( + asset::Cache::with_known_assets() + .get_unit("nala") + .unwrap() + .id(), + asset::Cache::with_known_assets() + .get_unit("upenumbra") + .unwrap() + .id(), + ); + + let swap_plaintext = SwapPlaintext::new( + &mut OsRng, + trading_pair, + 100000u64.into(), + 1u64.into(), + Fee(Value { + amount: 3u64.into(), + asset_id: asset::Cache::with_known_assets() + .get_unit("upenumbra") + .unwrap() + .id(), + }), + addr, + ); + + let mut rng = OsRng; + + let memo_plaintext = MemoPlaintext::new(Address::dummy(&mut rng), "".to_string()).unwrap(); + let plan = TransactionPlan { + // Put outputs first to check that the auth hash + // computation is not affected by plan ordering. + actions: vec![ + OutputPlan::new( + &mut OsRng, + Value { + amount: 30000u64.into(), + asset_id: *STAKING_TOKEN_ASSET_ID, + }, + addr.clone(), + ) + .into(), + SpendPlan::new(&mut OsRng, note0, 0u64.into()).into(), + SpendPlan::new(&mut OsRng, note1, 1u64.into()).into(), + SwapPlan::new(&mut OsRng, swap_plaintext).into(), + ], + transaction_parameters: TransactionParameters { + expiry_height: 0, + fee: Fee::default(), + chain_id: "penumbra-test".to_string(), + }, + detection_data: Some(DetectionDataPlan { + clue_plans: vec![CluePlan::new(&mut OsRng, addr, 1)], + }), + memo: Some(MemoPlan::new(&mut OsRng, memo_plaintext.clone()).unwrap()), + }; + + println!("{}", serde_json::to_string_pretty(&plan).unwrap()); + + let plan_effect_hash = plan.effect_hash(fvk).unwrap(); + + let auth_data = plan.authorize(rng, &sk).unwrap(); + let witness_data = WitnessData { + anchor: sct.root(), + state_commitment_proofs: plan + .spend_plans() + .map(|spend: &SpendPlan| { + ( + spend.note.commit(), + sct.witness(spend.note.commit()).unwrap(), + ) + }) + .collect(), + }; + let transaction = plan.build(fvk, &witness_data, &auth_data).unwrap(); + + let transaction_effect_hash = transaction.effect_hash(); + + assert_eq!(plan_effect_hash, transaction_effect_hash); + + let decrypted_memo = transaction.decrypt_memo(fvk).expect("can decrypt memo"); + assert_eq!(decrypted_memo, memo_plaintext); + + // TODO: fix this and move into its own test? + // // Also check the concurrent build results in the same effect hash. + // let rt = Runtime::new().unwrap(); + // let transaction = rt + // .block_on(async move { + // plan.build_concurrent(&mut OsRng, fvk, auth_data, witness_data) + // .await + // }) + // .expect("can build"); + // assert_eq!(plan_effect_hash, transaction.effect_hash()); + } +} diff --git a/crates/core/transaction/src/plan/action.rs b/crates/core/transaction/src/plan/action.rs index d3fba43cee..afeeabe2b3 100644 --- a/crates/core/transaction/src/plan/action.rs +++ b/crates/core/transaction/src/plan/action.rs @@ -1,12 +1,11 @@ use crate::Action; -use crate::EffectingData; use crate::WitnessData; use anyhow::{anyhow, Context, Result}; use ark_ff::Zero; use decaf377::Fr; use penumbra_asset::Balance; -use penumbra_chain::EffectHash; -use penumbra_dao::{DaoDeposit, DaoOutput, DaoSpend}; +use penumbra_community_pool::{CommunityPoolDeposit, CommunityPoolOutput, CommunityPoolSpend}; +use penumbra_txhash::{EffectHash, EffectingData}; use penumbra_dex::{ lp::{ @@ -74,9 +73,9 @@ pub enum ActionPlan { // must be used. PositionRewardClaim(PositionRewardClaimPlan), - DaoSpend(DaoSpend), - DaoOutput(DaoOutput), - DaoDeposit(DaoDeposit), + CommunityPoolSpend(CommunityPoolSpend), + CommunityPoolOutput(CommunityPoolOutput), + CommunityPoolDeposit(CommunityPoolDeposit), Withdrawal(Ics20Withdrawal), } @@ -156,9 +155,9 @@ impl ActionPlan { PositionRewardClaim(_plan) => unimplemented!( "this api is wrong and needs to be fixed, but we don't do reward claims anyways" ), - DaoSpend(plan) => Action::DaoSpend(plan.clone()), - DaoOutput(plan) => Action::DaoOutput(plan.clone()), - DaoDeposit(plan) => Action::DaoDeposit(plan.clone()), + CommunityPoolSpend(plan) => Action::CommunityPoolSpend(plan.clone()), + CommunityPoolOutput(plan) => Action::CommunityPoolOutput(plan.clone()), + CommunityPoolDeposit(plan) => Action::CommunityPoolDeposit(plan.clone()), // Fixme: action name Withdrawal(plan) => Action::Ics20Withdrawal(plan.clone()), }) @@ -179,9 +178,9 @@ impl ActionPlan { ProposalWithdraw(proposal_withdraw) => proposal_withdraw.balance(), ProposalDepositClaim(proposal_deposit_claim) => proposal_deposit_claim.balance(), DelegatorVote(delegator_vote) => delegator_vote.balance(), - DaoSpend(dao_spend) => dao_spend.balance(), - DaoOutput(dao_output) => dao_output.balance(), - DaoDeposit(dao_deposit) => dao_deposit.balance(), + CommunityPoolSpend(community_pool_spend) => community_pool_spend.balance(), + CommunityPoolOutput(community_pool_output) => community_pool_output.balance(), + CommunityPoolDeposit(community_pool_deposit) => community_pool_deposit.balance(), PositionOpen(position_open) => position_open.balance(), PositionClose(position_close) => position_close.balance(), PositionWithdraw(position_withdraw) => position_withdraw.balance(), @@ -214,9 +213,9 @@ impl ActionPlan { PositionClose(_) => Fr::zero(), PositionWithdraw(_) => Fr::zero(), PositionRewardClaim(_) => Fr::zero(), - DaoSpend(_) => Fr::zero(), - DaoOutput(_) => Fr::zero(), - DaoDeposit(_) => Fr::zero(), + CommunityPoolSpend(_) => Fr::zero(), + CommunityPoolOutput(_) => Fr::zero(), + CommunityPoolDeposit(_) => Fr::zero(), Withdrawal(_) => Fr::zero(), } } @@ -244,9 +243,9 @@ impl ActionPlan { PositionClose(plan) => plan.effect_hash(), PositionWithdraw(plan) => plan.position_withdraw().effect_hash(), PositionRewardClaim(_plan) => todo!("position reward claim plan is not implemented"), - DaoSpend(plan) => plan.effect_hash(), - DaoOutput(plan) => plan.effect_hash(), - DaoDeposit(plan) => plan.effect_hash(), + CommunityPoolSpend(plan) => plan.effect_hash(), + CommunityPoolOutput(plan) => plan.effect_hash(), + CommunityPoolDeposit(plan) => plan.effect_hash(), Withdrawal(plan) => plan.effect_hash(), } } @@ -417,14 +416,16 @@ impl From for pb_t::ActionPlan { ActionPlan::PositionRewardClaim(inner) => pb_t::ActionPlan { action: Some(pb_t::action_plan::Action::PositionRewardClaim(inner.into())), }, - ActionPlan::DaoDeposit(inner) => pb_t::ActionPlan { - action: Some(pb_t::action_plan::Action::DaoDeposit(inner.into())), + ActionPlan::CommunityPoolDeposit(inner) => pb_t::ActionPlan { + action: Some(pb_t::action_plan::Action::CommunityPoolDeposit( + inner.into(), + )), }, - ActionPlan::DaoSpend(inner) => pb_t::ActionPlan { - action: Some(pb_t::action_plan::Action::DaoSpend(inner.into())), + ActionPlan::CommunityPoolSpend(inner) => pb_t::ActionPlan { + action: Some(pb_t::action_plan::Action::CommunityPoolSpend(inner.into())), }, - ActionPlan::DaoOutput(inner) => pb_t::ActionPlan { - action: Some(pb_t::action_plan::Action::DaoOutput(inner.into())), + ActionPlan::CommunityPoolOutput(inner) => pb_t::ActionPlan { + action: Some(pb_t::action_plan::Action::CommunityPoolOutput(inner.into())), }, ActionPlan::Withdrawal(inner) => pb_t::ActionPlan { action: Some(pb_t::action_plan::Action::Withdrawal(inner.into())), @@ -493,14 +494,14 @@ impl TryFrom for ActionPlan { pb_t::action_plan::Action::PositionRewardClaim(inner) => { Ok(ActionPlan::PositionRewardClaim(inner.try_into()?)) } - pb_t::action_plan::Action::DaoSpend(inner) => { - Ok(ActionPlan::DaoSpend(inner.try_into()?)) + pb_t::action_plan::Action::CommunityPoolSpend(inner) => { + Ok(ActionPlan::CommunityPoolSpend(inner.try_into()?)) } - pb_t::action_plan::Action::DaoDeposit(inner) => { - Ok(ActionPlan::DaoDeposit(inner.try_into()?)) + pb_t::action_plan::Action::CommunityPoolDeposit(inner) => { + Ok(ActionPlan::CommunityPoolDeposit(inner.try_into()?)) } - pb_t::action_plan::Action::DaoOutput(inner) => { - Ok(ActionPlan::DaoOutput(inner.try_into()?)) + pb_t::action_plan::Action::CommunityPoolOutput(inner) => { + Ok(ActionPlan::CommunityPoolOutput(inner.try_into()?)) } pb_t::action_plan::Action::Withdrawal(inner) => { Ok(ActionPlan::Withdrawal(inner.try_into()?)) diff --git a/crates/core/transaction/src/plan/auth.rs b/crates/core/transaction/src/plan/auth.rs index 66e64dffd6..9471fadcee 100644 --- a/crates/core/transaction/src/plan/auth.rs +++ b/crates/core/transaction/src/plan/auth.rs @@ -1,3 +1,4 @@ +use anyhow::Result; use penumbra_keys::keys::SpendKey; use rand::{CryptoRng, RngCore}; @@ -11,8 +12,8 @@ impl TransactionPlan { &self, mut rng: R, sk: &SpendKey, - ) -> AuthorizationData { - let effect_hash = self.effect_hash(sk.full_viewing_key()); + ) -> Result { + let effect_hash = self.effect_hash(sk.full_viewing_key())?; let mut spend_auths = Vec::new(); let mut delegator_vote_auths = Vec::new(); @@ -28,10 +29,10 @@ impl TransactionPlan { let auth_sig = rsk.sign(&mut rng, effect_hash.as_ref()); delegator_vote_auths.push(auth_sig); } - AuthorizationData { + Ok(AuthorizationData { effect_hash, spend_auths, delegator_vote_auths, - } + }) } } diff --git a/crates/core/transaction/src/plan/build.rs b/crates/core/transaction/src/plan/build.rs index b772ea5c31..61caedfdb9 100644 --- a/crates/core/transaction/src/plan/build.rs +++ b/crates/core/transaction/src/plan/build.rs @@ -3,17 +3,14 @@ use ark_ff::Zero; use decaf377::Fr; use decaf377_rdsa as rdsa; use penumbra_keys::FullViewingKey; +use penumbra_txhash::AuthorizingData; use rand_core::OsRng; use rand_core::{CryptoRng, RngCore}; use std::fmt::Debug; use super::TransactionPlan; use crate::ActionPlan; -use crate::{ - action::Action, - transaction::{DetectionData, TransactionParameters}, - AuthorizationData, AuthorizingData, Transaction, TransactionBody, WitnessData, -}; +use crate::{action::Action, AuthorizationData, Transaction, TransactionBody, WitnessData}; impl TransactionPlan { /// Builds a [`TransactionPlan`] by slotting in the @@ -26,29 +23,16 @@ impl TransactionPlan { ) -> Result { // Add the memo if it is planned. let memo = self - .memo_plan + .memo .as_ref() - .map(|memo_plan| memo_plan.memo()) + .map(|memo_data| memo_data.memo()) .transpose()?; - // Add detection data when there are outputs. - let detection_data: Option = if self.num_outputs() == 0 { - None - } else { - let mut fmd_clues = Vec::new(); - for clue_plan in self.clue_plans() { - fmd_clues.push(clue_plan.clue()); - } - Some(DetectionData { fmd_clues }) - }; + let detection_data = self.detection_data.as_ref().map(|x| x.detection_data()); let transaction_body = TransactionBody { actions, - transaction_parameters: TransactionParameters { - expiry_height: self.expiry_height, - chain_id: self.chain_id, - }, - fee: self.fee, + transaction_parameters: self.transaction_parameters, detection_data, memo, }; diff --git a/crates/core/transaction/src/plan/detection_data.rs b/crates/core/transaction/src/plan/detection_data.rs new file mode 100644 index 0000000000..420ad5f1ea --- /dev/null +++ b/crates/core/transaction/src/plan/detection_data.rs @@ -0,0 +1,44 @@ +use crate::DetectionData; + +use super::CluePlan; +use penumbra_proto::{core::transaction::v1alpha1 as pb, DomainType}; +use serde::{Deserialize, Serialize}; + +#[derive(Clone, Debug, Default, Serialize, Deserialize)] +#[serde(try_from = "pb::DetectionDataPlan", into = "pb::DetectionDataPlan")] +pub struct DetectionDataPlan { + pub clue_plans: Vec, +} + +impl DetectionDataPlan { + pub fn detection_data(&self) -> DetectionData { + DetectionData { + fmd_clues: self.clue_plans.iter().map(|x| x.clue()).collect::>(), + } + } +} + +impl TryFrom for DetectionDataPlan { + type Error = anyhow::Error; + fn try_from(value: pb::DetectionDataPlan) -> Result { + Ok(Self { + clue_plans: value + .clue_plans + .into_iter() + .map(TryInto::try_into) + .collect::>()?, + }) + } +} + +impl From for pb::DetectionDataPlan { + fn from(msg: DetectionDataPlan) -> Self { + Self { + clue_plans: msg.clue_plans.into_iter().map(Into::into).collect(), + } + } +} + +impl DomainType for DetectionDataPlan { + type Proto = pb::DetectionDataPlan; +} diff --git a/crates/core/transaction/src/plan/memo.rs b/crates/core/transaction/src/plan/memo.rs index 5b254e0d74..2872b0006b 100644 --- a/crates/core/transaction/src/plan/memo.rs +++ b/crates/core/transaction/src/plan/memo.rs @@ -34,8 +34,8 @@ impl DomainType for MemoPlan { impl From for pb::MemoPlan { fn from(msg: MemoPlan) -> Self { - let return_address = Some(msg.plaintext.return_address.into()); - let text = msg.plaintext.text; + let return_address = Some(msg.plaintext.return_address().into()); + let text = msg.plaintext.text().to_owned(); Self { plaintext: Some(pb::MemoPlaintext { return_address, @@ -67,10 +67,7 @@ impl TryFrom for MemoPlan { let key = PayloadKey::try_from(msg.key.to_vec())?; Ok(Self { - plaintext: MemoPlaintext { - return_address: sender, - text, - }, + plaintext: MemoPlaintext::new(sender, text)?, key, }) } diff --git a/crates/core/transaction/src/transaction.rs b/crates/core/transaction/src/transaction.rs index 8397be6878..d42b058f88 100644 --- a/crates/core/transaction/src/transaction.rs +++ b/crates/core/transaction/src/transaction.rs @@ -6,15 +6,12 @@ use std::{ use anyhow::{Context, Error}; use ark_ff::Zero; use decaf377::Fr; -use decaf377_fmd::Clue; use decaf377_rdsa::{Binding, Signature, VerificationKey, VerificationKeyBytes}; -use penumbra_chain::TransactionContext; -use penumbra_dao::{DaoDeposit, DaoOutput, DaoSpend}; +use penumbra_community_pool::{CommunityPoolDeposit, CommunityPoolOutput, CommunityPoolSpend}; use penumbra_dex::{ lp::action::{PositionClose, PositionOpen}, swap::Swap, }; -use penumbra_fee::Fee; use penumbra_governance::{DelegatorVote, ProposalSubmit, ProposalWithdraw, ValidatorVote}; use penumbra_ibc::IbcRelay; use penumbra_keys::{FullViewingKey, PayloadKey}; @@ -27,36 +24,86 @@ use penumbra_shielded_pool::{Note, Output, Spend}; use penumbra_stake::{Delegate, Undelegate, UndelegateClaim}; use penumbra_tct as tct; use penumbra_tct::StateCommitment; +use penumbra_txhash::{ + AuthHash, AuthorizingData, EffectHash, EffectingData, TransactionContext, TransactionId, +}; use serde::{Deserialize, Serialize}; use crate::{ memo::{MemoCiphertext, MemoPlaintext}, view::{action_view::OutputView, MemoView, TransactionBodyView}, - Action, ActionView, Id, IsAction, MemoPlaintextView, TransactionPerspective, TransactionView, + Action, ActionView, DetectionData, IsAction, MemoPlaintextView, TransactionParameters, + TransactionPerspective, TransactionView, }; #[derive(Clone, Debug, Default)] pub struct TransactionBody { pub actions: Vec, pub transaction_parameters: TransactionParameters, - pub fee: Fee, pub detection_data: Option, pub memo: Option, } -#[derive(Clone, Debug, Default)] -/// Parameters determining when the transaction should be accepted to the chain. -pub struct TransactionParameters { - pub expiry_height: u64, - pub chain_id: String, +impl EffectingData for TransactionBody { + fn effect_hash(&self) -> EffectHash { + let mut state = blake2b_simd::Params::new() + .personal(b"PenumbraEfHs") + .to_state(); + + let parameters_hash = self.transaction_parameters.effect_hash(); + let memo_hash = self + .memo + .as_ref() + .map(|memo| memo.effect_hash()) + // If the memo is not present, use the all-zero hash to record its absence in + // the overall effect hash. + .unwrap_or_default(); + let detection_data_hash = self + .detection_data + .as_ref() + .map(|detection_data| detection_data.effect_hash()) + // If the detection data is not present, use the all-zero hash to + // record its absence in the overall effect hash. + .unwrap_or_default(); + + // Hash the fixed data of the transaction body. + state.update(parameters_hash.as_bytes()); + state.update(memo_hash.as_bytes()); + state.update(detection_data_hash.as_bytes()); + + // Hash the number of actions, then each action. + let num_actions = self.actions.len() as u32; + state.update(&num_actions.to_le_bytes()); + for action in &self.actions { + state.update(action.effect_hash().as_bytes()); + } + + EffectHash(state.finalize().as_array().clone()) + } } -#[derive(Clone, Debug, Default)] -/// Detection data used by a detection server using Fuzzy Message Detection. -/// -/// Only present if outputs are present. -pub struct DetectionData { - pub fmd_clues: Vec, +impl EffectingData for Transaction { + fn effect_hash(&self) -> EffectHash { + self.transaction_body.effect_hash() + } +} + +impl AuthorizingData for TransactionBody { + fn auth_hash(&self) -> AuthHash { + AuthHash( + blake2b_simd::Params::default() + .hash(&self.encode_to_vec()) + .as_bytes()[0..32] + .try_into() + .expect("blake2b output is always 32 bytes long"), + ) + } +} + +impl AuthorizingData for Transaction { + fn auth_hash(&self) -> AuthHash { + self.transaction_body.auth_hash() + } } #[derive(Clone, Debug, Serialize, Deserialize)] @@ -209,9 +256,9 @@ impl Transaction { | Action::PositionWithdraw(_) | Action::PositionRewardClaim(_) | Action::Ics20Withdrawal(_) - | Action::DaoSpend(_) - | Action::DaoOutput(_) - | Action::DaoDeposit(_) => {} + | Action::CommunityPoolSpend(_) + | Action::CommunityPoolOutput(_) + | Action::CommunityPoolDeposit(_) => {} } } @@ -254,8 +301,8 @@ impl Transaction { Some(ciphertext) => match memo_plaintext { Some(plaintext) => { let plaintext_view: MemoPlaintextView = MemoPlaintextView { - return_address: txp.view_address(plaintext.return_address), - text: plaintext.text, + return_address: txp.view_address(plaintext.return_address()), + text: plaintext.text().to_owned(), }; Some(MemoView::Visible { plaintext: plaintext_view, @@ -279,7 +326,6 @@ impl Transaction { body_view: TransactionBodyView { action_views, transaction_parameters: self.transaction_parameters(), - fee: self.transaction_body().fee, detection_data, memo_view, }, @@ -436,9 +482,9 @@ impl Transaction { .filter_map(|x| x) } - pub fn dao_deposits(&self) -> impl Iterator { + pub fn community_pool_deposits(&self) -> impl Iterator { self.actions().filter_map(|action| { - if let Action::DaoDeposit(d) = action { + if let Action::CommunityPoolDeposit(d) = action { Some(d) } else { None @@ -446,9 +492,9 @@ impl Transaction { }) } - pub fn dao_spends(&self) -> impl Iterator { + pub fn community_pool_spends(&self) -> impl Iterator { self.actions().filter_map(|action| { - if let Action::DaoSpend(s) = action { + if let Action::CommunityPoolSpend(s) = action { Some(s) } else { None @@ -466,9 +512,9 @@ impl Transaction { }) } - pub fn dao_outputs(&self) -> impl Iterator { + pub fn community_pool_outputs(&self) -> impl Iterator { self.actions().filter_map(|action| { - if let Action::DaoOutput(o) = action { + if let Action::CommunityPoolOutput(o) = action { Some(o) } else { None @@ -508,14 +554,14 @@ impl Transaction { &self.binding_sig } - pub fn id(&self) -> Id { + pub fn id(&self) -> TransactionId { use sha2::{Digest, Sha256}; let tx_bytes: Vec = self.clone().try_into().expect("can serialize transaction"); let mut id_bytes = [0; 32]; id_bytes[..].copy_from_slice(Sha256::digest(&tx_bytes).as_slice()); - Id(id_bytes) + TransactionId(id_bytes) } /// Compute the binding verification key from the transaction data. @@ -527,7 +573,11 @@ impl Transaction { // Add fee into binding verification key computation. let fee_v_blinding = Fr::zero(); - let fee_value_commitment = self.transaction_body.fee.commit(fee_v_blinding); + let fee_value_commitment = self + .transaction_body + .transaction_parameters + .fee + .commit(fee_v_blinding); balance_commitments += fee_value_commitment.0; let binding_verification_key_bytes: VerificationKeyBytes = @@ -539,83 +589,17 @@ impl Transaction { } } -impl From for Vec { - fn from(transaction_body: TransactionBody) -> Vec { - let protobuf_serialized: pbt::TransactionBody = transaction_body.into(); - protobuf_serialized.encode_to_vec() - } -} - -impl DomainType for TransactionParameters { - type Proto = pbt::TransactionParameters; -} - -impl TryFrom for TransactionParameters { - type Error = Error; - - fn try_from(proto: pbt::TransactionParameters) -> anyhow::Result { - Ok(TransactionParameters { - expiry_height: proto.expiry_height, - chain_id: proto.chain_id, - }) - } -} - -impl From for pbt::TransactionParameters { - fn from(msg: TransactionParameters) -> Self { - pbt::TransactionParameters { - expiry_height: msg.expiry_height, - chain_id: msg.chain_id, - } - } -} - -impl DomainType for DetectionData { - type Proto = pbt::DetectionData; -} - -impl TryFrom for DetectionData { - type Error = Error; - - fn try_from(proto: pbt::DetectionData) -> anyhow::Result { - let fmd_clues = proto - .fmd_clues - .into_iter() - .map(|x| x.try_into()) - .collect::, Error>>()?; - Ok(DetectionData { fmd_clues }) - } -} - -impl From for pbt::DetectionData { - fn from(msg: DetectionData) -> Self { - let fmd_clues = msg.fmd_clues.into_iter().map(|x| x.into()).collect(); - - pbt::DetectionData { fmd_clues } - } -} - impl DomainType for TransactionBody { type Proto = pbt::TransactionBody; } impl From for pbt::TransactionBody { fn from(msg: TransactionBody) -> Self { - let encrypted_memo: pbt::MemoData = match msg.memo { - Some(memo) => pbt::MemoData { - encrypted_memo: memo.0.to_vec(), - }, - None => pbt::MemoData { - encrypted_memo: Default::default(), - }, - }; - pbt::TransactionBody { actions: msg.actions.into_iter().map(|x| x.into()).collect(), transaction_parameters: Some(msg.transaction_parameters.into()), - fee: Some(msg.fee.into()), detection_data: msg.detection_data.map(|x| x.into()), - memo_data: Some(encrypted_memo), + memo: msg.memo.map(Into::into), } } } @@ -633,34 +617,17 @@ impl TryFrom for TransactionBody { ); } - let fee: Fee = proto - .fee - .ok_or_else(|| anyhow::anyhow!("transaction body missing fee"))? - .try_into() - .context("fee malformed")?; - - let encrypted_memo = proto - .memo_data - .ok_or_else(|| anyhow::anyhow!("transaction body missing memo data field"))? - .encrypted_memo; - - let memo: Option = if encrypted_memo.is_empty() { - None - } else { - Some( - encrypted_memo[..] - .try_into() - .context("encrypted memo malformed while parsing transaction body")?, - ) - }; + let memo = proto + .memo + .map(TryFrom::try_from) + .transpose() + .context("encrypted memo malformed while parsing transaction body")?; - let detection_data = match proto.detection_data { - Some(data) => Some( - data.try_into() - .context("detection data malformed while parsing transaction body")?, - ), - None => None, - }; + let detection_data = proto + .detection_data + .map(TryFrom::try_from) + .transpose() + .context("detection data malformed while parsing transaction body")?; let transaction_parameters = proto .transaction_parameters @@ -671,7 +638,6 @@ impl TryFrom for TransactionBody { Ok(TransactionBody { actions, transaction_parameters, - fee, detection_data, memo, }) @@ -684,11 +650,10 @@ impl DomainType for Transaction { impl From for pbt::Transaction { fn from(msg: Transaction) -> Self { - let sig_bytes: [u8; 64] = msg.binding_sig.into(); pbt::Transaction { body: Some(msg.transaction_body.into()), anchor: Some(msg.anchor.into()), - binding_sig: sig_bytes.to_vec(), + binding_sig: Some(msg.binding_sig.into()), } } } @@ -709,7 +674,9 @@ impl TryFrom for Transaction { .try_into() .context("transaction body malformed")?; - let sig_bytes: [u8; 64] = proto.binding_sig[..] + let binding_sig = proto + .binding_sig + .ok_or_else(|| anyhow::anyhow!("transaction missing binding signature"))? .try_into() .context("transaction binding signature malformed")?; @@ -721,7 +688,7 @@ impl TryFrom for Transaction { Ok(Transaction { transaction_body, - binding_sig: sig_bytes.into(), + binding_sig, anchor, }) } diff --git a/crates/core/transaction/src/view.rs b/crates/core/transaction/src/view.rs index 63c3f9860f..62752219b8 100644 --- a/crates/core/transaction/src/view.rs +++ b/crates/core/transaction/src/view.rs @@ -1,6 +1,5 @@ use anyhow::Context; use decaf377_rdsa::{Binding, Signature}; -use penumbra_fee::Fee; use penumbra_keys::AddressView; use penumbra_proto::{core::transaction::v1alpha1 as pbt, DomainType}; @@ -14,9 +13,8 @@ use penumbra_tct as tct; pub use transaction_perspective::TransactionPerspective; use crate::{ - memo::MemoCiphertext, - transaction::{DetectionData, TransactionParameters}, - Action, Transaction, TransactionBody, + memo::MemoCiphertext, Action, DetectionData, Transaction, TransactionBody, + TransactionParameters, }; #[derive(Clone, Debug, Serialize, Deserialize)] @@ -35,7 +33,6 @@ pub struct TransactionView { pub struct TransactionBodyView { pub action_views: Vec, pub transaction_parameters: TransactionParameters, - pub fee: Fee, pub detection_data: Option, pub memo_view: Option, } @@ -86,7 +83,6 @@ impl TransactionView { transaction_body: TransactionBody { actions, transaction_parameters, - fee: self.body_view.fee.clone(), detection_data, memo: memo_ciphertext.cloned(), }, @@ -108,12 +104,12 @@ impl TryFrom for TransactionView { type Error = anyhow::Error; fn try_from(v: pbt::TransactionView) -> Result { - let sig_bytes: [u8; 64] = v.binding_sig[..] + let binding_sig = v + .binding_sig + .ok_or_else(|| anyhow::anyhow!("transaction view missing binding signature"))? .try_into() .context("transaction binding signature malformed")?; - let binding_sig = sig_bytes.into(); - let anchor = v .anchor .ok_or_else(|| anyhow::anyhow!("transaction view missing anchor"))? @@ -143,12 +139,6 @@ impl TryFrom for TransactionBodyView { action_views.push(av.try_into()?); } - let fee = body_view - .fee - .ok_or_else(|| anyhow::anyhow!("transaction view missing fee"))? - .try_into() - .context("transaction fee malformed")?; - let memo_view: Option = match body_view.memo_view { Some(mv) => match mv.memo_view { Some(x) => match x { @@ -201,7 +191,6 @@ impl TryFrom for TransactionBodyView { Ok(TransactionBodyView { action_views, transaction_parameters, - fee, detection_data, memo_view, }) @@ -213,7 +202,7 @@ impl From for pbt::TransactionView { Self { body_view: Some(v.body_view.into()), anchor: Some(v.anchor.into()), - binding_sig: v.binding_sig.to_bytes().to_vec(), + binding_sig: Some(v.binding_sig.into()), } } } @@ -223,7 +212,6 @@ impl From for pbt::TransactionBodyView { Self { action_views: v.action_views.into_iter().map(Into::into).collect(), transaction_parameters: Some(v.transaction_parameters.into()), - fee: Some(v.fee.into()), detection_data: v.detection_data.map(Into::into), memo_view: v.memo_view.map(|m| m.into()), } diff --git a/crates/core/transaction/src/view/action_view.rs b/crates/core/transaction/src/view/action_view.rs index e8e3dc6419..fde65cb2bc 100644 --- a/crates/core/transaction/src/view/action_view.rs +++ b/crates/core/transaction/src/view/action_view.rs @@ -1,4 +1,4 @@ -use penumbra_dao::{DaoDeposit, DaoOutput, DaoSpend}; +use penumbra_community_pool::{CommunityPoolDeposit, CommunityPoolOutput, CommunityPoolSpend}; use penumbra_dex::{ lp::action::{PositionClose, PositionOpen, PositionRewardClaim, PositionWithdraw}, swap::SwapView, @@ -42,9 +42,9 @@ pub enum ActionView { Undelegate(Undelegate), UndelegateClaim(UndelegateClaim), Ics20Withdrawal(Ics20Withdrawal), - DaoDeposit(DaoDeposit), - DaoSpend(DaoSpend), - DaoOutput(DaoOutput), + CommunityPoolDeposit(CommunityPoolDeposit), + CommunityPoolSpend(CommunityPoolSpend), + CommunityPoolOutput(CommunityPoolOutput), } impl DomainType for ActionView { @@ -80,9 +80,9 @@ impl TryFrom for ActionView { AV::PositionWithdraw(x) => ActionView::PositionWithdraw(x.try_into()?), AV::PositionRewardClaim(x) => ActionView::PositionRewardClaim(x.try_into()?), AV::Ics20Withdrawal(x) => ActionView::Ics20Withdrawal(x.try_into()?), - AV::DaoDeposit(x) => ActionView::DaoDeposit(x.try_into()?), - AV::DaoSpend(x) => ActionView::DaoSpend(x.try_into()?), - AV::DaoOutput(x) => ActionView::DaoOutput(x.try_into()?), + AV::CommunityPoolDeposit(x) => ActionView::CommunityPoolDeposit(x.try_into()?), + AV::CommunityPoolSpend(x) => ActionView::CommunityPoolSpend(x.try_into()?), + AV::CommunityPoolOutput(x) => ActionView::CommunityPoolOutput(x.try_into()?), }, ) } @@ -112,9 +112,9 @@ impl From for pbt::ActionView { ActionView::PositionWithdraw(x) => AV::PositionWithdraw(x.into()), ActionView::PositionRewardClaim(x) => AV::PositionRewardClaim(x.into()), ActionView::Ics20Withdrawal(x) => AV::Ics20Withdrawal(x.into()), - ActionView::DaoDeposit(x) => AV::DaoDeposit(x.into()), - ActionView::DaoSpend(x) => AV::DaoSpend(x.into()), - ActionView::DaoOutput(x) => AV::DaoOutput(x.into()), + ActionView::CommunityPoolDeposit(x) => AV::CommunityPoolDeposit(x.into()), + ActionView::CommunityPoolSpend(x) => AV::CommunityPoolSpend(x.into()), + ActionView::CommunityPoolOutput(x) => AV::CommunityPoolOutput(x.into()), }), } } @@ -142,9 +142,9 @@ impl From for Action { ActionView::PositionWithdraw(x) => Action::PositionWithdraw(x), ActionView::PositionRewardClaim(x) => Action::PositionRewardClaim(x), ActionView::Ics20Withdrawal(x) => Action::Ics20Withdrawal(x), - ActionView::DaoDeposit(x) => Action::DaoDeposit(x), - ActionView::DaoSpend(x) => Action::DaoSpend(x), - ActionView::DaoOutput(x) => Action::DaoOutput(x), + ActionView::CommunityPoolDeposit(x) => Action::CommunityPoolDeposit(x), + ActionView::CommunityPoolSpend(x) => Action::CommunityPoolSpend(x), + ActionView::CommunityPoolOutput(x) => Action::CommunityPoolOutput(x), } } } diff --git a/crates/core/transaction/src/view/transaction_perspective.rs b/crates/core/transaction/src/view/transaction_perspective.rs index d1fe0c5d8e..b5ecbbc259 100644 --- a/crates/core/transaction/src/view/transaction_perspective.rs +++ b/crates/core/transaction/src/view/transaction_perspective.rs @@ -6,11 +6,10 @@ use penumbra_proto::core::transaction::v1alpha1::{ }; use penumbra_sct::Nullifier; use penumbra_shielded_pool::{note, Note, NoteView}; +use penumbra_txhash::TransactionId; use std::collections::BTreeMap; -use crate::Id; - /// This represents the data to understand an individual transaction without /// disclosing viewing keys. #[derive(Debug, Clone, Default)] @@ -40,7 +39,7 @@ pub struct TransactionPerspective { /// Any relevant denoms for viewed assets. pub denoms: asset::Cache, /// The transaction ID associated with this TransactionPerspective - pub transaction_id: Id, + pub transaction_id: TransactionId, } impl TransactionPerspective { @@ -173,9 +172,9 @@ impl TryFrom for TransactionPerspective { ); } - let transaction_id: crate::Id = match msg.transaction_id { + let transaction_id: penumbra_txhash::TransactionId = match msg.transaction_id { Some(tx_id) => tx_id.try_into()?, - None => Id::default(), + None => TransactionId::default(), }; Ok(Self { diff --git a/crates/core/txhash/Cargo.toml b/crates/core/txhash/Cargo.toml new file mode 100644 index 0000000000..410eb951a0 --- /dev/null +++ b/crates/core/txhash/Cargo.toml @@ -0,0 +1,13 @@ +[package] +name = "penumbra-txhash" +version = "0.64.1" +edition = "2021" + +[dependencies] +# Workspace dependencies +penumbra-proto = { path = "../../proto", default-features = false } +penumbra-tct = { path = "../../crypto/tct" } +anyhow = "1" +hex = "0.4" +blake2b_simd = "0.5" +serde = "1" diff --git a/crates/core/transaction/src/auth_hash.rs b/crates/core/txhash/src/auth_hash.rs similarity index 66% rename from crates/core/transaction/src/auth_hash.rs rename to crates/core/txhash/src/auth_hash.rs index c8bfb88906..4c2188263c 100644 --- a/crates/core/transaction/src/auth_hash.rs +++ b/crates/core/txhash/src/auth_hash.rs @@ -1,7 +1,3 @@ -use penumbra_proto::DomainType; - -use crate::{Transaction, TransactionBody}; - /// A hash of a transaction's _authorizing data_, describing both its effects on /// the chain state as well as the cryptographic authorization of those effects. /// @@ -33,21 +29,3 @@ impl AuthHash { pub trait AuthorizingData { fn auth_hash(&self) -> AuthHash; } - -impl AuthorizingData for TransactionBody { - fn auth_hash(&self) -> AuthHash { - AuthHash( - blake2b_simd::Params::default() - .hash(&self.encode_to_vec()) - .as_bytes()[0..32] - .try_into() - .expect("blake2b output is always 32 bytes long"), - ) - } -} - -impl AuthorizingData for Transaction { - fn auth_hash(&self) -> AuthHash { - self.transaction_body.auth_hash() - } -} diff --git a/crates/core/component/chain/src/transaction.rs b/crates/core/txhash/src/context.rs similarity index 100% rename from crates/core/component/chain/src/transaction.rs rename to crates/core/txhash/src/context.rs diff --git a/crates/core/txhash/src/effect_hash.rs b/crates/core/txhash/src/effect_hash.rs new file mode 100644 index 0000000000..13a266c703 --- /dev/null +++ b/crates/core/txhash/src/effect_hash.rs @@ -0,0 +1,80 @@ +use penumbra_proto::{penumbra::core::txhash::v1alpha1 as pb, DomainType, Message, Name}; + +/// A hash of a transaction's _effecting data_, describing its effects on the +/// chain state. +/// +/// This includes, e.g., the commitments to new output notes created by the +/// transaction, or nullifiers spent by the transaction, but does not include +/// _authorizing data_ such as signatures or zk proofs. +#[derive(Clone, Copy, Eq, PartialEq)] +pub struct EffectHash(pub [u8; 64]); + +/// A helper function to create a BLAKE2b `State` instance given a variable-length personalization string. +fn create_personalized_state(personalization: &str) -> blake2b_simd::State { + let mut state = blake2b_simd::State::new(); + + // The `TypeUrl` provided as a personalization string is variable length, + // so we first include the length in bytes as a fixed-length prefix. + let length = personalization.len() as u64; + state.update(&length.to_le_bytes()); + state.update(personalization.as_bytes()); + + state +} + +impl EffectHash { + pub fn as_bytes(&self) -> &[u8; 64] { + &self.0 + } + + /// A helper function to hash the data of a proto-encoded message, using + /// the variable-length `TypeUrl` of the corresponding domain type as a + /// personalization string. + pub fn from_proto_effecting_data(message: &M) -> EffectHash { + let mut state = create_personalized_state(&M::type_url()); + state.update(&message.encode_to_vec()); + + EffectHash(*state.finalize().as_array()) + } +} + +impl Default for EffectHash { + fn default() -> Self { + Self([0u8; 64]) + } +} + +impl std::fmt::Debug for EffectHash { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + f.debug_tuple("EffectHash") + .field(&hex::encode(self.0)) + .finish() + } +} + +impl DomainType for EffectHash { + type Proto = pb::EffectHash; +} + +impl From for pb::EffectHash { + fn from(msg: EffectHash) -> Self { + Self { + inner: msg.0.to_vec(), + } + } +} + +impl TryFrom for EffectHash { + type Error = anyhow::Error; + fn try_from(value: pb::EffectHash) -> Result { + Ok(Self(value.inner.try_into().map_err(|_| { + anyhow::anyhow!("incorrect length for effect hash") + })?)) + } +} + +impl AsRef<[u8]> for EffectHash { + fn as_ref(&self) -> &[u8] { + &self.0 + } +} diff --git a/crates/core/txhash/src/effecting_data.rs b/crates/core/txhash/src/effecting_data.rs new file mode 100644 index 0000000000..e36a2d33f3 --- /dev/null +++ b/crates/core/txhash/src/effecting_data.rs @@ -0,0 +1,6 @@ +use crate::EffectHash; + +/// Something that can be hashed to produce an [`EffectHash`]. +pub trait EffectingData { + fn effect_hash(&self) -> EffectHash; +} diff --git a/crates/core/txhash/src/lib.rs b/crates/core/txhash/src/lib.rs new file mode 100644 index 0000000000..a32cdd483f --- /dev/null +++ b/crates/core/txhash/src/lib.rs @@ -0,0 +1,11 @@ +mod auth_hash; +mod context; +mod effect_hash; +mod effecting_data; +mod transaction_id; + +pub use auth_hash::{AuthHash, AuthorizingData}; +pub use context::TransactionContext; +pub use effect_hash::EffectHash; +pub use effecting_data::EffectingData; +pub use transaction_id::TransactionId; diff --git a/crates/core/transaction/src/id.rs b/crates/core/txhash/src/transaction_id.rs similarity index 57% rename from crates/core/transaction/src/id.rs rename to crates/core/txhash/src/transaction_id.rs index c04c8c6d7e..e0ac128c7b 100644 --- a/crates/core/transaction/src/id.rs +++ b/crates/core/txhash/src/transaction_id.rs @@ -1,32 +1,32 @@ use std::str::FromStr; -use penumbra_proto::{penumbra::core::transaction::v1alpha1 as pb, DomainType}; +use penumbra_proto::{penumbra::core::txhash::v1alpha1 as pb, DomainType}; use serde::{Deserialize, Serialize}; /// A transaction ID (hash), the Sha256 hash used by Tendermint to identify transactions. #[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize, Default)] -#[serde(try_from = "pb::Id", into = "pb::Id")] -pub struct Id(pub [u8; 32]); +#[serde(try_from = "pb::TransactionId", into = "pb::TransactionId")] +pub struct TransactionId(pub [u8; 32]); -impl AsRef<[u8]> for Id { +impl AsRef<[u8]> for TransactionId { fn as_ref(&self) -> &[u8] { &self.0 } } -impl std::fmt::Debug for Id { +impl std::fmt::Debug for TransactionId { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { write!(f, "{}", hex::encode(self.0)) } } -impl std::fmt::Display for Id { +impl std::fmt::Display for TransactionId { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { write!(f, "{}", hex::encode(self.0)) } } -impl FromStr for Id { +impl FromStr for TransactionId { type Err = anyhow::Error; fn from_str(s: &str) -> Result { @@ -36,32 +36,32 @@ impl FromStr for Id { } let mut id = [0u8; 32]; id.copy_from_slice(&bytes); - Ok(Id(id)) + Ok(TransactionId(id)) } } -impl DomainType for Id { - type Proto = pb::Id; +impl DomainType for TransactionId { + type Proto = pb::TransactionId; } -impl From for pb::Id { - fn from(id: Id) -> pb::Id { - pb::Id { - hash: id.0.to_vec(), +impl From for pb::TransactionId { + fn from(id: TransactionId) -> pb::TransactionId { + pb::TransactionId { + inner: id.0.to_vec(), } } } -impl TryFrom for Id { +impl TryFrom for TransactionId { type Error = anyhow::Error; - fn try_from(proto: pb::Id) -> anyhow::Result { - let hash = proto.hash; + fn try_from(proto: pb::TransactionId) -> anyhow::Result { + let hash = proto.inner; if hash.len() != 32 { anyhow::bail!("invalid transaction ID length"); } let mut id = [0u8; 32]; id.copy_from_slice(&hash); - Ok(Id(id)) + Ok(TransactionId(id)) } } diff --git a/crates/crypto/decaf377-frost/src/traits.rs b/crates/crypto/decaf377-frost/src/traits.rs index d0e3fede01..f29775c976 100644 --- a/crates/crypto/decaf377-frost/src/traits.rs +++ b/crates/crypto/decaf377-frost/src/traits.rs @@ -1,6 +1,6 @@ use ark_ff::{Field as _, One, UniformRand, Zero}; use decaf377::{Element, FieldExt, Fr}; -pub use frost_core::{frost, Ciphersuite, Field, FieldError, Group, GroupError}; +pub use frost_core::{Ciphersuite, Field, FieldError, Group, GroupError}; use rand_core; use crate::hash::Hasher; diff --git a/crates/crypto/proof-params/build.rs b/crates/crypto/proof-params/build.rs index 0fea574171..57107af3af 100644 --- a/crates/crypto/proof-params/build.rs +++ b/crates/crypto/proof-params/build.rs @@ -9,7 +9,7 @@ fn main() { "src/gen/spend_pk.bin", "src/gen/swap_pk.bin", "src/gen/swapclaim_pk.bin", - "src/gen/undelegateclaim_pk.bin", + "src/gen/convert_pk.bin", "src/gen/delegator_vote_pk.bin", "src/gen/nullifier_derivation_pk.bin", ]; @@ -18,7 +18,7 @@ fn main() { "src/gen/spend_vk.param", "src/gen/swap_vk.param", "src/gen/swapclaim_vk.param", - "src/gen/undelegateclaim_vk.param", + "src/gen/convert_vk.param", "src/gen/delegator_vote_vk.param", "src/gen/nullifier_derivation_vk.param", ]; diff --git a/crates/crypto/proof-params/src/gen/convert_id.rs b/crates/crypto/proof-params/src/gen/convert_id.rs new file mode 100644 index 0000000000..28ade10a91 --- /dev/null +++ b/crates/crypto/proof-params/src/gen/convert_id.rs @@ -0,0 +1,3 @@ + +pub const PROVING_KEY_ID: &'static str = "groth16pk1yn86gluhk3sy0lqhganhqzqlq9fnxx5dvay6296xeh3h6readefs8nzfsj"; +pub const VERIFICATION_KEY_ID: &'static str = "groth16vk17nws5qr9k79eqcrfvedahtlc8yk3cl2dnafy8dvu4qlqdmc0s2vqhehwu7"; diff --git a/crates/crypto/proof-params/src/gen/convert_pk.bin b/crates/crypto/proof-params/src/gen/convert_pk.bin new file mode 100644 index 0000000000..ea0edf1b6b --- /dev/null +++ b/crates/crypto/proof-params/src/gen/convert_pk.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:eeeccbfaa280ae93b186609089acce13c5a3ddc9bd49ab5dcfc601abf52c09fe +size 7926960 diff --git a/crates/crypto/proof-params/src/gen/convert_vk.param b/crates/crypto/proof-params/src/gen/convert_vk.param new file mode 100644 index 0000000000..299380ff0c Binary files /dev/null and b/crates/crypto/proof-params/src/gen/convert_vk.param differ diff --git a/crates/crypto/proof-params/src/gen/delegator_vote_id.rs b/crates/crypto/proof-params/src/gen/delegator_vote_id.rs index 5fd03d04d1..c4378173ab 100644 --- a/crates/crypto/proof-params/src/gen/delegator_vote_id.rs +++ b/crates/crypto/proof-params/src/gen/delegator_vote_id.rs @@ -1,3 +1,3 @@ -pub const PROVING_KEY_ID: &'static str = "groth16pk1hqv7y72vx5hgzfkzcajf5mg6plc3hvnhjqg8zaclymv4m9lfj99sn7w8wv"; -pub const VERIFICATION_KEY_ID: &'static str = "groth16vk1knhcr7yduj48sdrx4htfrth45ptqmjwtsyywwg5vl4pucrwm368qeqzj84"; +pub const PROVING_KEY_ID: &'static str = "groth16pk1enjmupx56ya5x640c8ux5z6uxed3epgaeacgtfvttnjw48hem9csau4dg5"; +pub const VERIFICATION_KEY_ID: &'static str = "groth16vk1lfaxqtdk4mja002dag6wsv422mydt2m5h0w5jct7w37972n58jaqpg3jnk"; diff --git a/crates/crypto/proof-params/src/gen/delegator_vote_pk.bin b/crates/crypto/proof-params/src/gen/delegator_vote_pk.bin index 57d6ee4530..52a5310c8c 100644 --- a/crates/crypto/proof-params/src/gen/delegator_vote_pk.bin +++ b/crates/crypto/proof-params/src/gen/delegator_vote_pk.bin @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:151efa4f4441a7cd008f77e91e461ae70fed5ea5f8d89a5193709ae2154bd570 +oid sha256:54ab24cd5d990817b8c682ead0386dfee4a5e42e8c0ea51d1a16207bd6c77555 size 21943632 diff --git a/crates/crypto/proof-params/src/gen/delegator_vote_vk.param b/crates/crypto/proof-params/src/gen/delegator_vote_vk.param index 7d2ccfc8be..fbab27b7f7 100644 Binary files a/crates/crypto/proof-params/src/gen/delegator_vote_vk.param and b/crates/crypto/proof-params/src/gen/delegator_vote_vk.param differ diff --git a/crates/crypto/proof-params/src/gen/nullifier_derivation_id.rs b/crates/crypto/proof-params/src/gen/nullifier_derivation_id.rs index f584ec3eed..351e8600df 100644 --- a/crates/crypto/proof-params/src/gen/nullifier_derivation_id.rs +++ b/crates/crypto/proof-params/src/gen/nullifier_derivation_id.rs @@ -1,3 +1,3 @@ -pub const PROVING_KEY_ID: &'static str = "groth16pk1706hzsn4sn3ewwhnavgyql7pa289qwkze3eq8533wwdcqfzh5lrsz79klh"; -pub const VERIFICATION_KEY_ID: &'static str = "groth16vk1us3xkxnj8eks0mkk72z5h42mxhs4du5knm3m3llcghv635pn0qequt4yc2"; +pub const PROVING_KEY_ID: &'static str = "groth16pk15nyrctlmt7tehtw5xse5qkxuduaryflwjgwqyxylnqgp3m66nlrq65q374"; +pub const VERIFICATION_KEY_ID: &'static str = "groth16vk16uhuvvk8hkh67kpcuxavksvu8p0gnzlhm54n22rlcvz2rvj82adsxqsjqf"; diff --git a/crates/crypto/proof-params/src/gen/nullifier_derivation_pk.bin b/crates/crypto/proof-params/src/gen/nullifier_derivation_pk.bin index 912eafbe65..982234fc5e 100644 --- a/crates/crypto/proof-params/src/gen/nullifier_derivation_pk.bin +++ b/crates/crypto/proof-params/src/gen/nullifier_derivation_pk.bin @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:38d3e29801419c7c4b29a96af9868bb35ef82b520ddafc6841e9b0d2b477b1aa +oid sha256:aced9d6eb603856e18c229ba911de6e3d8fb6abdb47ff3f6ee0e3c6bc6b63bb4 size 232368 diff --git a/crates/crypto/proof-params/src/gen/nullifier_derivation_vk.param b/crates/crypto/proof-params/src/gen/nullifier_derivation_vk.param index 648f32a0ba..648bf5131d 100644 Binary files a/crates/crypto/proof-params/src/gen/nullifier_derivation_vk.param and b/crates/crypto/proof-params/src/gen/nullifier_derivation_vk.param differ diff --git a/crates/crypto/proof-params/src/gen/output_id.rs b/crates/crypto/proof-params/src/gen/output_id.rs index e84d2c742f..dbae0f4e25 100644 --- a/crates/crypto/proof-params/src/gen/output_id.rs +++ b/crates/crypto/proof-params/src/gen/output_id.rs @@ -1,3 +1,3 @@ -pub const PROVING_KEY_ID: &'static str = "groth16pk1cjr04fvt8n59fzwdlmqrs9e9v7j8syfenvjax2krqjjr3ky0jlfqxalshd"; -pub const VERIFICATION_KEY_ID: &'static str = "groth16vk15hyzxz5zkc5zszg3n0g0247jp3h87w2dgu8zhe5k89wqesy7hxfqntspmu"; +pub const PROVING_KEY_ID: &'static str = "groth16pk127jt39hfrz4xud8gdfknsrrmpj57ukpdecfntr5nvqrdar5aut7q2yuu60"; +pub const VERIFICATION_KEY_ID: &'static str = "groth16vk12kdj4y4ewuyuzjv50j394dngavrzwxjrdaz365hqjfs6xxcsnauqc0v2z3"; diff --git a/crates/crypto/proof-params/src/gen/output_pk.bin b/crates/crypto/proof-params/src/gen/output_pk.bin index cbf80d7732..8a49853674 100644 --- a/crates/crypto/proof-params/src/gen/output_pk.bin +++ b/crates/crypto/proof-params/src/gen/output_pk.bin @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:806f7d080e9b570b6d1cc8e8d72300c58e8c9c4daf02b0799d27869ef5202f64 +oid sha256:9f45538e31839cf56138a846da0048607dc66274bba98ecd1ec7a8720e07102d size 7257360 diff --git a/crates/crypto/proof-params/src/gen/output_vk.param b/crates/crypto/proof-params/src/gen/output_vk.param index 5cf507f2a6..aafe108e60 100644 Binary files a/crates/crypto/proof-params/src/gen/output_vk.param and b/crates/crypto/proof-params/src/gen/output_vk.param differ diff --git a/crates/crypto/proof-params/src/gen/spend_id.rs b/crates/crypto/proof-params/src/gen/spend_id.rs index f8132e8415..93853efac5 100644 --- a/crates/crypto/proof-params/src/gen/spend_id.rs +++ b/crates/crypto/proof-params/src/gen/spend_id.rs @@ -1,3 +1,3 @@ -pub const PROVING_KEY_ID: &'static str = "groth16pk1fcytclqvsqmleer6w87cnyvfw9gvksydren89r4hejhkmq8njl8qanww5n"; -pub const VERIFICATION_KEY_ID: &'static str = "groth16vk1xtreus06n3ewt2q3wt3jy79umjpytr7c9z9pfggahhzdl848299qxajy7v"; +pub const PROVING_KEY_ID: &'static str = "groth16pk14tgw5vffk4gdyllc4hgvma4rhk75nufkyvf3kpsxv09wsyr9wx4qlcgxs9"; +pub const VERIFICATION_KEY_ID: &'static str = "groth16vk10w5undhz04tev857kk6047kk4ppywzale9vpf03g605anfucsp0q77ku8p"; diff --git a/crates/crypto/proof-params/src/gen/spend_pk.bin b/crates/crypto/proof-params/src/gen/spend_pk.bin index 558c779f3f..9a7b9f6f1e 100644 --- a/crates/crypto/proof-params/src/gen/spend_pk.bin +++ b/crates/crypto/proof-params/src/gen/spend_pk.bin @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:89979fd45f4cebeaa6ad7c5cb1134401234d3a167e4eeafd61a3beb959727e62 +oid sha256:f44b3bd8709faf6df3c932a8b1ec3b4a83c6baf52d331f828b7d5f590e59dc76 size 21187632 diff --git a/crates/crypto/proof-params/src/gen/spend_vk.param b/crates/crypto/proof-params/src/gen/spend_vk.param index 8f193906ec..96cca6f873 100644 Binary files a/crates/crypto/proof-params/src/gen/spend_vk.param and b/crates/crypto/proof-params/src/gen/spend_vk.param differ diff --git a/crates/crypto/proof-params/src/gen/swap_id.rs b/crates/crypto/proof-params/src/gen/swap_id.rs index 3b65a2d65a..684f57ca86 100644 --- a/crates/crypto/proof-params/src/gen/swap_id.rs +++ b/crates/crypto/proof-params/src/gen/swap_id.rs @@ -1,3 +1,3 @@ -pub const PROVING_KEY_ID: &'static str = "groth16pk1u5xk2s2uxnz7370mt5f84yvcc0qdz42v6lsdjy3w6vyv6gaympms22kn8r"; -pub const VERIFICATION_KEY_ID: &'static str = "groth16vk1qsujtjs2pgumus0sx5unmygv0uq78t8x2eht4ry89qempx8wh4gs4gaped"; +pub const PROVING_KEY_ID: &'static str = "groth16pk1j0zmn74aq9w0q2gu8jjf5wh93smv82l52lf7k4w528e6q36dcs6qsm06sc"; +pub const VERIFICATION_KEY_ID: &'static str = "groth16vk1wwr0yh4yjakrjzg2epv67al3ra8yp5hjvr8mvretflvn53lkgmsqf9p3rf"; diff --git a/crates/crypto/proof-params/src/gen/swap_pk.bin b/crates/crypto/proof-params/src/gen/swap_pk.bin index 8417a55694..8ac44d5cf7 100644 --- a/crates/crypto/proof-params/src/gen/swap_pk.bin +++ b/crates/crypto/proof-params/src/gen/swap_pk.bin @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:071ac75dfbb01be415d3915f8fc003d99d54763826bd4a693c0c7a359c910543 +oid sha256:db98f1e16c69b2dfb4e3ea511460f073e203f31594f2e642a8f3ee42d489f6ee size 14019984 diff --git a/crates/crypto/proof-params/src/gen/swap_vk.param b/crates/crypto/proof-params/src/gen/swap_vk.param index 0386e2365f..334579f689 100644 Binary files a/crates/crypto/proof-params/src/gen/swap_vk.param and b/crates/crypto/proof-params/src/gen/swap_vk.param differ diff --git a/crates/crypto/proof-params/src/gen/swapclaim_id.rs b/crates/crypto/proof-params/src/gen/swapclaim_id.rs index 473e18d654..3b8262b903 100644 --- a/crates/crypto/proof-params/src/gen/swapclaim_id.rs +++ b/crates/crypto/proof-params/src/gen/swapclaim_id.rs @@ -1,3 +1,3 @@ -pub const PROVING_KEY_ID: &'static str = "groth16pk1jxrg7qd577py094z6430e5y8864ya5dwevh879aj6qk2qq3r7exq49ftnq"; -pub const VERIFICATION_KEY_ID: &'static str = "groth16vk1rg87uv9a6qphylmk6n66llaj954zq0jpwkx5cw5sfwpgaw0ym4mqkrn2ct"; +pub const PROVING_KEY_ID: &'static str = "groth16pk1v78n6c69ewu99ty4gmg58fxk82y3srqgl82czvpe2yfv0s00j53s476aqk"; +pub const VERIFICATION_KEY_ID: &'static str = "groth16vk1dp4m2nnc7lu7cqxp6lzaha67zqexcdp7ppzyvxy8kyhw5zq29zusrwxhvt"; diff --git a/crates/crypto/proof-params/src/gen/swapclaim_pk.bin b/crates/crypto/proof-params/src/gen/swapclaim_pk.bin index 923efc5e77..0f90a45a13 100644 --- a/crates/crypto/proof-params/src/gen/swapclaim_pk.bin +++ b/crates/crypto/proof-params/src/gen/swapclaim_pk.bin @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:79ef9a0cfa4a09670641f43b6ec543d9c620539ca7e8c1d8544ec4346ba9190d +oid sha256:3254b253b1afde79e395d3d65ef61fedb6b1aa5c41da438f3c8ab0ceaa9b95db size 22569072 diff --git a/crates/crypto/proof-params/src/gen/swapclaim_vk.param b/crates/crypto/proof-params/src/gen/swapclaim_vk.param index 210f4a8b5c..624fa39afc 100644 Binary files a/crates/crypto/proof-params/src/gen/swapclaim_vk.param and b/crates/crypto/proof-params/src/gen/swapclaim_vk.param differ diff --git a/crates/crypto/proof-params/src/gen/undelegateclaim_id.rs b/crates/crypto/proof-params/src/gen/undelegateclaim_id.rs deleted file mode 100644 index ce7b2bd5ce..0000000000 --- a/crates/crypto/proof-params/src/gen/undelegateclaim_id.rs +++ /dev/null @@ -1,3 +0,0 @@ - -pub const PROVING_KEY_ID: &'static str = "groth16pk1kz7ck7fsulndvp23zf6knnt7gvkh3pycryj9q95k4vlc4fmv2ptqq4pw65"; -pub const VERIFICATION_KEY_ID: &'static str = "groth16vk1edaemnjzh22hmkms4mqw9mhh9kt79qjvdgtr5gurn4k8yc7860xqx5ecxk"; diff --git a/crates/crypto/proof-params/src/gen/undelegateclaim_pk.bin b/crates/crypto/proof-params/src/gen/undelegateclaim_pk.bin deleted file mode 100644 index dcfa8f9e69..0000000000 --- a/crates/crypto/proof-params/src/gen/undelegateclaim_pk.bin +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2e373a86e5bd24252b195e6fc4f283facac605ea0312dc2b013ee7de90a2f22c -size 7926960 diff --git a/crates/crypto/proof-params/src/gen/undelegateclaim_vk.param b/crates/crypto/proof-params/src/gen/undelegateclaim_vk.param deleted file mode 100644 index 306896bc7a..0000000000 Binary files a/crates/crypto/proof-params/src/gen/undelegateclaim_vk.param and /dev/null differ diff --git a/crates/crypto/proof-params/src/lib.rs b/crates/crypto/proof-params/src/lib.rs index 5b41ae9ac5..50c10d77ca 100644 --- a/crates/crypto/proof-params/src/lib.rs +++ b/crates/crypto/proof-params/src/lib.rs @@ -173,24 +173,24 @@ pub mod swapclaim { include!("gen/swapclaim_id.rs"); } -/// Proving key for the undelegateclaim proof. -pub static UNDELEGATECLAIM_PROOF_PROVING_KEY: Lazy = Lazy::new(|| { - let undelegate_claim_proving_key = LazyProvingKey::new(undelegateclaim::PROVING_KEY_ID); +/// Proving key for the convert proof. +pub static CONVERT_PROOF_PROVING_KEY: Lazy = Lazy::new(|| { + let convert_proving_key = LazyProvingKey::new(convert::PROVING_KEY_ID); #[cfg(feature = "bundled-proving-keys")] - undelegate_claim_proving_key - .try_load(include_bytes!("gen/undelegateclaim_pk.bin")) + convert_proving_key + .try_load(include_bytes!("gen/convert_pk.bin")) .expect("bundled proving key is valid"); - undelegate_claim_proving_key + convert_proving_key }); -/// Verification key for the undelegateclaim proof. -pub static UNDELEGATECLAIM_PROOF_VERIFICATION_KEY: Lazy> = - Lazy::new(|| undelegateclaim_verification_parameters().into()); +/// Verification key for the convert proof. +pub static CONVERT_PROOF_VERIFICATION_KEY: Lazy> = + Lazy::new(|| convert_verification_parameters().into()); -pub mod undelegateclaim { - include!("gen/undelegateclaim_id.rs"); +pub mod convert { + include!("gen/convert_id.rs"); } /// Proving key for the delegator vote proof. @@ -260,8 +260,8 @@ fn swapclaim_verification_parameters() -> VerifyingKey { .expect("can deserialize VerifyingKey") } -fn undelegateclaim_verification_parameters() -> VerifyingKey { - let vk_params = include_bytes!("gen/undelegateclaim_vk.param"); +fn convert_verification_parameters() -> VerifyingKey { + let vk_params = include_bytes!("gen/convert_vk.param"); VerifyingKey::deserialize_uncompressed_unchecked(&vk_params[..]) .expect("can deserialize VerifyingKey") } diff --git a/crates/crypto/proof-setup/Cargo.toml b/crates/crypto/proof-setup/Cargo.toml index fd41765527..dbbc3483ca 100644 --- a/crates/crypto/proof-setup/Cargo.toml +++ b/crates/crypto/proof-setup/Cargo.toml @@ -15,12 +15,16 @@ blake2b_simd = "0.5" rand_core = { version = "0.6", features = ["getrandom"] } decaf377 = { version = "0.5", default_features = false } penumbra-dex = { path = "../../core/component/dex/" } -penumbra-dao = { path = "../../core/component/dao/", features = ["component"] } +penumbra-community-pool = { path = "../../core/component/community-pool/", features = [ + "component", +] } penumbra-governance = { path = "../../core/component/governance/" } penumbra-proof-params = { path = "../proof-params" } penumbra-proto = { path = "../../proto" } penumbra-shielded-pool = { path = "../../core/component/shielded-pool/" } -penumbra-stake = { path = "../../core/component/stake/", features = ["component"] } +penumbra-stake = { path = "../../core/component/stake/", features = [ + "component", +] } rayon = { version = "1.8.0", optional = true } [dev-dependencies] @@ -37,4 +41,11 @@ harness = false [features] default = [] -parallel = ["ark-ec/parallel", "ark-ff/parallel", "ark-groth16/parallel", "decaf377/parallel", "rayon", "penumbra-shielded-pool/parallel"] +parallel = [ + "ark-ec/parallel", + "ark-ff/parallel", + "ark-groth16/parallel", + "decaf377/parallel", + "rayon", + "penumbra-shielded-pool/parallel", +] diff --git a/crates/crypto/proof-setup/src/all.rs b/crates/crypto/proof-setup/src/all.rs index 7d86239d28..844ecd7fff 100644 --- a/crates/crypto/proof-setup/src/all.rs +++ b/crates/crypto/proof-setup/src/all.rs @@ -23,8 +23,9 @@ use penumbra_dex::{swap::proof::SwapCircuit, swap_claim::proof::SwapClaimCircuit use penumbra_governance::DelegatorVoteCircuit; use penumbra_proof_params::generate_constraint_matrices; use penumbra_proto::tools::summoning::v1alpha1::{self as pb}; -use penumbra_shielded_pool::{NullifierDerivationCircuit, OutputCircuit, SpendCircuit}; -use penumbra_stake::UndelegateClaimCircuit; +use penumbra_shielded_pool::{ + ConvertCircuit, NullifierDerivationCircuit, OutputCircuit, SpendCircuit, +}; use rand_core::OsRng; @@ -62,7 +63,7 @@ fn circuits() -> [ConstraintMatrices; NUM_CIRCUITS] { generate_constraint_matrices::(), generate_constraint_matrices::(), generate_constraint_matrices::(), - generate_constraint_matrices::(), + generate_constraint_matrices::(), generate_constraint_matrices::(), generate_constraint_matrices::(), generate_constraint_matrices::(), diff --git a/crates/crypto/tct/src/internal.rs b/crates/crypto/tct/src/internal.rs index 1b726fe66a..0b32acf559 100644 --- a/crates/crypto/tct/src/internal.rs +++ b/crates/crypto/tct/src/internal.rs @@ -115,7 +115,7 @@ pub mod frontier { item::Item, leaf::Leaf, node::Node, - tier::{Nested, Tier}, + tier::Tier, top::{Top, TrackForgotten}, }; } diff --git a/crates/custody/Cargo.toml b/crates/custody/Cargo.toml index 912e72f511..67aa378788 100644 --- a/crates/custody/Cargo.toml +++ b/crates/custody/Cargo.toml @@ -17,10 +17,11 @@ decaf377-frost = { path = "../crypto/decaf377-frost" } decaf377-ka = { path = "../crypto/decaf377-ka" } penumbra-chain = { path = "../core/component/chain" } penumbra-keys = { path = "../core/keys" } +penumbra-txhash = { path = "../core/txhash" } penumbra-proto = { path = "../proto", features = ["rpc"] } penumbra-transaction = { path = "../core/transaction" } -tokio = { version = "1.21.1", features = ["full"]} +tokio = { version = "1.21.1", features = ["full"] } anyhow = "1" serde_json = "1" serde = { version = "1", features = ["derive"] } diff --git a/crates/custody/src/soft_kms.rs b/crates/custody/src/soft_kms.rs index 4faa20e483..bb46604bc0 100644 --- a/crates/custody/src/soft_kms.rs +++ b/crates/custody/src/soft_kms.rs @@ -33,7 +33,7 @@ impl SoftKms { policy.check(request)?; } - Ok(request.plan.authorize(OsRng, &self.config.spend_key)) + Ok(request.plan.authorize(OsRng, &self.config.spend_key)?) } } diff --git a/crates/custody/src/threshold.rs b/crates/custody/src/threshold.rs index 4b944c5ac7..4323fe4854 100644 --- a/crates/custody/src/threshold.rs +++ b/crates/custody/src/threshold.rs @@ -460,7 +460,103 @@ mod test { #[tokio::test] async fn test_transaction_signing() -> Result<()> { - const TEST_PLAN: &'static str = r#"{"actions":[{"output":{"value":{"amount":{"lo":"1000000000"},"assetId":{"inner":"KeqcLzNx9qSH5+lcJHBB9KNW+YPrBk5dKzvPMiypahA="}},"destAddress":{"inner":"UuFEV0VoZNxNTttsJVJzRqEzW4bm0z2RCxhUneve0KTvDjQipeg/1zx0ftbDjgr6uPiSA70yJIdlpFyxeLyXfAAtmSy6BCpR3YjEkf1bI5Q="},"rseed":"4m4bxumA0sHuonPjr12UnI4CWKj1wuq4y6rrMRb0nw0=","valueBlinding":"HHS7tY19JuWMwdKJvtKs8AmhMVa7osSpZ+CCBszu/AE=","proofBlindingR":"FmbXZoh5Pd2mEtiAEkkAZpllWo9pdwTPlXeODBXHUxA=","proofBlindingS":"0x96kUchW8jFfnxglAoMtvzPT5/RLg2RvfkRKjlU8BA="}},{"spend":{"note":{"value":{"amount":{"lo":"1000000000000"},"assetId":{"inner":"KeqcLzNx9qSH5+lcJHBB9KNW+YPrBk5dKzvPMiypahA="}},"rseed":"3svSxWREwvvVzb2upQuu3Cyr56O2kRbo0nuX4+OWcdc=","address":{"inner":"6146pY5upA9bQa4tag+6hXpMXa2kO5fcicSJGVEUP4HhZt7m4FpwAJ3+qwr5gpbHUON7DigyEJRpeV31FATGdfJhHBzGDWC+CIvi8dyIzGo="}},"position":"90","randomizer":"dJvg8FGvw5rJAvtSQvlQ4imLXahVXn419+xroVMLSwA=","valueBlinding":"Ce1/hBKLEMB/bjEA06b4zUJVEstNUjkDBWM3WrVu+QM=","proofBlindingR":"gXA7M4VR48IoxKrf4w4jGae2O7OGlTecU/RBXd4g6QI=","proofBlindingS":"7+Rhrve7mdgsKbkfFq41yfq9+Mx2qRAZDtwP3VUDAAs="}},{"output":{"value":{"amount":{"lo":"999000000000"},"assetId":{"inner":"KeqcLzNx9qSH5+lcJHBB9KNW+YPrBk5dKzvPMiypahA="}},"destAddress":{"inner":"6146pY5upA9bQa4tag+6hXpMXa2kO5fcicSJGVEUP4HhZt7m4FpwAJ3+qwr5gpbHUON7DigyEJRpeV31FATGdfJhHBzGDWC+CIvi8dyIzGo="},"rseed":"rCTbPc6xWyEcDV73Pl+W6XXbACShVOM+8/vdc7RSLlo=","valueBlinding":"DP0FN5CV4g9xZN6u2W6/4o6I/Zwr38n81q4YnJ6COAA=","proofBlindingR":"KV3u8Dc+cZo0HFUIn7n95UkQVXWeYp+3vAVuIpCIZRI=","proofBlindingS":"i00KyJVklWXUhVRy37N3p9szFIvo7383to/qxBexnBE="}}],"chainId":"penumbra-testnet-rhea-8b2dfc5c","fee":{"amount":{}},"cluePlans":[{"address":{"inner":"UuFEV0VoZNxNTttsJVJzRqEzW4bm0z2RCxhUneve0KTvDjQipeg/1zx0ftbDjgr6uPiSA70yJIdlpFyxeLyXfAAtmSy6BCpR3YjEkf1bI5Q="},"rseed":"1Li0Qx05txsyOrx2pfO9kD5rDSUMy9e+j/hHmucqARI="},{"address":{"inner":"6146pY5upA9bQa4tag+6hXpMXa2kO5fcicSJGVEUP4HhZt7m4FpwAJ3+qwr5gpbHUON7DigyEJRpeV31FATGdfJhHBzGDWC+CIvi8dyIzGo="},"rseed":"ePtCm9/tFcpLBdlgyu8bYRKV5CHbqd823UGDhG1LsGY="}],"memoPlan":{"plaintext":{"returnAddress":{"inner":"OB8AEHEehWo0o0/Dn7JtNmgdDX1VRPaDgn6MLl6n41hVjI3llljrTDCFRRjN5mkNwVwsAyJ/UdfjNIFzbGV62YVXfBJ/IMVTq2CNAHwR8Qo="}},"key":"3plOcPZzKKj8KT3sVdKnblUUFDRzCmMWYtgwB3BqfXQ="}}"#; + const TEST_PLAN: &'static str = r#" +{ + "actions": [ + { + "output": { + "value": { + "amount": { + "lo": "1000000000" + }, + "assetId": { + "inner": "KeqcLzNx9qSH5+lcJHBB9KNW+YPrBk5dKzvPMiypahA=" + } + }, + "destAddress": { + "inner": "UuFEV0VoZNxNTttsJVJzRqEzW4bm0z2RCxhUneve0KTvDjQipeg/1zx0ftbDjgr6uPiSA70yJIdlpFyxeLyXfAAtmSy6BCpR3YjEkf1bI5Q=" + }, + "rseed": "4m4bxumA0sHuonPjr12UnI4CWKj1wuq4y6rrMRb0nw0=", + "valueBlinding": "HHS7tY19JuWMwdKJvtKs8AmhMVa7osSpZ+CCBszu/AE=", + "proofBlindingR": "FmbXZoh5Pd2mEtiAEkkAZpllWo9pdwTPlXeODBXHUxA=", + "proofBlindingS": "0x96kUchW8jFfnxglAoMtvzPT5/RLg2RvfkRKjlU8BA=" + } + }, + { + "spend": { + "note": { + "value": { + "amount": { + "lo": "1000000000000" + }, + "assetId": { + "inner": "KeqcLzNx9qSH5+lcJHBB9KNW+YPrBk5dKzvPMiypahA=" + } + }, + "rseed": "3svSxWREwvvVzb2upQuu3Cyr56O2kRbo0nuX4+OWcdc=", + "address": { + "inner": "6146pY5upA9bQa4tag+6hXpMXa2kO5fcicSJGVEUP4HhZt7m4FpwAJ3+qwr5gpbHUON7DigyEJRpeV31FATGdfJhHBzGDWC+CIvi8dyIzGo=" + } + }, + "position": "90", + "randomizer": "dJvg8FGvw5rJAvtSQvlQ4imLXahVXn419+xroVMLSwA=", + "valueBlinding": "Ce1/hBKLEMB/bjEA06b4zUJVEstNUjkDBWM3WrVu+QM=", + "proofBlindingR": "gXA7M4VR48IoxKrf4w4jGae2O7OGlTecU/RBXd4g6QI=", + "proofBlindingS": "7+Rhrve7mdgsKbkfFq41yfq9+Mx2qRAZDtwP3VUDAAs=" + } + }, + { + "output": { + "value": { + "amount": { + "lo": "999000000000" + }, + "assetId": { + "inner": "KeqcLzNx9qSH5+lcJHBB9KNW+YPrBk5dKzvPMiypahA=" + } + }, + "destAddress": { + "inner": "6146pY5upA9bQa4tag+6hXpMXa2kO5fcicSJGVEUP4HhZt7m4FpwAJ3+qwr5gpbHUON7DigyEJRpeV31FATGdfJhHBzGDWC+CIvi8dyIzGo=" + }, + "rseed": "rCTbPc6xWyEcDV73Pl+W6XXbACShVOM+8/vdc7RSLlo=", + "valueBlinding": "DP0FN5CV4g9xZN6u2W6/4o6I/Zwr38n81q4YnJ6COAA=", + "proofBlindingR": "KV3u8Dc+cZo0HFUIn7n95UkQVXWeYp+3vAVuIpCIZRI=", + "proofBlindingS": "i00KyJVklWXUhVRy37N3p9szFIvo7383to/qxBexnBE=" + } + } + ], + "transactionParameters": { + "chainId": "penumbra-testnet-rhea-8b2dfc5c", + "fee": { + "amount": {} + } + }, + "detectionData": { + "cluePlans": [ + { + "address": { + "inner": "UuFEV0VoZNxNTttsJVJzRqEzW4bm0z2RCxhUneve0KTvDjQipeg/1zx0ftbDjgr6uPiSA70yJIdlpFyxeLyXfAAtmSy6BCpR3YjEkf1bI5Q=" + }, + "rseed": "1Li0Qx05txsyOrx2pfO9kD5rDSUMy9e+j/hHmucqARI=" + }, + { + "address": { + "inner": "6146pY5upA9bQa4tag+6hXpMXa2kO5fcicSJGVEUP4HhZt7m4FpwAJ3+qwr5gpbHUON7DigyEJRpeV31FATGdfJhHBzGDWC+CIvi8dyIzGo=" + }, + "rseed": "ePtCm9/tFcpLBdlgyu8bYRKV5CHbqd823UGDhG1LsGY=" + } + ] + }, + "memo": { + "plaintext": { + "returnAddress": { + "inner": "OB8AEHEehWo0o0/Dn7JtNmgdDX1VRPaDgn6MLl6n41hVjI3llljrTDCFRRjN5mkNwVwsAyJ/UdfjNIFzbGV62YVXfBJ/IMVTq2CNAHwR8Qo=" + } + }, + "key": "3plOcPZzKKj8KT3sVdKnblUUFDRzCmMWYtgwB3BqfXQ=" + } +} + "#; const T: u16 = 3; const N: u16 = 3; @@ -483,7 +579,7 @@ mod test { pre_authorizations: Vec::new(), }) .await?; - assert_eq!(plan.effect_hash(&fvk), authorization_data.effect_hash); + assert_eq!(plan.effect_hash(&fvk)?, authorization_data.effect_hash); // The transaction plan only has spends for (randomizer, sig) in plan .spend_plans() diff --git a/crates/custody/src/threshold/sign.rs b/crates/custody/src/threshold/sign.rs index 455066b8bb..4375b20a75 100644 --- a/crates/custody/src/threshold/sign.rs +++ b/crates/custody/src/threshold/sign.rs @@ -7,9 +7,9 @@ use anyhow::{anyhow, Result}; use decaf377_frost as frost; use ed25519_consensus::{Signature, SigningKey, VerificationKey}; use frost::round1::SigningCommitments; -use penumbra_chain::EffectHash; use penumbra_proto::{penumbra::custody::threshold::v1alpha1 as pb, DomainType, Message}; use penumbra_transaction::{plan::TransactionPlan, AuthorizationData}; +use penumbra_txhash::EffectHash; use rand_core::CryptoRngCore; use super::config::Config; @@ -348,7 +348,7 @@ pub fn coordinator_round2( let reply = CoordinatorRound2 { all_commitments }; let my_round2_reply = follower_round2(config, state.my_round1_state, reply.clone())?; - let effect_hash = state.plan.effect_hash(config.fvk()); + let effect_hash = state.plan.effect_hash(config.fvk())?; let signing_packages = { reply .all_commitments @@ -432,7 +432,7 @@ pub fn follower_round2( state: FollowerState, coordinator: CoordinatorRound2, ) -> Result { - let effect_hash = state.plan.effect_hash(config.fvk()); + let effect_hash = state.plan.effect_hash(config.fvk())?; let signing_packages = coordinator .all_commitments .into_iter() diff --git a/crates/proto/Cargo.toml b/crates/proto/Cargo.toml index bbde2d7e6b..6f510ca633 100644 --- a/crates/proto/Cargo.toml +++ b/crates/proto/Cargo.toml @@ -18,7 +18,7 @@ anyhow = "1.0" subtle-encoding = "0.5" bech32 = "0.8" cnidarium = { path = "../cnidarium", optional = true } -ibc-types = { version = "0.10.0", features = ["std"] } +ibc-types = { version = "0.11.0", features = ["std"] } pin-project = "1" async-trait = "0.1.52" async-stream = "0.2.0" @@ -27,7 +27,7 @@ futures = "0.3" pbjson = "0.6" pbjson-types = "0.6" -ibc-proto = { version = "0.39.0", default-features = false, features = [ +ibc-proto = { version = "0.40.0", default-features = false, features = [ "std", "serde", ] } diff --git a/crates/proto/src/gen/penumbra.cnidarium.v1alpha1.rs b/crates/proto/src/gen/penumbra.cnidarium.v1alpha1.rs index 6edd6f9cbc..33b0e9efef 100644 --- a/crates/proto/src/gen/penumbra.cnidarium.v1alpha1.rs +++ b/crates/proto/src/gen/penumbra.cnidarium.v1alpha1.rs @@ -91,6 +91,106 @@ impl ::prost::Name for PrefixValueResponse { ::prost::alloc::format!("penumbra.cnidarium.v1alpha1.{}", Self::NAME) } } +/// Requests a stream of new key-value pairs that have been committed to the state. +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct WatchRequest { + /// A regex for keys in the verifiable storage. + /// + /// Only key-value updates whose keys match this regex will be returned. + /// Note that the empty string matches all keys. + /// To exclude all keys, use the regex "$^", which matches no strings. + #[prost(string, tag = "1")] + pub key_regex: ::prost::alloc::string::String, + /// A regex for keys in the nonverifiable storage. + /// + /// Only key-value updates whose keys match this regex will be returned. + /// Note that the empty string matches all keys. + /// To exclude all keys, use the regex "$^", which matches no strings. + #[prost(string, tag = "2")] + pub nv_key_regex: ::prost::alloc::string::String, +} +impl ::prost::Name for WatchRequest { + const NAME: &'static str = "WatchRequest"; + const PACKAGE: &'static str = "penumbra.cnidarium.v1alpha1"; + fn full_name() -> ::prost::alloc::string::String { + ::prost::alloc::format!("penumbra.cnidarium.v1alpha1.{}", Self::NAME) + } +} +/// A key-value pair that has been committed to the state. +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct WatchResponse { + /// The state version the key-value pair was committed at. + #[prost(uint64, tag = "1")] + pub version: u64, + /// The entry that was committed. + #[prost(oneof = "watch_response::Entry", tags = "5, 6")] + pub entry: ::core::option::Option, +} +/// Nested message and enum types in `WatchResponse`. +pub mod watch_response { + /// Elements of the verifiable storage have string keys. + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct KeyValue { + #[prost(string, tag = "1")] + pub key: ::prost::alloc::string::String, + #[prost(bytes = "vec", tag = "2")] + pub value: ::prost::alloc::vec::Vec, + /// If set to true, the key-value pair was deleted. + /// This allows distinguishing a deleted key-value pair from a key-value pair whose value is empty. + #[prost(bool, tag = "3")] + pub deleted: bool, + } + impl ::prost::Name for KeyValue { + const NAME: &'static str = "KeyValue"; + const PACKAGE: &'static str = "penumbra.cnidarium.v1alpha1"; + fn full_name() -> ::prost::alloc::string::String { + ::prost::alloc::format!( + "penumbra.cnidarium.v1alpha1.WatchResponse.{}", Self::NAME + ) + } + } + /// Elements of the nonverifiable storage have byte keys. + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct NvKeyValue { + #[prost(bytes = "vec", tag = "1")] + pub key: ::prost::alloc::vec::Vec, + #[prost(bytes = "vec", tag = "2")] + pub value: ::prost::alloc::vec::Vec, + /// If set to true, the key-value pair was deleted. + /// This allows distinguishing a deleted key-value pair from a key-value pair whose value is empty. + #[prost(bool, tag = "3")] + pub deleted: bool, + } + impl ::prost::Name for NvKeyValue { + const NAME: &'static str = "NvKeyValue"; + const PACKAGE: &'static str = "penumbra.cnidarium.v1alpha1"; + fn full_name() -> ::prost::alloc::string::String { + ::prost::alloc::format!( + "penumbra.cnidarium.v1alpha1.WatchResponse.{}", Self::NAME + ) + } + } + /// The entry that was committed. + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Oneof)] + pub enum Entry { + #[prost(message, tag = "5")] + Kv(KeyValue), + #[prost(message, tag = "6")] + NvKv(NvKeyValue), + } +} +impl ::prost::Name for WatchResponse { + const NAME: &'static str = "WatchResponse"; + const PACKAGE: &'static str = "penumbra.cnidarium.v1alpha1"; + fn full_name() -> ::prost::alloc::string::String { + ::prost::alloc::format!("penumbra.cnidarium.v1alpha1.{}", Self::NAME) + } +} /// Generated client implementations. #[cfg(feature = "rpc")] pub mod query_service_client { @@ -211,7 +311,6 @@ pub mod query_service_client { } /// General-purpose prefixed key-value state query API, that can be used to query /// arbitrary prefixes in the JMT storage. - /// Returns a stream of `PrefixValueResponse`s. pub async fn prefix_value( &mut self, request: impl tonic::IntoRequest, @@ -242,6 +341,34 @@ pub mod query_service_client { ); self.inner.server_streaming(req, path, codec).await } + /// Subscribes to a stream of key-value updates, with regex filtering on keys. + pub async fn watch( + &mut self, + request: impl tonic::IntoRequest, + ) -> std::result::Result< + tonic::Response>, + tonic::Status, + > { + self.inner + .ready() + .await + .map_err(|e| { + tonic::Status::new( + tonic::Code::Unknown, + format!("Service was not ready: {}", e.into()), + ) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/penumbra.cnidarium.v1alpha1.QueryService/Watch", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert( + GrpcMethod::new("penumbra.cnidarium.v1alpha1.QueryService", "Watch"), + ); + self.inner.server_streaming(req, path, codec).await + } } } /// Generated server implementations. @@ -269,7 +396,6 @@ pub mod query_service_server { + 'static; /// General-purpose prefixed key-value state query API, that can be used to query /// arbitrary prefixes in the JMT storage. - /// Returns a stream of `PrefixValueResponse`s. async fn prefix_value( &self, request: tonic::Request, @@ -277,6 +403,17 @@ pub mod query_service_server { tonic::Response, tonic::Status, >; + /// Server streaming response type for the Watch method. + type WatchStream: tonic::codegen::tokio_stream::Stream< + Item = std::result::Result, + > + + Send + + 'static; + /// Subscribes to a stream of key-value updates, with regex filtering on keys. + async fn watch( + &self, + request: tonic::Request, + ) -> std::result::Result, tonic::Status>; } #[derive(Debug)] pub struct QueryServiceServer { @@ -450,6 +587,53 @@ pub mod query_service_server { }; Box::pin(fut) } + "/penumbra.cnidarium.v1alpha1.QueryService/Watch" => { + #[allow(non_camel_case_types)] + struct WatchSvc(pub Arc); + impl< + T: QueryService, + > tonic::server::ServerStreamingService + for WatchSvc { + type Response = super::WatchResponse; + type ResponseStream = T::WatchStream; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + ::watch(&inner, request).await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = WatchSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.server_streaming(method, req).await; + Ok(res) + }; + Box::pin(fut) + } _ => { Box::pin(async move { Ok( diff --git a/crates/proto/src/gen/penumbra.cnidarium.v1alpha1.serde.rs b/crates/proto/src/gen/penumbra.cnidarium.v1alpha1.serde.rs index b762affecd..c3fb51ff5b 100644 --- a/crates/proto/src/gen/penumbra.cnidarium.v1alpha1.serde.rs +++ b/crates/proto/src/gen/penumbra.cnidarium.v1alpha1.serde.rs @@ -546,3 +546,502 @@ impl<'de> serde::Deserialize<'de> for PrefixValueResponse { deserializer.deserialize_struct("penumbra.cnidarium.v1alpha1.PrefixValueResponse", FIELDS, GeneratedVisitor) } } +impl serde::Serialize for WatchRequest { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let mut len = 0; + if !self.key_regex.is_empty() { + len += 1; + } + if !self.nv_key_regex.is_empty() { + len += 1; + } + let mut struct_ser = serializer.serialize_struct("penumbra.cnidarium.v1alpha1.WatchRequest", len)?; + if !self.key_regex.is_empty() { + struct_ser.serialize_field("keyRegex", &self.key_regex)?; + } + if !self.nv_key_regex.is_empty() { + struct_ser.serialize_field("nvKeyRegex", &self.nv_key_regex)?; + } + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for WatchRequest { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "key_regex", + "keyRegex", + "nv_key_regex", + "nvKeyRegex", + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + KeyRegex, + NvKeyRegex, + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "keyRegex" | "key_regex" => Ok(GeneratedField::KeyRegex), + "nvKeyRegex" | "nv_key_regex" => Ok(GeneratedField::NvKeyRegex), + _ => Err(serde::de::Error::unknown_field(value, FIELDS)), + } + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = WatchRequest; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct penumbra.cnidarium.v1alpha1.WatchRequest") + } + + fn visit_map(self, mut map_: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + let mut key_regex__ = None; + let mut nv_key_regex__ = None; + while let Some(k) = map_.next_key()? { + match k { + GeneratedField::KeyRegex => { + if key_regex__.is_some() { + return Err(serde::de::Error::duplicate_field("keyRegex")); + } + key_regex__ = Some(map_.next_value()?); + } + GeneratedField::NvKeyRegex => { + if nv_key_regex__.is_some() { + return Err(serde::de::Error::duplicate_field("nvKeyRegex")); + } + nv_key_regex__ = Some(map_.next_value()?); + } + } + } + Ok(WatchRequest { + key_regex: key_regex__.unwrap_or_default(), + nv_key_regex: nv_key_regex__.unwrap_or_default(), + }) + } + } + deserializer.deserialize_struct("penumbra.cnidarium.v1alpha1.WatchRequest", FIELDS, GeneratedVisitor) + } +} +impl serde::Serialize for WatchResponse { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let mut len = 0; + if self.version != 0 { + len += 1; + } + if self.entry.is_some() { + len += 1; + } + let mut struct_ser = serializer.serialize_struct("penumbra.cnidarium.v1alpha1.WatchResponse", len)?; + if self.version != 0 { + #[allow(clippy::needless_borrow)] + struct_ser.serialize_field("version", ToString::to_string(&self.version).as_str())?; + } + if let Some(v) = self.entry.as_ref() { + match v { + watch_response::Entry::Kv(v) => { + struct_ser.serialize_field("kv", v)?; + } + watch_response::Entry::NvKv(v) => { + struct_ser.serialize_field("nvKv", v)?; + } + } + } + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for WatchResponse { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "version", + "kv", + "nv_kv", + "nvKv", + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + Version, + Kv, + NvKv, + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "version" => Ok(GeneratedField::Version), + "kv" => Ok(GeneratedField::Kv), + "nvKv" | "nv_kv" => Ok(GeneratedField::NvKv), + _ => Err(serde::de::Error::unknown_field(value, FIELDS)), + } + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = WatchResponse; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct penumbra.cnidarium.v1alpha1.WatchResponse") + } + + fn visit_map(self, mut map_: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + let mut version__ = None; + let mut entry__ = None; + while let Some(k) = map_.next_key()? { + match k { + GeneratedField::Version => { + if version__.is_some() { + return Err(serde::de::Error::duplicate_field("version")); + } + version__ = + Some(map_.next_value::<::pbjson::private::NumberDeserialize<_>>()?.0) + ; + } + GeneratedField::Kv => { + if entry__.is_some() { + return Err(serde::de::Error::duplicate_field("kv")); + } + entry__ = map_.next_value::<::std::option::Option<_>>()?.map(watch_response::Entry::Kv) +; + } + GeneratedField::NvKv => { + if entry__.is_some() { + return Err(serde::de::Error::duplicate_field("nvKv")); + } + entry__ = map_.next_value::<::std::option::Option<_>>()?.map(watch_response::Entry::NvKv) +; + } + } + } + Ok(WatchResponse { + version: version__.unwrap_or_default(), + entry: entry__, + }) + } + } + deserializer.deserialize_struct("penumbra.cnidarium.v1alpha1.WatchResponse", FIELDS, GeneratedVisitor) + } +} +impl serde::Serialize for watch_response::KeyValue { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let mut len = 0; + if !self.key.is_empty() { + len += 1; + } + if !self.value.is_empty() { + len += 1; + } + if self.deleted { + len += 1; + } + let mut struct_ser = serializer.serialize_struct("penumbra.cnidarium.v1alpha1.WatchResponse.KeyValue", len)?; + if !self.key.is_empty() { + struct_ser.serialize_field("key", &self.key)?; + } + if !self.value.is_empty() { + #[allow(clippy::needless_borrow)] + struct_ser.serialize_field("value", pbjson::private::base64::encode(&self.value).as_str())?; + } + if self.deleted { + struct_ser.serialize_field("deleted", &self.deleted)?; + } + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for watch_response::KeyValue { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "key", + "value", + "deleted", + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + Key, + Value, + Deleted, + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "key" => Ok(GeneratedField::Key), + "value" => Ok(GeneratedField::Value), + "deleted" => Ok(GeneratedField::Deleted), + _ => Err(serde::de::Error::unknown_field(value, FIELDS)), + } + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = watch_response::KeyValue; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct penumbra.cnidarium.v1alpha1.WatchResponse.KeyValue") + } + + fn visit_map(self, mut map_: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + let mut key__ = None; + let mut value__ = None; + let mut deleted__ = None; + while let Some(k) = map_.next_key()? { + match k { + GeneratedField::Key => { + if key__.is_some() { + return Err(serde::de::Error::duplicate_field("key")); + } + key__ = Some(map_.next_value()?); + } + GeneratedField::Value => { + if value__.is_some() { + return Err(serde::de::Error::duplicate_field("value")); + } + value__ = + Some(map_.next_value::<::pbjson::private::BytesDeserialize<_>>()?.0) + ; + } + GeneratedField::Deleted => { + if deleted__.is_some() { + return Err(serde::de::Error::duplicate_field("deleted")); + } + deleted__ = Some(map_.next_value()?); + } + } + } + Ok(watch_response::KeyValue { + key: key__.unwrap_or_default(), + value: value__.unwrap_or_default(), + deleted: deleted__.unwrap_or_default(), + }) + } + } + deserializer.deserialize_struct("penumbra.cnidarium.v1alpha1.WatchResponse.KeyValue", FIELDS, GeneratedVisitor) + } +} +impl serde::Serialize for watch_response::NvKeyValue { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let mut len = 0; + if !self.key.is_empty() { + len += 1; + } + if !self.value.is_empty() { + len += 1; + } + if self.deleted { + len += 1; + } + let mut struct_ser = serializer.serialize_struct("penumbra.cnidarium.v1alpha1.WatchResponse.NvKeyValue", len)?; + if !self.key.is_empty() { + #[allow(clippy::needless_borrow)] + struct_ser.serialize_field("key", pbjson::private::base64::encode(&self.key).as_str())?; + } + if !self.value.is_empty() { + #[allow(clippy::needless_borrow)] + struct_ser.serialize_field("value", pbjson::private::base64::encode(&self.value).as_str())?; + } + if self.deleted { + struct_ser.serialize_field("deleted", &self.deleted)?; + } + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for watch_response::NvKeyValue { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "key", + "value", + "deleted", + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + Key, + Value, + Deleted, + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "key" => Ok(GeneratedField::Key), + "value" => Ok(GeneratedField::Value), + "deleted" => Ok(GeneratedField::Deleted), + _ => Err(serde::de::Error::unknown_field(value, FIELDS)), + } + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = watch_response::NvKeyValue; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct penumbra.cnidarium.v1alpha1.WatchResponse.NvKeyValue") + } + + fn visit_map(self, mut map_: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + let mut key__ = None; + let mut value__ = None; + let mut deleted__ = None; + while let Some(k) = map_.next_key()? { + match k { + GeneratedField::Key => { + if key__.is_some() { + return Err(serde::de::Error::duplicate_field("key")); + } + key__ = + Some(map_.next_value::<::pbjson::private::BytesDeserialize<_>>()?.0) + ; + } + GeneratedField::Value => { + if value__.is_some() { + return Err(serde::de::Error::duplicate_field("value")); + } + value__ = + Some(map_.next_value::<::pbjson::private::BytesDeserialize<_>>()?.0) + ; + } + GeneratedField::Deleted => { + if deleted__.is_some() { + return Err(serde::de::Error::duplicate_field("deleted")); + } + deleted__ = Some(map_.next_value()?); + } + } + } + Ok(watch_response::NvKeyValue { + key: key__.unwrap_or_default(), + value: value__.unwrap_or_default(), + deleted: deleted__.unwrap_or_default(), + }) + } + } + deserializer.deserialize_struct("penumbra.cnidarium.v1alpha1.WatchResponse.NvKeyValue", FIELDS, GeneratedVisitor) + } +} diff --git a/crates/proto/src/gen/penumbra.core.app.v1alpha1.rs b/crates/proto/src/gen/penumbra.core.app.v1alpha1.rs index 03b31b0207..e6a4771bc9 100644 --- a/crates/proto/src/gen/penumbra.core.app.v1alpha1.rs +++ b/crates/proto/src/gen/penumbra.core.app.v1alpha1.rs @@ -44,10 +44,10 @@ pub struct AppParameters { pub chain_params: ::core::option::Option< super::super::component::chain::v1alpha1::ChainParameters, >, - /// DAO module parameters. + /// Community Pool module parameters. #[prost(message, optional, tag = "2")] - pub dao_params: ::core::option::Option< - super::super::component::dao::v1alpha1::DaoParameters, + pub community_pool_params: ::core::option::Option< + super::super::component::community_pool::v1alpha1::CommunityPoolParameters, >, /// Governance module parameters. #[prost(message, optional, tag = "3")] @@ -162,10 +162,10 @@ pub struct GenesisContent { pub chain_content: ::core::option::Option< super::super::component::chain::v1alpha1::GenesisContent, >, - /// DAO module genesis state. + /// Community Pool module genesis state. #[prost(message, optional, tag = "6")] - pub dao_content: ::core::option::Option< - super::super::component::dao::v1alpha1::GenesisContent, + pub community_pool_content: ::core::option::Option< + super::super::component::community_pool::v1alpha1::GenesisContent, >, /// Fee module genesis state. #[prost(message, optional, tag = "7")] diff --git a/crates/proto/src/gen/penumbra.core.app.v1alpha1.serde.rs b/crates/proto/src/gen/penumbra.core.app.v1alpha1.serde.rs index e93121a00b..2a398eba80 100644 --- a/crates/proto/src/gen/penumbra.core.app.v1alpha1.serde.rs +++ b/crates/proto/src/gen/penumbra.core.app.v1alpha1.serde.rs @@ -9,7 +9,7 @@ impl serde::Serialize for AppParameters { if self.chain_params.is_some() { len += 1; } - if self.dao_params.is_some() { + if self.community_pool_params.is_some() { len += 1; } if self.governance_params.is_some() { @@ -31,8 +31,8 @@ impl serde::Serialize for AppParameters { if let Some(v) = self.chain_params.as_ref() { struct_ser.serialize_field("chainParams", v)?; } - if let Some(v) = self.dao_params.as_ref() { - struct_ser.serialize_field("daoParams", v)?; + if let Some(v) = self.community_pool_params.as_ref() { + struct_ser.serialize_field("communityPoolParams", v)?; } if let Some(v) = self.governance_params.as_ref() { struct_ser.serialize_field("governanceParams", v)?; @@ -61,8 +61,8 @@ impl<'de> serde::Deserialize<'de> for AppParameters { const FIELDS: &[&str] = &[ "chain_params", "chainParams", - "dao_params", - "daoParams", + "community_pool_params", + "communityPoolParams", "governance_params", "governanceParams", "ibc_params", @@ -78,7 +78,7 @@ impl<'de> serde::Deserialize<'de> for AppParameters { #[allow(clippy::enum_variant_names)] enum GeneratedField { ChainParams, - DaoParams, + CommunityPoolParams, GovernanceParams, IbcParams, StakeParams, @@ -106,7 +106,7 @@ impl<'de> serde::Deserialize<'de> for AppParameters { { match value { "chainParams" | "chain_params" => Ok(GeneratedField::ChainParams), - "daoParams" | "dao_params" => Ok(GeneratedField::DaoParams), + "communityPoolParams" | "community_pool_params" => Ok(GeneratedField::CommunityPoolParams), "governanceParams" | "governance_params" => Ok(GeneratedField::GovernanceParams), "ibcParams" | "ibc_params" => Ok(GeneratedField::IbcParams), "stakeParams" | "stake_params" => Ok(GeneratedField::StakeParams), @@ -132,7 +132,7 @@ impl<'de> serde::Deserialize<'de> for AppParameters { V: serde::de::MapAccess<'de>, { let mut chain_params__ = None; - let mut dao_params__ = None; + let mut community_pool_params__ = None; let mut governance_params__ = None; let mut ibc_params__ = None; let mut stake_params__ = None; @@ -146,11 +146,11 @@ impl<'de> serde::Deserialize<'de> for AppParameters { } chain_params__ = map_.next_value()?; } - GeneratedField::DaoParams => { - if dao_params__.is_some() { - return Err(serde::de::Error::duplicate_field("daoParams")); + GeneratedField::CommunityPoolParams => { + if community_pool_params__.is_some() { + return Err(serde::de::Error::duplicate_field("communityPoolParams")); } - dao_params__ = map_.next_value()?; + community_pool_params__ = map_.next_value()?; } GeneratedField::GovernanceParams => { if governance_params__.is_some() { @@ -186,7 +186,7 @@ impl<'de> serde::Deserialize<'de> for AppParameters { } Ok(AppParameters { chain_params: chain_params__, - dao_params: dao_params__, + community_pool_params: community_pool_params__, governance_params: governance_params__, ibc_params: ibc_params__, stake_params: stake_params__, @@ -516,7 +516,7 @@ impl serde::Serialize for GenesisContent { if self.chain_content.is_some() { len += 1; } - if self.dao_content.is_some() { + if self.community_pool_content.is_some() { len += 1; } if self.fee_content.is_some() { @@ -541,8 +541,8 @@ impl serde::Serialize for GenesisContent { if let Some(v) = self.chain_content.as_ref() { struct_ser.serialize_field("chainContent", v)?; } - if let Some(v) = self.dao_content.as_ref() { - struct_ser.serialize_field("daoContent", v)?; + if let Some(v) = self.community_pool_content.as_ref() { + struct_ser.serialize_field("communityPoolContent", v)?; } if let Some(v) = self.fee_content.as_ref() { struct_ser.serialize_field("feeContent", v)?; @@ -570,8 +570,8 @@ impl<'de> serde::Deserialize<'de> for GenesisContent { "ibcContent", "chain_content", "chainContent", - "dao_content", - "daoContent", + "community_pool_content", + "communityPoolContent", "fee_content", "feeContent", "distributions_content", @@ -585,7 +585,7 @@ impl<'de> serde::Deserialize<'de> for GenesisContent { GovernanceContent, IbcContent, ChainContent, - DaoContent, + CommunityPoolContent, FeeContent, DistributionsContent, } @@ -614,7 +614,7 @@ impl<'de> serde::Deserialize<'de> for GenesisContent { "governanceContent" | "governance_content" => Ok(GeneratedField::GovernanceContent), "ibcContent" | "ibc_content" => Ok(GeneratedField::IbcContent), "chainContent" | "chain_content" => Ok(GeneratedField::ChainContent), - "daoContent" | "dao_content" => Ok(GeneratedField::DaoContent), + "communityPoolContent" | "community_pool_content" => Ok(GeneratedField::CommunityPoolContent), "feeContent" | "fee_content" => Ok(GeneratedField::FeeContent), "distributionsContent" | "distributions_content" => Ok(GeneratedField::DistributionsContent), _ => Err(serde::de::Error::unknown_field(value, FIELDS)), @@ -641,7 +641,7 @@ impl<'de> serde::Deserialize<'de> for GenesisContent { let mut governance_content__ = None; let mut ibc_content__ = None; let mut chain_content__ = None; - let mut dao_content__ = None; + let mut community_pool_content__ = None; let mut fee_content__ = None; let mut distributions_content__ = None; while let Some(k) = map_.next_key()? { @@ -676,11 +676,11 @@ impl<'de> serde::Deserialize<'de> for GenesisContent { } chain_content__ = map_.next_value()?; } - GeneratedField::DaoContent => { - if dao_content__.is_some() { - return Err(serde::de::Error::duplicate_field("daoContent")); + GeneratedField::CommunityPoolContent => { + if community_pool_content__.is_some() { + return Err(serde::de::Error::duplicate_field("communityPoolContent")); } - dao_content__ = map_.next_value()?; + community_pool_content__ = map_.next_value()?; } GeneratedField::FeeContent => { if fee_content__.is_some() { @@ -702,7 +702,7 @@ impl<'de> serde::Deserialize<'de> for GenesisContent { governance_content: governance_content__, ibc_content: ibc_content__, chain_content: chain_content__, - dao_content: dao_content__, + community_pool_content: community_pool_content__, fee_content: fee_content__, distributions_content: distributions_content__, }) diff --git a/crates/proto/src/gen/penumbra.core.component.dao.v1alpha1.rs b/crates/proto/src/gen/penumbra.core.component.community_pool.v1alpha1.rs similarity index 76% rename from crates/proto/src/gen/penumbra.core.component.dao.v1alpha1.rs rename to crates/proto/src/gen/penumbra.core.component.community_pool.v1alpha1.rs index 440b8143cd..6d1d8b104f 100644 --- a/crates/proto/src/gen/penumbra.core.component.dao.v1alpha1.rs +++ b/crates/proto/src/gen/penumbra.core.component.community_pool.v1alpha1.rs @@ -1,37 +1,41 @@ -/// Dao parameter data. +/// CommunityPool parameter data. #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] -pub struct DaoParameters { - /// Whether DAO spend proposals are enabled. +pub struct CommunityPoolParameters { + /// Whether Community Pool spend proposals are enabled. #[prost(bool, tag = "1")] - pub dao_spend_proposals_enabled: bool, + pub community_pool_spend_proposals_enabled: bool, } -impl ::prost::Name for DaoParameters { - const NAME: &'static str = "DaoParameters"; - const PACKAGE: &'static str = "penumbra.core.component.dao.v1alpha1"; +impl ::prost::Name for CommunityPoolParameters { + const NAME: &'static str = "CommunityPoolParameters"; + const PACKAGE: &'static str = "penumbra.core.component.community_pool.v1alpha1"; fn full_name() -> ::prost::alloc::string::String { - ::prost::alloc::format!("penumbra.core.component.dao.v1alpha1.{}", Self::NAME) + ::prost::alloc::format!( + "penumbra.core.component.community_pool.v1alpha1.{}", Self::NAME + ) } } -/// Dao genesis state. +/// CommunityPool genesis state. #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct GenesisContent { - /// Dao parameters. + /// CommunityPool parameters. #[prost(message, optional, tag = "1")] - pub dao_params: ::core::option::Option, + pub community_pool_params: ::core::option::Option, } impl ::prost::Name for GenesisContent { const NAME: &'static str = "GenesisContent"; - const PACKAGE: &'static str = "penumbra.core.component.dao.v1alpha1"; + const PACKAGE: &'static str = "penumbra.core.component.community_pool.v1alpha1"; fn full_name() -> ::prost::alloc::string::String { - ::prost::alloc::format!("penumbra.core.component.dao.v1alpha1.{}", Self::NAME) + ::prost::alloc::format!( + "penumbra.core.component.community_pool.v1alpha1.{}", Self::NAME + ) } } -/// Requests the list of all asset balances associated with the DAO. +/// Requests the list of all asset balances associated with the Community Pool. #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] -pub struct DaoAssetBalancesRequest { +pub struct CommunityPoolAssetBalancesRequest { /// The expected chain id (empty string if no expectation). #[prost(string, tag = "1")] pub chain_id: ::prost::alloc::string::String, @@ -41,26 +45,30 @@ pub struct DaoAssetBalancesRequest { super::super::super::asset::v1alpha1::AssetId, >, } -impl ::prost::Name for DaoAssetBalancesRequest { - const NAME: &'static str = "DaoAssetBalancesRequest"; - const PACKAGE: &'static str = "penumbra.core.component.dao.v1alpha1"; +impl ::prost::Name for CommunityPoolAssetBalancesRequest { + const NAME: &'static str = "CommunityPoolAssetBalancesRequest"; + const PACKAGE: &'static str = "penumbra.core.component.community_pool.v1alpha1"; fn full_name() -> ::prost::alloc::string::String { - ::prost::alloc::format!("penumbra.core.component.dao.v1alpha1.{}", Self::NAME) + ::prost::alloc::format!( + "penumbra.core.component.community_pool.v1alpha1.{}", Self::NAME + ) } } -/// The DAO's balance of a single asset. +/// The Community Pool's balance of a single asset. #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] -pub struct DaoAssetBalancesResponse { +pub struct CommunityPoolAssetBalancesResponse { /// The balance for a single asset. #[prost(message, optional, tag = "1")] pub balance: ::core::option::Option, } -impl ::prost::Name for DaoAssetBalancesResponse { - const NAME: &'static str = "DaoAssetBalancesResponse"; - const PACKAGE: &'static str = "penumbra.core.component.dao.v1alpha1"; +impl ::prost::Name for CommunityPoolAssetBalancesResponse { + const NAME: &'static str = "CommunityPoolAssetBalancesResponse"; + const PACKAGE: &'static str = "penumbra.core.component.community_pool.v1alpha1"; fn full_name() -> ::prost::alloc::string::String { - ::prost::alloc::format!("penumbra.core.component.dao.v1alpha1.{}", Self::NAME) + ::prost::alloc::format!( + "penumbra.core.component.community_pool.v1alpha1.{}", Self::NAME + ) } } /// Generated client implementations. @@ -69,7 +77,7 @@ pub mod query_service_client { #![allow(unused_variables, dead_code, missing_docs, clippy::let_unit_value)] use tonic::codegen::*; use tonic::codegen::http::Uri; - /// Query operations for the dao component. + /// Query operations for the community_pool component. #[derive(Debug, Clone)] pub struct QueryServiceClient { inner: tonic::client::Grpc, @@ -150,11 +158,13 @@ pub mod query_service_client { self.inner = self.inner.max_encoding_message_size(limit); self } - pub async fn dao_asset_balances( + pub async fn community_pool_asset_balances( &mut self, - request: impl tonic::IntoRequest, + request: impl tonic::IntoRequest, ) -> std::result::Result< - tonic::Response>, + tonic::Response< + tonic::codec::Streaming, + >, tonic::Status, > { self.inner @@ -168,14 +178,14 @@ pub mod query_service_client { })?; let codec = tonic::codec::ProstCodec::default(); let path = http::uri::PathAndQuery::from_static( - "/penumbra.core.component.dao.v1alpha1.QueryService/DaoAssetBalances", + "/penumbra.core.component.community_pool.v1alpha1.QueryService/CommunityPoolAssetBalances", ); let mut req = request.into_request(); req.extensions_mut() .insert( GrpcMethod::new( - "penumbra.core.component.dao.v1alpha1.QueryService", - "DaoAssetBalances", + "penumbra.core.component.community_pool.v1alpha1.QueryService", + "CommunityPoolAssetBalances", ), ); self.inner.server_streaming(req, path, codec).await @@ -190,24 +200,24 @@ pub mod query_service_server { /// Generated trait containing gRPC methods that should be implemented for use with QueryServiceServer. #[async_trait] pub trait QueryService: Send + Sync + 'static { - /// Server streaming response type for the DaoAssetBalances method. - type DaoAssetBalancesStream: tonic::codegen::tokio_stream::Stream< + /// Server streaming response type for the CommunityPoolAssetBalances method. + type CommunityPoolAssetBalancesStream: tonic::codegen::tokio_stream::Stream< Item = std::result::Result< - super::DaoAssetBalancesResponse, + super::CommunityPoolAssetBalancesResponse, tonic::Status, >, > + Send + 'static; - async fn dao_asset_balances( + async fn community_pool_asset_balances( &self, - request: tonic::Request, + request: tonic::Request, ) -> std::result::Result< - tonic::Response, + tonic::Response, tonic::Status, >; } - /// Query operations for the dao component. + /// Query operations for the community_pool component. #[derive(Debug)] pub struct QueryServiceServer { inner: _Inner, @@ -287,27 +297,32 @@ pub mod query_service_server { fn call(&mut self, req: http::Request) -> Self::Future { let inner = self.inner.clone(); match req.uri().path() { - "/penumbra.core.component.dao.v1alpha1.QueryService/DaoAssetBalances" => { + "/penumbra.core.component.community_pool.v1alpha1.QueryService/CommunityPoolAssetBalances" => { #[allow(non_camel_case_types)] - struct DaoAssetBalancesSvc(pub Arc); + struct CommunityPoolAssetBalancesSvc(pub Arc); impl< T: QueryService, > tonic::server::ServerStreamingService< - super::DaoAssetBalancesRequest, - > for DaoAssetBalancesSvc { - type Response = super::DaoAssetBalancesResponse; - type ResponseStream = T::DaoAssetBalancesStream; + super::CommunityPoolAssetBalancesRequest, + > for CommunityPoolAssetBalancesSvc { + type Response = super::CommunityPoolAssetBalancesResponse; + type ResponseStream = T::CommunityPoolAssetBalancesStream; type Future = BoxFuture< tonic::Response, tonic::Status, >; fn call( &mut self, - request: tonic::Request, + request: tonic::Request< + super::CommunityPoolAssetBalancesRequest, + >, ) -> Self::Future { let inner = Arc::clone(&self.0); let fut = async move { - ::dao_asset_balances(&inner, request) + ::community_pool_asset_balances( + &inner, + request, + ) .await }; Box::pin(fut) @@ -320,7 +335,7 @@ pub mod query_service_server { let inner = self.inner.clone(); let fut = async move { let inner = inner.0; - let method = DaoAssetBalancesSvc(inner); + let method = CommunityPoolAssetBalancesSvc(inner); let codec = tonic::codec::ProstCodec::default(); let mut grpc = tonic::server::Grpc::new(codec) .apply_compression_config( @@ -374,6 +389,6 @@ pub mod query_service_server { } } impl tonic::server::NamedService for QueryServiceServer { - const NAME: &'static str = "penumbra.core.component.dao.v1alpha1.QueryService"; + const NAME: &'static str = "penumbra.core.component.community_pool.v1alpha1.QueryService"; } } diff --git a/crates/proto/src/gen/penumbra.core.component.dao.v1alpha1.serde.rs b/crates/proto/src/gen/penumbra.core.component.community_pool.v1alpha1.serde.rs similarity index 77% rename from crates/proto/src/gen/penumbra.core.component.dao.v1alpha1.serde.rs rename to crates/proto/src/gen/penumbra.core.component.community_pool.v1alpha1.serde.rs index ca0ba6c6a3..7992a7731f 100644 --- a/crates/proto/src/gen/penumbra.core.component.dao.v1alpha1.serde.rs +++ b/crates/proto/src/gen/penumbra.core.component.community_pool.v1alpha1.serde.rs @@ -1,4 +1,4 @@ -impl serde::Serialize for DaoAssetBalancesRequest { +impl serde::Serialize for CommunityPoolAssetBalancesRequest { #[allow(deprecated)] fn serialize(&self, serializer: S) -> std::result::Result where @@ -12,7 +12,7 @@ impl serde::Serialize for DaoAssetBalancesRequest { if !self.asset_ids.is_empty() { len += 1; } - let mut struct_ser = serializer.serialize_struct("penumbra.core.component.dao.v1alpha1.DaoAssetBalancesRequest", len)?; + let mut struct_ser = serializer.serialize_struct("penumbra.core.component.community_pool.v1alpha1.CommunityPoolAssetBalancesRequest", len)?; if !self.chain_id.is_empty() { struct_ser.serialize_field("chainId", &self.chain_id)?; } @@ -22,7 +22,7 @@ impl serde::Serialize for DaoAssetBalancesRequest { struct_ser.end() } } -impl<'de> serde::Deserialize<'de> for DaoAssetBalancesRequest { +impl<'de> serde::Deserialize<'de> for CommunityPoolAssetBalancesRequest { #[allow(deprecated)] fn deserialize(deserializer: D) -> std::result::Result where @@ -71,13 +71,13 @@ impl<'de> serde::Deserialize<'de> for DaoAssetBalancesRequest { } struct GeneratedVisitor; impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { - type Value = DaoAssetBalancesRequest; + type Value = CommunityPoolAssetBalancesRequest; fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - formatter.write_str("struct penumbra.core.component.dao.v1alpha1.DaoAssetBalancesRequest") + formatter.write_str("struct penumbra.core.component.community_pool.v1alpha1.CommunityPoolAssetBalancesRequest") } - fn visit_map(self, mut map_: V) -> std::result::Result + fn visit_map(self, mut map_: V) -> std::result::Result where V: serde::de::MapAccess<'de>, { @@ -99,16 +99,16 @@ impl<'de> serde::Deserialize<'de> for DaoAssetBalancesRequest { } } } - Ok(DaoAssetBalancesRequest { + Ok(CommunityPoolAssetBalancesRequest { chain_id: chain_id__.unwrap_or_default(), asset_ids: asset_ids__.unwrap_or_default(), }) } } - deserializer.deserialize_struct("penumbra.core.component.dao.v1alpha1.DaoAssetBalancesRequest", FIELDS, GeneratedVisitor) + deserializer.deserialize_struct("penumbra.core.component.community_pool.v1alpha1.CommunityPoolAssetBalancesRequest", FIELDS, GeneratedVisitor) } } -impl serde::Serialize for DaoAssetBalancesResponse { +impl serde::Serialize for CommunityPoolAssetBalancesResponse { #[allow(deprecated)] fn serialize(&self, serializer: S) -> std::result::Result where @@ -119,14 +119,14 @@ impl serde::Serialize for DaoAssetBalancesResponse { if self.balance.is_some() { len += 1; } - let mut struct_ser = serializer.serialize_struct("penumbra.core.component.dao.v1alpha1.DaoAssetBalancesResponse", len)?; + let mut struct_ser = serializer.serialize_struct("penumbra.core.component.community_pool.v1alpha1.CommunityPoolAssetBalancesResponse", len)?; if let Some(v) = self.balance.as_ref() { struct_ser.serialize_field("balance", v)?; } struct_ser.end() } } -impl<'de> serde::Deserialize<'de> for DaoAssetBalancesResponse { +impl<'de> serde::Deserialize<'de> for CommunityPoolAssetBalancesResponse { #[allow(deprecated)] fn deserialize(deserializer: D) -> std::result::Result where @@ -170,13 +170,13 @@ impl<'de> serde::Deserialize<'de> for DaoAssetBalancesResponse { } struct GeneratedVisitor; impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { - type Value = DaoAssetBalancesResponse; + type Value = CommunityPoolAssetBalancesResponse; fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - formatter.write_str("struct penumbra.core.component.dao.v1alpha1.DaoAssetBalancesResponse") + formatter.write_str("struct penumbra.core.component.community_pool.v1alpha1.CommunityPoolAssetBalancesResponse") } - fn visit_map(self, mut map_: V) -> std::result::Result + fn visit_map(self, mut map_: V) -> std::result::Result where V: serde::de::MapAccess<'de>, { @@ -191,15 +191,15 @@ impl<'de> serde::Deserialize<'de> for DaoAssetBalancesResponse { } } } - Ok(DaoAssetBalancesResponse { + Ok(CommunityPoolAssetBalancesResponse { balance: balance__, }) } } - deserializer.deserialize_struct("penumbra.core.component.dao.v1alpha1.DaoAssetBalancesResponse", FIELDS, GeneratedVisitor) + deserializer.deserialize_struct("penumbra.core.component.community_pool.v1alpha1.CommunityPoolAssetBalancesResponse", FIELDS, GeneratedVisitor) } } -impl serde::Serialize for DaoParameters { +impl serde::Serialize for CommunityPoolParameters { #[allow(deprecated)] fn serialize(&self, serializer: S) -> std::result::Result where @@ -207,30 +207,30 @@ impl serde::Serialize for DaoParameters { { use serde::ser::SerializeStruct; let mut len = 0; - if self.dao_spend_proposals_enabled { + if self.community_pool_spend_proposals_enabled { len += 1; } - let mut struct_ser = serializer.serialize_struct("penumbra.core.component.dao.v1alpha1.DaoParameters", len)?; - if self.dao_spend_proposals_enabled { - struct_ser.serialize_field("daoSpendProposalsEnabled", &self.dao_spend_proposals_enabled)?; + let mut struct_ser = serializer.serialize_struct("penumbra.core.component.community_pool.v1alpha1.CommunityPoolParameters", len)?; + if self.community_pool_spend_proposals_enabled { + struct_ser.serialize_field("communityPoolSpendProposalsEnabled", &self.community_pool_spend_proposals_enabled)?; } struct_ser.end() } } -impl<'de> serde::Deserialize<'de> for DaoParameters { +impl<'de> serde::Deserialize<'de> for CommunityPoolParameters { #[allow(deprecated)] fn deserialize(deserializer: D) -> std::result::Result where D: serde::Deserializer<'de>, { const FIELDS: &[&str] = &[ - "dao_spend_proposals_enabled", - "daoSpendProposalsEnabled", + "community_pool_spend_proposals_enabled", + "communityPoolSpendProposalsEnabled", ]; #[allow(clippy::enum_variant_names)] enum GeneratedField { - DaoSpendProposalsEnabled, + CommunityPoolSpendProposalsEnabled, } impl<'de> serde::Deserialize<'de> for GeneratedField { fn deserialize(deserializer: D) -> std::result::Result @@ -252,7 +252,7 @@ impl<'de> serde::Deserialize<'de> for DaoParameters { E: serde::de::Error, { match value { - "daoSpendProposalsEnabled" | "dao_spend_proposals_enabled" => Ok(GeneratedField::DaoSpendProposalsEnabled), + "communityPoolSpendProposalsEnabled" | "community_pool_spend_proposals_enabled" => Ok(GeneratedField::CommunityPoolSpendProposalsEnabled), _ => Err(serde::de::Error::unknown_field(value, FIELDS)), } } @@ -262,33 +262,33 @@ impl<'de> serde::Deserialize<'de> for DaoParameters { } struct GeneratedVisitor; impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { - type Value = DaoParameters; + type Value = CommunityPoolParameters; fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - formatter.write_str("struct penumbra.core.component.dao.v1alpha1.DaoParameters") + formatter.write_str("struct penumbra.core.component.community_pool.v1alpha1.CommunityPoolParameters") } - fn visit_map(self, mut map_: V) -> std::result::Result + fn visit_map(self, mut map_: V) -> std::result::Result where V: serde::de::MapAccess<'de>, { - let mut dao_spend_proposals_enabled__ = None; + let mut community_pool_spend_proposals_enabled__ = None; while let Some(k) = map_.next_key()? { match k { - GeneratedField::DaoSpendProposalsEnabled => { - if dao_spend_proposals_enabled__.is_some() { - return Err(serde::de::Error::duplicate_field("daoSpendProposalsEnabled")); + GeneratedField::CommunityPoolSpendProposalsEnabled => { + if community_pool_spend_proposals_enabled__.is_some() { + return Err(serde::de::Error::duplicate_field("communityPoolSpendProposalsEnabled")); } - dao_spend_proposals_enabled__ = Some(map_.next_value()?); + community_pool_spend_proposals_enabled__ = Some(map_.next_value()?); } } } - Ok(DaoParameters { - dao_spend_proposals_enabled: dao_spend_proposals_enabled__.unwrap_or_default(), + Ok(CommunityPoolParameters { + community_pool_spend_proposals_enabled: community_pool_spend_proposals_enabled__.unwrap_or_default(), }) } } - deserializer.deserialize_struct("penumbra.core.component.dao.v1alpha1.DaoParameters", FIELDS, GeneratedVisitor) + deserializer.deserialize_struct("penumbra.core.component.community_pool.v1alpha1.CommunityPoolParameters", FIELDS, GeneratedVisitor) } } impl serde::Serialize for GenesisContent { @@ -299,12 +299,12 @@ impl serde::Serialize for GenesisContent { { use serde::ser::SerializeStruct; let mut len = 0; - if self.dao_params.is_some() { + if self.community_pool_params.is_some() { len += 1; } - let mut struct_ser = serializer.serialize_struct("penumbra.core.component.dao.v1alpha1.GenesisContent", len)?; - if let Some(v) = self.dao_params.as_ref() { - struct_ser.serialize_field("daoParams", v)?; + let mut struct_ser = serializer.serialize_struct("penumbra.core.component.community_pool.v1alpha1.GenesisContent", len)?; + if let Some(v) = self.community_pool_params.as_ref() { + struct_ser.serialize_field("communityPoolParams", v)?; } struct_ser.end() } @@ -316,13 +316,13 @@ impl<'de> serde::Deserialize<'de> for GenesisContent { D: serde::Deserializer<'de>, { const FIELDS: &[&str] = &[ - "dao_params", - "daoParams", + "community_pool_params", + "communityPoolParams", ]; #[allow(clippy::enum_variant_names)] enum GeneratedField { - DaoParams, + CommunityPoolParams, } impl<'de> serde::Deserialize<'de> for GeneratedField { fn deserialize(deserializer: D) -> std::result::Result @@ -344,7 +344,7 @@ impl<'de> serde::Deserialize<'de> for GenesisContent { E: serde::de::Error, { match value { - "daoParams" | "dao_params" => Ok(GeneratedField::DaoParams), + "communityPoolParams" | "community_pool_params" => Ok(GeneratedField::CommunityPoolParams), _ => Err(serde::de::Error::unknown_field(value, FIELDS)), } } @@ -357,29 +357,29 @@ impl<'de> serde::Deserialize<'de> for GenesisContent { type Value = GenesisContent; fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - formatter.write_str("struct penumbra.core.component.dao.v1alpha1.GenesisContent") + formatter.write_str("struct penumbra.core.component.community_pool.v1alpha1.GenesisContent") } fn visit_map(self, mut map_: V) -> std::result::Result where V: serde::de::MapAccess<'de>, { - let mut dao_params__ = None; + let mut community_pool_params__ = None; while let Some(k) = map_.next_key()? { match k { - GeneratedField::DaoParams => { - if dao_params__.is_some() { - return Err(serde::de::Error::duplicate_field("daoParams")); + GeneratedField::CommunityPoolParams => { + if community_pool_params__.is_some() { + return Err(serde::de::Error::duplicate_field("communityPoolParams")); } - dao_params__ = map_.next_value()?; + community_pool_params__ = map_.next_value()?; } } } Ok(GenesisContent { - dao_params: dao_params__, + community_pool_params: community_pool_params__, }) } } - deserializer.deserialize_struct("penumbra.core.component.dao.v1alpha1.GenesisContent", FIELDS, GeneratedVisitor) + deserializer.deserialize_struct("penumbra.core.component.community_pool.v1alpha1.GenesisContent", FIELDS, GeneratedVisitor) } } diff --git a/crates/proto/src/gen/penumbra.core.component.governance.v1alpha1.rs b/crates/proto/src/gen/penumbra.core.component.governance.v1alpha1.rs index 6c9cfbf74e..9d7b0727e2 100644 --- a/crates/proto/src/gen/penumbra.core.component.governance.v1alpha1.rs +++ b/crates/proto/src/gen/penumbra.core.component.governance.v1alpha1.rs @@ -191,11 +191,13 @@ pub struct DelegatorVoteBody { super::super::super::num::v1alpha1::Amount, >, /// The nullifier of the input note. - #[prost(bytes = "vec", tag = "6")] - pub nullifier: ::prost::alloc::vec::Vec, + #[prost(message, optional, tag = "6")] + pub nullifier: ::core::option::Option, /// The randomized validating key for the spend authorization signature. - #[prost(bytes = "vec", tag = "7")] - pub rk: ::prost::alloc::vec::Vec, + #[prost(message, optional, tag = "7")] + pub rk: ::core::option::Option< + super::super::super::super::crypto::decaf377_rdsa::v1alpha1::SpendVerificationKey, + >, } impl ::prost::Name for DelegatorVoteBody { const NAME: &'static str = "DelegatorVoteBody"; @@ -312,13 +314,13 @@ impl ::prost::Name for DelegatorVotePlan { } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] -pub struct DaoDeposit { - /// The value to deposit into the DAO. +pub struct CommunityPoolDeposit { + /// The value to deposit into the Community Pool. #[prost(message, optional, tag = "1")] pub value: ::core::option::Option, } -impl ::prost::Name for DaoDeposit { - const NAME: &'static str = "DaoDeposit"; +impl ::prost::Name for CommunityPoolDeposit { + const NAME: &'static str = "CommunityPoolDeposit"; const PACKAGE: &'static str = "penumbra.core.component.governance.v1alpha1"; fn full_name() -> ::prost::alloc::string::String { ::prost::alloc::format!( @@ -328,13 +330,13 @@ impl ::prost::Name for DaoDeposit { } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] -pub struct DaoSpend { - /// The value to spend from the DAO. +pub struct CommunityPoolSpend { + /// The value to spend from the Community Pool. #[prost(message, optional, tag = "1")] pub value: ::core::option::Option, } -impl ::prost::Name for DaoSpend { - const NAME: &'static str = "DaoSpend"; +impl ::prost::Name for CommunityPoolSpend { + const NAME: &'static str = "CommunityPoolSpend"; const PACKAGE: &'static str = "penumbra.core.component.governance.v1alpha1"; fn full_name() -> ::prost::alloc::string::String { ::prost::alloc::format!( @@ -344,16 +346,16 @@ impl ::prost::Name for DaoSpend { } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] -pub struct DaoOutput { - /// The value to output from the DAO. +pub struct CommunityPoolOutput { + /// The value to output from the Community Pool. #[prost(message, optional, tag = "1")] pub value: ::core::option::Option, /// The address to send the output to. #[prost(message, optional, tag = "2")] pub address: ::core::option::Option, } -impl ::prost::Name for DaoOutput { - const NAME: &'static str = "DaoOutput"; +impl ::prost::Name for CommunityPoolOutput { + const NAME: &'static str = "CommunityPoolOutput"; const PACKAGE: &'static str = "penumbra.core.component.governance.v1alpha1"; fn full_name() -> ::prost::alloc::string::String { ::prost::alloc::format!( @@ -664,9 +666,13 @@ pub struct Proposal { #[prost(message, optional, tag = "7")] pub parameter_change: ::core::option::Option, #[prost(message, optional, tag = "8")] - pub dao_spend: ::core::option::Option, + pub community_pool_spend: ::core::option::Option, #[prost(message, optional, tag = "9")] pub upgrade_plan: ::core::option::Option, + #[prost(message, optional, tag = "10")] + pub freeze_ibc_client: ::core::option::Option, + #[prost(message, optional, tag = "11")] + pub unfreeze_ibc_client: ::core::option::Option, } /// Nested message and enum types in `Proposal`. pub mod proposal { @@ -736,20 +742,20 @@ pub mod proposal { ) } } - /// A DAO spend proposal describes zero or more transactions to execute on behalf of the DAO, with + /// A Community Pool spend proposal describes zero or more transactions to execute on behalf of the Community Pool, with /// access to its funds, and zero or more scheduled transactions from previous passed proposals to /// cancel. #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] - pub struct DaoSpend { + pub struct CommunityPoolSpend { /// The transaction plan to be executed at the time the proposal is passed. This must be a - /// transaction plan which can be executed by the DAO, which means it can't require any witness - /// data or authorization signatures, but it may use the `DaoSpend` action. + /// transaction plan which can be executed by the Community Pool, which means it can't require any witness + /// data or authorization signatures, but it may use the `CommunityPoolSpend` action. #[prost(message, optional, tag = "2")] pub transaction_plan: ::core::option::Option<::pbjson_types::Any>, } - impl ::prost::Name for DaoSpend { - const NAME: &'static str = "DaoSpend"; + impl ::prost::Name for CommunityPoolSpend { + const NAME: &'static str = "CommunityPoolSpend"; const PACKAGE: &'static str = "penumbra.core.component.governance.v1alpha1"; fn full_name() -> ::prost::alloc::string::String { ::prost::alloc::format!( @@ -774,6 +780,38 @@ pub mod proposal { ) } } + /// Freeze an existing IBC client. + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct FreezeIbcClient { + #[prost(string, tag = "1")] + pub client_id: ::prost::alloc::string::String, + } + impl ::prost::Name for FreezeIbcClient { + const NAME: &'static str = "FreezeIbcClient"; + const PACKAGE: &'static str = "penumbra.core.component.governance.v1alpha1"; + fn full_name() -> ::prost::alloc::string::String { + ::prost::alloc::format!( + "penumbra.core.component.governance.v1alpha1.Proposal.{}", Self::NAME + ) + } + } + /// Unfreeze an existing IBC client. + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct UnfreezeIbcClient { + #[prost(string, tag = "1")] + pub client_id: ::prost::alloc::string::String, + } + impl ::prost::Name for UnfreezeIbcClient { + const NAME: &'static str = "UnfreezeIbcClient"; + const PACKAGE: &'static str = "penumbra.core.component.governance.v1alpha1"; + fn full_name() -> ::prost::alloc::string::String { + ::prost::alloc::format!( + "penumbra.core.component.governance.v1alpha1.Proposal.{}", Self::NAME + ) + } + } } impl ::prost::Name for Proposal { const NAME: &'static str = "Proposal"; @@ -1063,9 +1101,11 @@ pub struct ChangedAppParameters { pub chain_params: ::core::option::Option< super::super::chain::v1alpha1::ChainParameters, >, - /// DAO module parameters. + /// Community Pool module parameters. #[prost(message, optional, tag = "2")] - pub dao_params: ::core::option::Option, + pub community_pool_params: ::core::option::Option< + super::super::community_pool::v1alpha1::CommunityPoolParameters, + >, /// Governance module parameters. #[prost(message, optional, tag = "3")] pub governance_params: ::core::option::Option, diff --git a/crates/proto/src/gen/penumbra.core.component.governance.v1alpha1.serde.rs b/crates/proto/src/gen/penumbra.core.component.governance.v1alpha1.serde.rs index 7eb7eb4786..8051845ee9 100644 --- a/crates/proto/src/gen/penumbra.core.component.governance.v1alpha1.serde.rs +++ b/crates/proto/src/gen/penumbra.core.component.governance.v1alpha1.serde.rs @@ -231,7 +231,7 @@ impl serde::Serialize for ChangedAppParameters { if self.chain_params.is_some() { len += 1; } - if self.dao_params.is_some() { + if self.community_pool_params.is_some() { len += 1; } if self.governance_params.is_some() { @@ -253,8 +253,8 @@ impl serde::Serialize for ChangedAppParameters { if let Some(v) = self.chain_params.as_ref() { struct_ser.serialize_field("chainParams", v)?; } - if let Some(v) = self.dao_params.as_ref() { - struct_ser.serialize_field("daoParams", v)?; + if let Some(v) = self.community_pool_params.as_ref() { + struct_ser.serialize_field("communityPoolParams", v)?; } if let Some(v) = self.governance_params.as_ref() { struct_ser.serialize_field("governanceParams", v)?; @@ -283,8 +283,8 @@ impl<'de> serde::Deserialize<'de> for ChangedAppParameters { const FIELDS: &[&str] = &[ "chain_params", "chainParams", - "dao_params", - "daoParams", + "community_pool_params", + "communityPoolParams", "governance_params", "governanceParams", "ibc_params", @@ -300,7 +300,7 @@ impl<'de> serde::Deserialize<'de> for ChangedAppParameters { #[allow(clippy::enum_variant_names)] enum GeneratedField { ChainParams, - DaoParams, + CommunityPoolParams, GovernanceParams, IbcParams, StakeParams, @@ -328,7 +328,7 @@ impl<'de> serde::Deserialize<'de> for ChangedAppParameters { { match value { "chainParams" | "chain_params" => Ok(GeneratedField::ChainParams), - "daoParams" | "dao_params" => Ok(GeneratedField::DaoParams), + "communityPoolParams" | "community_pool_params" => Ok(GeneratedField::CommunityPoolParams), "governanceParams" | "governance_params" => Ok(GeneratedField::GovernanceParams), "ibcParams" | "ibc_params" => Ok(GeneratedField::IbcParams), "stakeParams" | "stake_params" => Ok(GeneratedField::StakeParams), @@ -354,7 +354,7 @@ impl<'de> serde::Deserialize<'de> for ChangedAppParameters { V: serde::de::MapAccess<'de>, { let mut chain_params__ = None; - let mut dao_params__ = None; + let mut community_pool_params__ = None; let mut governance_params__ = None; let mut ibc_params__ = None; let mut stake_params__ = None; @@ -368,11 +368,11 @@ impl<'de> serde::Deserialize<'de> for ChangedAppParameters { } chain_params__ = map_.next_value()?; } - GeneratedField::DaoParams => { - if dao_params__.is_some() { - return Err(serde::de::Error::duplicate_field("daoParams")); + GeneratedField::CommunityPoolParams => { + if community_pool_params__.is_some() { + return Err(serde::de::Error::duplicate_field("communityPoolParams")); } - dao_params__ = map_.next_value()?; + community_pool_params__ = map_.next_value()?; } GeneratedField::GovernanceParams => { if governance_params__.is_some() { @@ -408,7 +408,7 @@ impl<'de> serde::Deserialize<'de> for ChangedAppParameters { } Ok(ChangedAppParameters { chain_params: chain_params__, - dao_params: dao_params__, + community_pool_params: community_pool_params__, governance_params: governance_params__, ibc_params: ibc_params__, stake_params: stake_params__, @@ -528,7 +528,7 @@ impl<'de> serde::Deserialize<'de> for ChangedAppParametersSet { deserializer.deserialize_struct("penumbra.core.component.governance.v1alpha1.ChangedAppParametersSet", FIELDS, GeneratedVisitor) } } -impl serde::Serialize for DaoDeposit { +impl serde::Serialize for CommunityPoolDeposit { #[allow(deprecated)] fn serialize(&self, serializer: S) -> std::result::Result where @@ -539,14 +539,14 @@ impl serde::Serialize for DaoDeposit { if self.value.is_some() { len += 1; } - let mut struct_ser = serializer.serialize_struct("penumbra.core.component.governance.v1alpha1.DaoDeposit", len)?; + let mut struct_ser = serializer.serialize_struct("penumbra.core.component.governance.v1alpha1.CommunityPoolDeposit", len)?; if let Some(v) = self.value.as_ref() { struct_ser.serialize_field("value", v)?; } struct_ser.end() } } -impl<'de> serde::Deserialize<'de> for DaoDeposit { +impl<'de> serde::Deserialize<'de> for CommunityPoolDeposit { #[allow(deprecated)] fn deserialize(deserializer: D) -> std::result::Result where @@ -590,13 +590,13 @@ impl<'de> serde::Deserialize<'de> for DaoDeposit { } struct GeneratedVisitor; impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { - type Value = DaoDeposit; + type Value = CommunityPoolDeposit; fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - formatter.write_str("struct penumbra.core.component.governance.v1alpha1.DaoDeposit") + formatter.write_str("struct penumbra.core.component.governance.v1alpha1.CommunityPoolDeposit") } - fn visit_map(self, mut map_: V) -> std::result::Result + fn visit_map(self, mut map_: V) -> std::result::Result where V: serde::de::MapAccess<'de>, { @@ -611,15 +611,15 @@ impl<'de> serde::Deserialize<'de> for DaoDeposit { } } } - Ok(DaoDeposit { + Ok(CommunityPoolDeposit { value: value__, }) } } - deserializer.deserialize_struct("penumbra.core.component.governance.v1alpha1.DaoDeposit", FIELDS, GeneratedVisitor) + deserializer.deserialize_struct("penumbra.core.component.governance.v1alpha1.CommunityPoolDeposit", FIELDS, GeneratedVisitor) } } -impl serde::Serialize for DaoOutput { +impl serde::Serialize for CommunityPoolOutput { #[allow(deprecated)] fn serialize(&self, serializer: S) -> std::result::Result where @@ -633,7 +633,7 @@ impl serde::Serialize for DaoOutput { if self.address.is_some() { len += 1; } - let mut struct_ser = serializer.serialize_struct("penumbra.core.component.governance.v1alpha1.DaoOutput", len)?; + let mut struct_ser = serializer.serialize_struct("penumbra.core.component.governance.v1alpha1.CommunityPoolOutput", len)?; if let Some(v) = self.value.as_ref() { struct_ser.serialize_field("value", v)?; } @@ -643,7 +643,7 @@ impl serde::Serialize for DaoOutput { struct_ser.end() } } -impl<'de> serde::Deserialize<'de> for DaoOutput { +impl<'de> serde::Deserialize<'de> for CommunityPoolOutput { #[allow(deprecated)] fn deserialize(deserializer: D) -> std::result::Result where @@ -690,13 +690,13 @@ impl<'de> serde::Deserialize<'de> for DaoOutput { } struct GeneratedVisitor; impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { - type Value = DaoOutput; + type Value = CommunityPoolOutput; fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - formatter.write_str("struct penumbra.core.component.governance.v1alpha1.DaoOutput") + formatter.write_str("struct penumbra.core.component.governance.v1alpha1.CommunityPoolOutput") } - fn visit_map(self, mut map_: V) -> std::result::Result + fn visit_map(self, mut map_: V) -> std::result::Result where V: serde::de::MapAccess<'de>, { @@ -718,16 +718,16 @@ impl<'de> serde::Deserialize<'de> for DaoOutput { } } } - Ok(DaoOutput { + Ok(CommunityPoolOutput { value: value__, address: address__, }) } } - deserializer.deserialize_struct("penumbra.core.component.governance.v1alpha1.DaoOutput", FIELDS, GeneratedVisitor) + deserializer.deserialize_struct("penumbra.core.component.governance.v1alpha1.CommunityPoolOutput", FIELDS, GeneratedVisitor) } } -impl serde::Serialize for DaoSpend { +impl serde::Serialize for CommunityPoolSpend { #[allow(deprecated)] fn serialize(&self, serializer: S) -> std::result::Result where @@ -738,14 +738,14 @@ impl serde::Serialize for DaoSpend { if self.value.is_some() { len += 1; } - let mut struct_ser = serializer.serialize_struct("penumbra.core.component.governance.v1alpha1.DaoSpend", len)?; + let mut struct_ser = serializer.serialize_struct("penumbra.core.component.governance.v1alpha1.CommunityPoolSpend", len)?; if let Some(v) = self.value.as_ref() { struct_ser.serialize_field("value", v)?; } struct_ser.end() } } -impl<'de> serde::Deserialize<'de> for DaoSpend { +impl<'de> serde::Deserialize<'de> for CommunityPoolSpend { #[allow(deprecated)] fn deserialize(deserializer: D) -> std::result::Result where @@ -789,13 +789,13 @@ impl<'de> serde::Deserialize<'de> for DaoSpend { } struct GeneratedVisitor; impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { - type Value = DaoSpend; + type Value = CommunityPoolSpend; fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - formatter.write_str("struct penumbra.core.component.governance.v1alpha1.DaoSpend") + formatter.write_str("struct penumbra.core.component.governance.v1alpha1.CommunityPoolSpend") } - fn visit_map(self, mut map_: V) -> std::result::Result + fn visit_map(self, mut map_: V) -> std::result::Result where V: serde::de::MapAccess<'de>, { @@ -810,12 +810,12 @@ impl<'de> serde::Deserialize<'de> for DaoSpend { } } } - Ok(DaoSpend { + Ok(CommunityPoolSpend { value: value__, }) } } - deserializer.deserialize_struct("penumbra.core.component.governance.v1alpha1.DaoSpend", FIELDS, GeneratedVisitor) + deserializer.deserialize_struct("penumbra.core.component.governance.v1alpha1.CommunityPoolSpend", FIELDS, GeneratedVisitor) } } impl serde::Serialize for DelegatorVote { @@ -967,10 +967,10 @@ impl serde::Serialize for DelegatorVoteBody { if self.unbonded_amount.is_some() { len += 1; } - if !self.nullifier.is_empty() { + if self.nullifier.is_some() { len += 1; } - if !self.rk.is_empty() { + if self.rk.is_some() { len += 1; } let mut struct_ser = serializer.serialize_struct("penumbra.core.component.governance.v1alpha1.DelegatorVoteBody", len)?; @@ -991,13 +991,11 @@ impl serde::Serialize for DelegatorVoteBody { if let Some(v) = self.unbonded_amount.as_ref() { struct_ser.serialize_field("unbondedAmount", v)?; } - if !self.nullifier.is_empty() { - #[allow(clippy::needless_borrow)] - struct_ser.serialize_field("nullifier", pbjson::private::base64::encode(&self.nullifier).as_str())?; + if let Some(v) = self.nullifier.as_ref() { + struct_ser.serialize_field("nullifier", v)?; } - if !self.rk.is_empty() { - #[allow(clippy::needless_borrow)] - struct_ser.serialize_field("rk", pbjson::private::base64::encode(&self.rk).as_str())?; + if let Some(v) = self.rk.as_ref() { + struct_ser.serialize_field("rk", v)?; } struct_ser.end() } @@ -1123,17 +1121,13 @@ impl<'de> serde::Deserialize<'de> for DelegatorVoteBody { if nullifier__.is_some() { return Err(serde::de::Error::duplicate_field("nullifier")); } - nullifier__ = - Some(map_.next_value::<::pbjson::private::BytesDeserialize<_>>()?.0) - ; + nullifier__ = map_.next_value()?; } GeneratedField::Rk => { if rk__.is_some() { return Err(serde::de::Error::duplicate_field("rk")); } - rk__ = - Some(map_.next_value::<::pbjson::private::BytesDeserialize<_>>()?.0) - ; + rk__ = map_.next_value()?; } } } @@ -1143,8 +1137,8 @@ impl<'de> serde::Deserialize<'de> for DelegatorVoteBody { vote: vote__, value: value__, unbonded_amount: unbonded_amount__, - nullifier: nullifier__.unwrap_or_default(), - rk: rk__.unwrap_or_default(), + nullifier: nullifier__, + rk: rk__, }) } } @@ -2184,12 +2178,18 @@ impl serde::Serialize for Proposal { if self.parameter_change.is_some() { len += 1; } - if self.dao_spend.is_some() { + if self.community_pool_spend.is_some() { len += 1; } if self.upgrade_plan.is_some() { len += 1; } + if self.freeze_ibc_client.is_some() { + len += 1; + } + if self.unfreeze_ibc_client.is_some() { + len += 1; + } let mut struct_ser = serializer.serialize_struct("penumbra.core.component.governance.v1alpha1.Proposal", len)?; if self.id != 0 { #[allow(clippy::needless_borrow)] @@ -2210,12 +2210,18 @@ impl serde::Serialize for Proposal { if let Some(v) = self.parameter_change.as_ref() { struct_ser.serialize_field("parameterChange", v)?; } - if let Some(v) = self.dao_spend.as_ref() { - struct_ser.serialize_field("daoSpend", v)?; + if let Some(v) = self.community_pool_spend.as_ref() { + struct_ser.serialize_field("communityPoolSpend", v)?; } if let Some(v) = self.upgrade_plan.as_ref() { struct_ser.serialize_field("upgradePlan", v)?; } + if let Some(v) = self.freeze_ibc_client.as_ref() { + struct_ser.serialize_field("freezeIbcClient", v)?; + } + if let Some(v) = self.unfreeze_ibc_client.as_ref() { + struct_ser.serialize_field("unfreezeIbcClient", v)?; + } struct_ser.end() } } @@ -2233,10 +2239,14 @@ impl<'de> serde::Deserialize<'de> for Proposal { "emergency", "parameter_change", "parameterChange", - "dao_spend", - "daoSpend", + "community_pool_spend", + "communityPoolSpend", "upgrade_plan", "upgradePlan", + "freeze_ibc_client", + "freezeIbcClient", + "unfreeze_ibc_client", + "unfreezeIbcClient", ]; #[allow(clippy::enum_variant_names)] @@ -2247,8 +2257,10 @@ impl<'de> serde::Deserialize<'de> for Proposal { Signaling, Emergency, ParameterChange, - DaoSpend, + CommunityPoolSpend, UpgradePlan, + FreezeIbcClient, + UnfreezeIbcClient, } impl<'de> serde::Deserialize<'de> for GeneratedField { fn deserialize(deserializer: D) -> std::result::Result @@ -2276,8 +2288,10 @@ impl<'de> serde::Deserialize<'de> for Proposal { "signaling" => Ok(GeneratedField::Signaling), "emergency" => Ok(GeneratedField::Emergency), "parameterChange" | "parameter_change" => Ok(GeneratedField::ParameterChange), - "daoSpend" | "dao_spend" => Ok(GeneratedField::DaoSpend), + "communityPoolSpend" | "community_pool_spend" => Ok(GeneratedField::CommunityPoolSpend), "upgradePlan" | "upgrade_plan" => Ok(GeneratedField::UpgradePlan), + "freezeIbcClient" | "freeze_ibc_client" => Ok(GeneratedField::FreezeIbcClient), + "unfreezeIbcClient" | "unfreeze_ibc_client" => Ok(GeneratedField::UnfreezeIbcClient), _ => Err(serde::de::Error::unknown_field(value, FIELDS)), } } @@ -2303,8 +2317,10 @@ impl<'de> serde::Deserialize<'de> for Proposal { let mut signaling__ = None; let mut emergency__ = None; let mut parameter_change__ = None; - let mut dao_spend__ = None; + let mut community_pool_spend__ = None; let mut upgrade_plan__ = None; + let mut freeze_ibc_client__ = None; + let mut unfreeze_ibc_client__ = None; while let Some(k) = map_.next_key()? { match k { GeneratedField::Id => { @@ -2345,11 +2361,11 @@ impl<'de> serde::Deserialize<'de> for Proposal { } parameter_change__ = map_.next_value()?; } - GeneratedField::DaoSpend => { - if dao_spend__.is_some() { - return Err(serde::de::Error::duplicate_field("daoSpend")); + GeneratedField::CommunityPoolSpend => { + if community_pool_spend__.is_some() { + return Err(serde::de::Error::duplicate_field("communityPoolSpend")); } - dao_spend__ = map_.next_value()?; + community_pool_spend__ = map_.next_value()?; } GeneratedField::UpgradePlan => { if upgrade_plan__.is_some() { @@ -2357,6 +2373,18 @@ impl<'de> serde::Deserialize<'de> for Proposal { } upgrade_plan__ = map_.next_value()?; } + GeneratedField::FreezeIbcClient => { + if freeze_ibc_client__.is_some() { + return Err(serde::de::Error::duplicate_field("freezeIbcClient")); + } + freeze_ibc_client__ = map_.next_value()?; + } + GeneratedField::UnfreezeIbcClient => { + if unfreeze_ibc_client__.is_some() { + return Err(serde::de::Error::duplicate_field("unfreezeIbcClient")); + } + unfreeze_ibc_client__ = map_.next_value()?; + } } } Ok(Proposal { @@ -2366,15 +2394,17 @@ impl<'de> serde::Deserialize<'de> for Proposal { signaling: signaling__, emergency: emergency__, parameter_change: parameter_change__, - dao_spend: dao_spend__, + community_pool_spend: community_pool_spend__, upgrade_plan: upgrade_plan__, + freeze_ibc_client: freeze_ibc_client__, + unfreeze_ibc_client: unfreeze_ibc_client__, }) } } deserializer.deserialize_struct("penumbra.core.component.governance.v1alpha1.Proposal", FIELDS, GeneratedVisitor) } } -impl serde::Serialize for proposal::DaoSpend { +impl serde::Serialize for proposal::CommunityPoolSpend { #[allow(deprecated)] fn serialize(&self, serializer: S) -> std::result::Result where @@ -2385,14 +2415,14 @@ impl serde::Serialize for proposal::DaoSpend { if self.transaction_plan.is_some() { len += 1; } - let mut struct_ser = serializer.serialize_struct("penumbra.core.component.governance.v1alpha1.Proposal.DaoSpend", len)?; + let mut struct_ser = serializer.serialize_struct("penumbra.core.component.governance.v1alpha1.Proposal.CommunityPoolSpend", len)?; if let Some(v) = self.transaction_plan.as_ref() { struct_ser.serialize_field("transactionPlan", v)?; } struct_ser.end() } } -impl<'de> serde::Deserialize<'de> for proposal::DaoSpend { +impl<'de> serde::Deserialize<'de> for proposal::CommunityPoolSpend { #[allow(deprecated)] fn deserialize(deserializer: D) -> std::result::Result where @@ -2437,13 +2467,13 @@ impl<'de> serde::Deserialize<'de> for proposal::DaoSpend { } struct GeneratedVisitor; impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { - type Value = proposal::DaoSpend; + type Value = proposal::CommunityPoolSpend; fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - formatter.write_str("struct penumbra.core.component.governance.v1alpha1.Proposal.DaoSpend") + formatter.write_str("struct penumbra.core.component.governance.v1alpha1.Proposal.CommunityPoolSpend") } - fn visit_map(self, mut map_: V) -> std::result::Result + fn visit_map(self, mut map_: V) -> std::result::Result where V: serde::de::MapAccess<'de>, { @@ -2458,12 +2488,12 @@ impl<'de> serde::Deserialize<'de> for proposal::DaoSpend { } } } - Ok(proposal::DaoSpend { + Ok(proposal::CommunityPoolSpend { transaction_plan: transaction_plan__, }) } } - deserializer.deserialize_struct("penumbra.core.component.governance.v1alpha1.Proposal.DaoSpend", FIELDS, GeneratedVisitor) + deserializer.deserialize_struct("penumbra.core.component.governance.v1alpha1.Proposal.CommunityPoolSpend", FIELDS, GeneratedVisitor) } } impl serde::Serialize for proposal::Emergency { @@ -2558,6 +2588,98 @@ impl<'de> serde::Deserialize<'de> for proposal::Emergency { deserializer.deserialize_struct("penumbra.core.component.governance.v1alpha1.Proposal.Emergency", FIELDS, GeneratedVisitor) } } +impl serde::Serialize for proposal::FreezeIbcClient { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let mut len = 0; + if !self.client_id.is_empty() { + len += 1; + } + let mut struct_ser = serializer.serialize_struct("penumbra.core.component.governance.v1alpha1.Proposal.FreezeIbcClient", len)?; + if !self.client_id.is_empty() { + struct_ser.serialize_field("clientId", &self.client_id)?; + } + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for proposal::FreezeIbcClient { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "client_id", + "clientId", + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + ClientId, + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "clientId" | "client_id" => Ok(GeneratedField::ClientId), + _ => Err(serde::de::Error::unknown_field(value, FIELDS)), + } + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = proposal::FreezeIbcClient; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct penumbra.core.component.governance.v1alpha1.Proposal.FreezeIbcClient") + } + + fn visit_map(self, mut map_: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + let mut client_id__ = None; + while let Some(k) = map_.next_key()? { + match k { + GeneratedField::ClientId => { + if client_id__.is_some() { + return Err(serde::de::Error::duplicate_field("clientId")); + } + client_id__ = Some(map_.next_value()?); + } + } + } + Ok(proposal::FreezeIbcClient { + client_id: client_id__.unwrap_or_default(), + }) + } + } + deserializer.deserialize_struct("penumbra.core.component.governance.v1alpha1.Proposal.FreezeIbcClient", FIELDS, GeneratedVisitor) + } +} impl serde::Serialize for proposal::ParameterChange { #[allow(deprecated)] fn serialize(&self, serializer: S) -> std::result::Result @@ -2759,6 +2881,98 @@ impl<'de> serde::Deserialize<'de> for proposal::Signaling { deserializer.deserialize_struct("penumbra.core.component.governance.v1alpha1.Proposal.Signaling", FIELDS, GeneratedVisitor) } } +impl serde::Serialize for proposal::UnfreezeIbcClient { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let mut len = 0; + if !self.client_id.is_empty() { + len += 1; + } + let mut struct_ser = serializer.serialize_struct("penumbra.core.component.governance.v1alpha1.Proposal.UnfreezeIbcClient", len)?; + if !self.client_id.is_empty() { + struct_ser.serialize_field("clientId", &self.client_id)?; + } + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for proposal::UnfreezeIbcClient { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "client_id", + "clientId", + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + ClientId, + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "clientId" | "client_id" => Ok(GeneratedField::ClientId), + _ => Err(serde::de::Error::unknown_field(value, FIELDS)), + } + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = proposal::UnfreezeIbcClient; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct penumbra.core.component.governance.v1alpha1.Proposal.UnfreezeIbcClient") + } + + fn visit_map(self, mut map_: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + let mut client_id__ = None; + while let Some(k) = map_.next_key()? { + match k { + GeneratedField::ClientId => { + if client_id__.is_some() { + return Err(serde::de::Error::duplicate_field("clientId")); + } + client_id__ = Some(map_.next_value()?); + } + } + } + Ok(proposal::UnfreezeIbcClient { + client_id: client_id__.unwrap_or_default(), + }) + } + } + deserializer.deserialize_struct("penumbra.core.component.governance.v1alpha1.Proposal.UnfreezeIbcClient", FIELDS, GeneratedVisitor) + } +} impl serde::Serialize for proposal::UpgradePlan { #[allow(deprecated)] fn serialize(&self, serializer: S) -> std::result::Result diff --git a/crates/proto/src/gen/penumbra.core.component.sct.v1alpha1.rs b/crates/proto/src/gen/penumbra.core.component.sct.v1alpha1.rs index 1ad0ebc81f..20ae6e8f73 100644 --- a/crates/proto/src/gen/penumbra.core.component.sct.v1alpha1.rs +++ b/crates/proto/src/gen/penumbra.core.component.sct.v1alpha1.rs @@ -64,12 +64,12 @@ pub mod commitment_source { ) } } - /// The commitment was created through a `DaoOutput` in a governance-initated transaction. + /// The commitment was created through a `CommunityPoolOutput` in a governance-initated transaction. #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] - pub struct DaoOutput {} - impl ::prost::Name for DaoOutput { - const NAME: &'static str = "DaoOutput"; + pub struct CommunityPoolOutput {} + impl ::prost::Name for CommunityPoolOutput { + const NAME: &'static str = "CommunityPoolOutput"; const PACKAGE: &'static str = "penumbra.core.component.sct.v1alpha1"; fn full_name() -> ::prost::alloc::string::String { ::prost::alloc::format!( @@ -110,7 +110,7 @@ pub mod commitment_source { #[prost(message, tag = "20")] FundingStreamReward(FundingStreamReward), #[prost(message, tag = "30")] - DaoOutput(DaoOutput), + CommunityPoolOutput(CommunityPoolOutput), #[prost(message, tag = "40")] Genesis(Genesis), } diff --git a/crates/proto/src/gen/penumbra.core.component.sct.v1alpha1.serde.rs b/crates/proto/src/gen/penumbra.core.component.sct.v1alpha1.serde.rs index 765993f553..29b7f43cc4 100644 --- a/crates/proto/src/gen/penumbra.core.component.sct.v1alpha1.serde.rs +++ b/crates/proto/src/gen/penumbra.core.component.sct.v1alpha1.serde.rs @@ -21,8 +21,8 @@ impl serde::Serialize for CommitmentSource { commitment_source::Source::FundingStreamReward(v) => { struct_ser.serialize_field("fundingStreamReward", v)?; } - commitment_source::Source::DaoOutput(v) => { - struct_ser.serialize_field("daoOutput", v)?; + commitment_source::Source::CommunityPoolOutput(v) => { + struct_ser.serialize_field("communityPoolOutput", v)?; } commitment_source::Source::Genesis(v) => { struct_ser.serialize_field("genesis", v)?; @@ -44,8 +44,8 @@ impl<'de> serde::Deserialize<'de> for CommitmentSource { "ics20Transfer", "funding_stream_reward", "fundingStreamReward", - "dao_output", - "daoOutput", + "community_pool_output", + "communityPoolOutput", "genesis", ]; @@ -54,7 +54,7 @@ impl<'de> serde::Deserialize<'de> for CommitmentSource { Transaction, Ics20Transfer, FundingStreamReward, - DaoOutput, + CommunityPoolOutput, Genesis, } impl<'de> serde::Deserialize<'de> for GeneratedField { @@ -80,7 +80,7 @@ impl<'de> serde::Deserialize<'de> for CommitmentSource { "transaction" => Ok(GeneratedField::Transaction), "ics20Transfer" | "ics_20_transfer" => Ok(GeneratedField::Ics20Transfer), "fundingStreamReward" | "funding_stream_reward" => Ok(GeneratedField::FundingStreamReward), - "daoOutput" | "dao_output" => Ok(GeneratedField::DaoOutput), + "communityPoolOutput" | "community_pool_output" => Ok(GeneratedField::CommunityPoolOutput), "genesis" => Ok(GeneratedField::Genesis), _ => Err(serde::de::Error::unknown_field(value, FIELDS)), } @@ -125,11 +125,11 @@ impl<'de> serde::Deserialize<'de> for CommitmentSource { source__ = map_.next_value::<::std::option::Option<_>>()?.map(commitment_source::Source::FundingStreamReward) ; } - GeneratedField::DaoOutput => { + GeneratedField::CommunityPoolOutput => { if source__.is_some() { - return Err(serde::de::Error::duplicate_field("daoOutput")); + return Err(serde::de::Error::duplicate_field("communityPoolOutput")); } - source__ = map_.next_value::<::std::option::Option<_>>()?.map(commitment_source::Source::DaoOutput) + source__ = map_.next_value::<::std::option::Option<_>>()?.map(commitment_source::Source::CommunityPoolOutput) ; } GeneratedField::Genesis => { @@ -149,7 +149,7 @@ impl<'de> serde::Deserialize<'de> for CommitmentSource { deserializer.deserialize_struct("penumbra.core.component.sct.v1alpha1.CommitmentSource", FIELDS, GeneratedVisitor) } } -impl serde::Serialize for commitment_source::DaoOutput { +impl serde::Serialize for commitment_source::CommunityPoolOutput { #[allow(deprecated)] fn serialize(&self, serializer: S) -> std::result::Result where @@ -157,11 +157,11 @@ impl serde::Serialize for commitment_source::DaoOutput { { use serde::ser::SerializeStruct; let len = 0; - let struct_ser = serializer.serialize_struct("penumbra.core.component.sct.v1alpha1.CommitmentSource.DaoOutput", len)?; + let struct_ser = serializer.serialize_struct("penumbra.core.component.sct.v1alpha1.CommitmentSource.CommunityPoolOutput", len)?; struct_ser.end() } } -impl<'de> serde::Deserialize<'de> for commitment_source::DaoOutput { +impl<'de> serde::Deserialize<'de> for commitment_source::CommunityPoolOutput { #[allow(deprecated)] fn deserialize(deserializer: D) -> std::result::Result where @@ -200,24 +200,24 @@ impl<'de> serde::Deserialize<'de> for commitment_source::DaoOutput { } struct GeneratedVisitor; impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { - type Value = commitment_source::DaoOutput; + type Value = commitment_source::CommunityPoolOutput; fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - formatter.write_str("struct penumbra.core.component.sct.v1alpha1.CommitmentSource.DaoOutput") + formatter.write_str("struct penumbra.core.component.sct.v1alpha1.CommitmentSource.CommunityPoolOutput") } - fn visit_map(self, mut map_: V) -> std::result::Result + fn visit_map(self, mut map_: V) -> std::result::Result where V: serde::de::MapAccess<'de>, { while map_.next_key::()?.is_some() { let _ = map_.next_value::()?; } - Ok(commitment_source::DaoOutput { + Ok(commitment_source::CommunityPoolOutput { }) } } - deserializer.deserialize_struct("penumbra.core.component.sct.v1alpha1.CommitmentSource.DaoOutput", FIELDS, GeneratedVisitor) + deserializer.deserialize_struct("penumbra.core.component.sct.v1alpha1.CommitmentSource.CommunityPoolOutput", FIELDS, GeneratedVisitor) } } impl serde::Serialize for commitment_source::FundingStreamReward { diff --git a/crates/proto/src/gen/penumbra.core.component.shielded_pool.v1alpha1.rs b/crates/proto/src/gen/penumbra.core.component.shielded_pool.v1alpha1.rs index a6ae3be898..48c8f95a01 100644 --- a/crates/proto/src/gen/penumbra.core.component.shielded_pool.v1alpha1.rs +++ b/crates/proto/src/gen/penumbra.core.component.shielded_pool.v1alpha1.rs @@ -201,11 +201,13 @@ pub struct SpendBody { super::super::super::asset::v1alpha1::BalanceCommitment, >, /// The nullifier of the input note. - #[prost(bytes = "vec", tag = "3")] - pub nullifier: ::prost::alloc::vec::Vec, + #[prost(message, optional, tag = "6")] + pub nullifier: ::core::option::Option, /// The randomized validating key for the spend authorization signature. - #[prost(bytes = "vec", tag = "4")] - pub rk: ::prost::alloc::vec::Vec, + #[prost(message, optional, tag = "4")] + pub rk: ::core::option::Option< + super::super::super::super::crypto::decaf377_rdsa::v1alpha1::SpendVerificationKey, + >, } impl ::prost::Name for SpendBody { const NAME: &'static str = "SpendBody"; diff --git a/crates/proto/src/gen/penumbra.core.component.shielded_pool.v1alpha1.serde.rs b/crates/proto/src/gen/penumbra.core.component.shielded_pool.v1alpha1.serde.rs index e1eff26843..f38b13130f 100644 --- a/crates/proto/src/gen/penumbra.core.component.shielded_pool.v1alpha1.serde.rs +++ b/crates/proto/src/gen/penumbra.core.component.shielded_pool.v1alpha1.serde.rs @@ -1995,23 +1995,21 @@ impl serde::Serialize for SpendBody { if self.balance_commitment.is_some() { len += 1; } - if !self.nullifier.is_empty() { + if self.nullifier.is_some() { len += 1; } - if !self.rk.is_empty() { + if self.rk.is_some() { len += 1; } let mut struct_ser = serializer.serialize_struct("penumbra.core.component.shielded_pool.v1alpha1.SpendBody", len)?; if let Some(v) = self.balance_commitment.as_ref() { struct_ser.serialize_field("balanceCommitment", v)?; } - if !self.nullifier.is_empty() { - #[allow(clippy::needless_borrow)] - struct_ser.serialize_field("nullifier", pbjson::private::base64::encode(&self.nullifier).as_str())?; + if let Some(v) = self.nullifier.as_ref() { + struct_ser.serialize_field("nullifier", v)?; } - if !self.rk.is_empty() { - #[allow(clippy::needless_borrow)] - struct_ser.serialize_field("rk", pbjson::private::base64::encode(&self.rk).as_str())?; + if let Some(v) = self.rk.as_ref() { + struct_ser.serialize_field("rk", v)?; } struct_ser.end() } @@ -2092,24 +2090,20 @@ impl<'de> serde::Deserialize<'de> for SpendBody { if nullifier__.is_some() { return Err(serde::de::Error::duplicate_field("nullifier")); } - nullifier__ = - Some(map_.next_value::<::pbjson::private::BytesDeserialize<_>>()?.0) - ; + nullifier__ = map_.next_value()?; } GeneratedField::Rk => { if rk__.is_some() { return Err(serde::de::Error::duplicate_field("rk")); } - rk__ = - Some(map_.next_value::<::pbjson::private::BytesDeserialize<_>>()?.0) - ; + rk__ = map_.next_value()?; } } } Ok(SpendBody { balance_commitment: balance_commitment__, - nullifier: nullifier__.unwrap_or_default(), - rk: rk__.unwrap_or_default(), + nullifier: nullifier__, + rk: rk__, }) } } diff --git a/crates/proto/src/gen/penumbra.core.component.stake.v1alpha1.rs b/crates/proto/src/gen/penumbra.core.component.stake.v1alpha1.rs index b85515e70e..3a308c420f 100644 --- a/crates/proto/src/gen/penumbra.core.component.stake.v1alpha1.rs +++ b/crates/proto/src/gen/penumbra.core.component.stake.v1alpha1.rs @@ -107,14 +107,14 @@ pub mod funding_stream { } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] - pub struct ToDao { + pub struct ToCommunityPool { /// The portion of the staking reward for the entire delegation pool /// allocated to this funding stream, specified in basis points. #[prost(uint32, tag = "2")] pub rate_bps: u32, } - impl ::prost::Name for ToDao { - const NAME: &'static str = "ToDao"; + impl ::prost::Name for ToCommunityPool { + const NAME: &'static str = "ToCommunityPool"; const PACKAGE: &'static str = "penumbra.core.component.stake.v1alpha1"; fn full_name() -> ::prost::alloc::string::String { ::prost::alloc::format!( @@ -129,7 +129,7 @@ pub mod funding_stream { #[prost(message, tag = "1")] ToAddress(ToAddress), #[prost(message, tag = "2")] - ToDao(ToDao), + ToCommunityPool(ToCommunityPool), } } impl ::prost::Name for FundingStream { diff --git a/crates/proto/src/gen/penumbra.core.component.stake.v1alpha1.serde.rs b/crates/proto/src/gen/penumbra.core.component.stake.v1alpha1.serde.rs index b96455a36c..f144508e87 100644 --- a/crates/proto/src/gen/penumbra.core.component.stake.v1alpha1.serde.rs +++ b/crates/proto/src/gen/penumbra.core.component.stake.v1alpha1.serde.rs @@ -893,8 +893,8 @@ impl serde::Serialize for FundingStream { funding_stream::Recipient::ToAddress(v) => { struct_ser.serialize_field("toAddress", v)?; } - funding_stream::Recipient::ToDao(v) => { - struct_ser.serialize_field("toDao", v)?; + funding_stream::Recipient::ToCommunityPool(v) => { + struct_ser.serialize_field("toCommunityPool", v)?; } } } @@ -910,14 +910,14 @@ impl<'de> serde::Deserialize<'de> for FundingStream { const FIELDS: &[&str] = &[ "to_address", "toAddress", - "to_dao", - "toDao", + "to_community_pool", + "toCommunityPool", ]; #[allow(clippy::enum_variant_names)] enum GeneratedField { ToAddress, - ToDao, + ToCommunityPool, } impl<'de> serde::Deserialize<'de> for GeneratedField { fn deserialize(deserializer: D) -> std::result::Result @@ -940,7 +940,7 @@ impl<'de> serde::Deserialize<'de> for FundingStream { { match value { "toAddress" | "to_address" => Ok(GeneratedField::ToAddress), - "toDao" | "to_dao" => Ok(GeneratedField::ToDao), + "toCommunityPool" | "to_community_pool" => Ok(GeneratedField::ToCommunityPool), _ => Err(serde::de::Error::unknown_field(value, FIELDS)), } } @@ -970,11 +970,11 @@ impl<'de> serde::Deserialize<'de> for FundingStream { recipient__ = map_.next_value::<::std::option::Option<_>>()?.map(funding_stream::Recipient::ToAddress) ; } - GeneratedField::ToDao => { + GeneratedField::ToCommunityPool => { if recipient__.is_some() { - return Err(serde::de::Error::duplicate_field("toDao")); + return Err(serde::de::Error::duplicate_field("toCommunityPool")); } - recipient__ = map_.next_value::<::std::option::Option<_>>()?.map(funding_stream::Recipient::ToDao) + recipient__ = map_.next_value::<::std::option::Option<_>>()?.map(funding_stream::Recipient::ToCommunityPool) ; } } @@ -1098,7 +1098,7 @@ impl<'de> serde::Deserialize<'de> for funding_stream::ToAddress { deserializer.deserialize_struct("penumbra.core.component.stake.v1alpha1.FundingStream.ToAddress", FIELDS, GeneratedVisitor) } } -impl serde::Serialize for funding_stream::ToDao { +impl serde::Serialize for funding_stream::ToCommunityPool { #[allow(deprecated)] fn serialize(&self, serializer: S) -> std::result::Result where @@ -1109,14 +1109,14 @@ impl serde::Serialize for funding_stream::ToDao { if self.rate_bps != 0 { len += 1; } - let mut struct_ser = serializer.serialize_struct("penumbra.core.component.stake.v1alpha1.FundingStream.ToDao", len)?; + let mut struct_ser = serializer.serialize_struct("penumbra.core.component.stake.v1alpha1.FundingStream.ToCommunityPool", len)?; if self.rate_bps != 0 { struct_ser.serialize_field("rateBps", &self.rate_bps)?; } struct_ser.end() } } -impl<'de> serde::Deserialize<'de> for funding_stream::ToDao { +impl<'de> serde::Deserialize<'de> for funding_stream::ToCommunityPool { #[allow(deprecated)] fn deserialize(deserializer: D) -> std::result::Result where @@ -1161,13 +1161,13 @@ impl<'de> serde::Deserialize<'de> for funding_stream::ToDao { } struct GeneratedVisitor; impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { - type Value = funding_stream::ToDao; + type Value = funding_stream::ToCommunityPool; fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - formatter.write_str("struct penumbra.core.component.stake.v1alpha1.FundingStream.ToDao") + formatter.write_str("struct penumbra.core.component.stake.v1alpha1.FundingStream.ToCommunityPool") } - fn visit_map(self, mut map_: V) -> std::result::Result + fn visit_map(self, mut map_: V) -> std::result::Result where V: serde::de::MapAccess<'de>, { @@ -1184,12 +1184,12 @@ impl<'de> serde::Deserialize<'de> for funding_stream::ToDao { } } } - Ok(funding_stream::ToDao { + Ok(funding_stream::ToCommunityPool { rate_bps: rate_bps__.unwrap_or_default(), }) } } - deserializer.deserialize_struct("penumbra.core.component.stake.v1alpha1.FundingStream.ToDao", FIELDS, GeneratedVisitor) + deserializer.deserialize_struct("penumbra.core.component.stake.v1alpha1.FundingStream.ToCommunityPool", FIELDS, GeneratedVisitor) } } impl serde::Serialize for GenesisContent { diff --git a/crates/proto/src/gen/penumbra.core.keys.v1alpha1.rs b/crates/proto/src/gen/penumbra.core.keys.v1alpha1.rs index f4d3dba058..4dc78441e5 100644 --- a/crates/proto/src/gen/penumbra.core.keys.v1alpha1.rs +++ b/crates/proto/src/gen/penumbra.core.keys.v1alpha1.rs @@ -110,19 +110,6 @@ impl ::prost::Name for SpendKey { } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] -pub struct SpendVerificationKey { - #[prost(bytes = "vec", tag = "1")] - pub inner: ::prost::alloc::vec::Vec, -} -impl ::prost::Name for SpendVerificationKey { - const NAME: &'static str = "SpendVerificationKey"; - const PACKAGE: &'static str = "penumbra.core.keys.v1alpha1"; - fn full_name() -> ::prost::alloc::string::String { - ::prost::alloc::format!("penumbra.core.keys.v1alpha1.{}", Self::NAME) - } -} -#[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] pub struct FullViewingKey { #[prost(bytes = "vec", tag = "1")] pub inner: ::prost::alloc::vec::Vec, diff --git a/crates/proto/src/gen/penumbra.core.keys.v1alpha1.serde.rs b/crates/proto/src/gen/penumbra.core.keys.v1alpha1.serde.rs index c9ab05d95f..8a2537aa5c 100644 --- a/crates/proto/src/gen/penumbra.core.keys.v1alpha1.serde.rs +++ b/crates/proto/src/gen/penumbra.core.keys.v1alpha1.serde.rs @@ -1207,100 +1207,6 @@ impl<'de> serde::Deserialize<'de> for SpendKey { deserializer.deserialize_struct("penumbra.core.keys.v1alpha1.SpendKey", FIELDS, GeneratedVisitor) } } -impl serde::Serialize for SpendVerificationKey { - #[allow(deprecated)] - fn serialize(&self, serializer: S) -> std::result::Result - where - S: serde::Serializer, - { - use serde::ser::SerializeStruct; - let mut len = 0; - if !self.inner.is_empty() { - len += 1; - } - let mut struct_ser = serializer.serialize_struct("penumbra.core.keys.v1alpha1.SpendVerificationKey", len)?; - if !self.inner.is_empty() { - #[allow(clippy::needless_borrow)] - struct_ser.serialize_field("inner", pbjson::private::base64::encode(&self.inner).as_str())?; - } - struct_ser.end() - } -} -impl<'de> serde::Deserialize<'de> for SpendVerificationKey { - #[allow(deprecated)] - fn deserialize(deserializer: D) -> std::result::Result - where - D: serde::Deserializer<'de>, - { - const FIELDS: &[&str] = &[ - "inner", - ]; - - #[allow(clippy::enum_variant_names)] - enum GeneratedField { - Inner, - } - impl<'de> serde::Deserialize<'de> for GeneratedField { - fn deserialize(deserializer: D) -> std::result::Result - where - D: serde::Deserializer<'de>, - { - struct GeneratedVisitor; - - impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { - type Value = GeneratedField; - - fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - write!(formatter, "expected one of: {:?}", &FIELDS) - } - - #[allow(unused_variables)] - fn visit_str(self, value: &str) -> std::result::Result - where - E: serde::de::Error, - { - match value { - "inner" => Ok(GeneratedField::Inner), - _ => Err(serde::de::Error::unknown_field(value, FIELDS)), - } - } - } - deserializer.deserialize_identifier(GeneratedVisitor) - } - } - struct GeneratedVisitor; - impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { - type Value = SpendVerificationKey; - - fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - formatter.write_str("struct penumbra.core.keys.v1alpha1.SpendVerificationKey") - } - - fn visit_map(self, mut map_: V) -> std::result::Result - where - V: serde::de::MapAccess<'de>, - { - let mut inner__ = None; - while let Some(k) = map_.next_key()? { - match k { - GeneratedField::Inner => { - if inner__.is_some() { - return Err(serde::de::Error::duplicate_field("inner")); - } - inner__ = - Some(map_.next_value::<::pbjson::private::BytesDeserialize<_>>()?.0) - ; - } - } - } - Ok(SpendVerificationKey { - inner: inner__.unwrap_or_default(), - }) - } - } - deserializer.deserialize_struct("penumbra.core.keys.v1alpha1.SpendVerificationKey", FIELDS, GeneratedVisitor) - } -} impl serde::Serialize for WalletId { #[allow(deprecated)] fn serialize(&self, serializer: S) -> std::result::Result diff --git a/crates/proto/src/gen/penumbra.core.transaction.v1alpha1.rs b/crates/proto/src/gen/penumbra.core.transaction.v1alpha1.rs index 2756b73cfe..f76afdc2b2 100644 --- a/crates/proto/src/gen/penumbra.core.transaction.v1alpha1.rs +++ b/crates/proto/src/gen/penumbra.core.transaction.v1alpha1.rs @@ -5,8 +5,10 @@ pub struct Transaction { #[prost(message, optional, tag = "1")] pub body: ::core::option::Option, /// The binding signature is stored separately from the transaction body that it signs. - #[prost(bytes = "vec", tag = "2")] - pub binding_sig: ::prost::alloc::vec::Vec, + #[prost(message, optional, tag = "2")] + pub binding_sig: ::core::option::Option< + super::super::super::crypto::decaf377_rdsa::v1alpha1::BindingSignature, + >, /// The root of some previous state of the state commitment tree, used as an anchor for all /// ZK state transition proofs. #[prost(message, optional, tag = "3")] @@ -21,20 +23,6 @@ impl ::prost::Name for Transaction { ::prost::alloc::format!("penumbra.core.transaction.v1alpha1.{}", Self::NAME) } } -/// A transaction ID, the Sha256 hash of a transaction. -#[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] -pub struct Id { - #[prost(bytes = "vec", tag = "1")] - pub hash: ::prost::alloc::vec::Vec, -} -impl ::prost::Name for Id { - const NAME: &'static str = "Id"; - const PACKAGE: &'static str = "penumbra.core.transaction.v1alpha1"; - fn full_name() -> ::prost::alloc::string::String { - ::prost::alloc::format!("penumbra.core.transaction.v1alpha1.{}", Self::NAME) - } -} /// The body of a transaction. #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] @@ -45,15 +33,14 @@ pub struct TransactionBody { /// Parameters determining if a transaction should be accepted by this chain. #[prost(message, optional, tag = "2")] pub transaction_parameters: ::core::option::Option, - /// The transaction fee. - #[prost(message, optional, tag = "3")] - pub fee: ::core::option::Option, /// Detection data for use with Fuzzy Message Detection #[prost(message, optional, tag = "4")] pub detection_data: ::core::option::Option, - /// Sub-message containing memo ciphertext if a memo was added to the transaction. + /// The encrypted memo for this transaction. + /// + /// This field will be present if and only if the transaction has outputs. #[prost(message, optional, tag = "5")] - pub memo_data: ::core::option::Option, + pub memo: ::core::option::Option, } impl ::prost::Name for TransactionBody { const NAME: &'static str = "TransactionBody"; @@ -62,22 +49,6 @@ impl ::prost::Name for TransactionBody { ::prost::alloc::format!("penumbra.core.transaction.v1alpha1.{}", Self::NAME) } } -/// Represents the encrypted memo data. -#[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] -pub struct MemoData { - /// The encrypted data. It will only be populated if there are - /// outputs in the actions of the transaction. 528 bytes. - #[prost(bytes = "vec", tag = "1")] - pub encrypted_memo: ::prost::alloc::vec::Vec, -} -impl ::prost::Name for MemoData { - const NAME: &'static str = "MemoData"; - const PACKAGE: &'static str = "penumbra.core.transaction.v1alpha1"; - fn full_name() -> ::prost::alloc::string::String { - ::prost::alloc::format!("penumbra.core.transaction.v1alpha1.{}", Self::NAME) - } -} /// The parameters determining if a transaction should be accepted by the chain. #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] @@ -91,6 +62,9 @@ pub struct TransactionParameters { /// replaying a transaction on one chain onto a different chain. #[prost(string, tag = "2")] pub chain_id: ::prost::alloc::string::String, + /// The transaction fee. + #[prost(message, optional, tag = "3")] + pub fee: ::core::option::Option, } impl ::prost::Name for TransactionParameters { const NAME: &'static str = "TransactionParameters"; @@ -189,13 +163,19 @@ pub mod action { UndelegateClaim( super::super::super::component::stake::v1alpha1::UndelegateClaim, ), - /// DAO + /// Community Pool #[prost(message, tag = "50")] - DaoSpend(super::super::super::component::governance::v1alpha1::DaoSpend), + CommunityPoolSpend( + super::super::super::component::governance::v1alpha1::CommunityPoolSpend, + ), #[prost(message, tag = "51")] - DaoOutput(super::super::super::component::governance::v1alpha1::DaoOutput), + CommunityPoolOutput( + super::super::super::component::governance::v1alpha1::CommunityPoolOutput, + ), #[prost(message, tag = "52")] - DaoDeposit(super::super::super::component::governance::v1alpha1::DaoDeposit), + CommunityPoolDeposit( + super::super::super::component::governance::v1alpha1::CommunityPoolDeposit, + ), #[prost(message, tag = "200")] Ics20Withdrawal(super::super::super::component::ibc::v1alpha1::Ics20Withdrawal), } @@ -232,7 +212,9 @@ pub struct TransactionPerspective { pub denoms: ::prost::alloc::vec::Vec, /// The transaction ID associated with this TransactionPerspective #[prost(message, optional, tag = "6")] - pub transaction_id: ::core::option::Option, + pub transaction_id: ::core::option::Option< + super::super::txhash::v1alpha1::TransactionId, + >, } impl ::prost::Name for TransactionPerspective { const NAME: &'static str = "TransactionPerspective"; @@ -285,8 +267,10 @@ pub struct TransactionView { #[prost(message, optional, tag = "1")] pub body_view: ::core::option::Option, /// The binding signature is stored separately from the transaction body that it signs. - #[prost(bytes = "vec", tag = "2")] - pub binding_sig: ::prost::alloc::vec::Vec, + #[prost(message, optional, tag = "2")] + pub binding_sig: ::core::option::Option< + super::super::super::crypto::decaf377_rdsa::v1alpha1::BindingSignature, + >, /// The root of some previous state of the state commitment tree, used as an anchor for all /// ZK state transition proofs. #[prost(message, optional, tag = "3")] @@ -310,9 +294,6 @@ pub struct TransactionBodyView { /// Transaction parameters. #[prost(message, optional, tag = "2")] pub transaction_parameters: ::core::option::Option, - /// The transaction fee. - #[prost(message, optional, tag = "3")] - pub fee: ::core::option::Option, /// The detection data in this transaction, only populated if /// there are outputs in the actions of this transaction. #[prost(message, optional, tag = "4")] @@ -397,13 +378,19 @@ pub mod action_view { Delegate(super::super::super::component::stake::v1alpha1::Delegate), #[prost(message, tag = "42")] Undelegate(super::super::super::component::stake::v1alpha1::Undelegate), - /// DAO + /// Community Pool #[prost(message, tag = "50")] - DaoSpend(super::super::super::component::governance::v1alpha1::DaoSpend), + CommunityPoolSpend( + super::super::super::component::governance::v1alpha1::CommunityPoolSpend, + ), #[prost(message, tag = "51")] - DaoOutput(super::super::super::component::governance::v1alpha1::DaoOutput), + CommunityPoolOutput( + super::super::super::component::governance::v1alpha1::CommunityPoolOutput, + ), #[prost(message, tag = "52")] - DaoDeposit(super::super::super::component::governance::v1alpha1::DaoDeposit), + CommunityPoolDeposit( + super::super::super::component::governance::v1alpha1::CommunityPoolDeposit, + ), /// TODO: we have no way to recover the opening of the undelegate_claim's /// balance commitment, and can only infer the value from looking at the rest /// of the transaction. is that fine? @@ -422,27 +409,13 @@ impl ::prost::Name for ActionView { ::prost::alloc::format!("penumbra.core.transaction.v1alpha1.{}", Self::NAME) } } -/// An authorization hash for a Penumbra transaction. -#[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] -pub struct EffectHash { - #[prost(bytes = "vec", tag = "1")] - pub inner: ::prost::alloc::vec::Vec, -} -impl ::prost::Name for EffectHash { - const NAME: &'static str = "EffectHash"; - const PACKAGE: &'static str = "penumbra.core.transaction.v1alpha1"; - fn full_name() -> ::prost::alloc::string::String { - ::prost::alloc::format!("penumbra.core.transaction.v1alpha1.{}", Self::NAME) - } -} /// The data required to authorize a transaction plan. #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct AuthorizationData { /// The computed auth hash for the approved transaction plan. #[prost(message, optional, tag = "1")] - pub effect_hash: ::core::option::Option, + pub effect_hash: ::core::option::Option, /// The required spend authorizations, returned in the same order as the /// Spend actions in the original request. #[prost(message, repeated, tag = "2")] @@ -488,26 +461,24 @@ impl ::prost::Name for WitnessData { } /// Describes a planned transaction. Permits clients to prepare a transaction /// prior submission, so that a user can review it prior to authorizing its execution. +/// +/// The `TransactionPlan` is a fully determined bundle binding all of a transaction's effects. +/// The only thing it does not include is the witness data used for proving. #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct TransactionPlan { - /// The planner interface(s) for Actions to be performed, such as a Spend, Swap, - /// or Delegation. See the ActionPlan docs for a full list of options. + /// The sequence of actions planned for this transaction. #[prost(message, repeated, tag = "1")] pub actions: ::prost::alloc::vec::Vec, - /// Time, as block height, after which TransactionPlan should be considered invalid. - #[prost(uint64, tag = "2")] - pub expiry_height: u64, - /// The name of the network for which this TransactionPlan was built. - #[prost(string, tag = "3")] - pub chain_id: ::prost::alloc::string::String, + /// Parameters determining if a transaction should be accepted by this chain. + #[prost(message, optional, tag = "2")] + pub transaction_parameters: ::core::option::Option, + /// Detection data for use with Fuzzy Message Detection #[prost(message, optional, tag = "4")] - pub fee: ::core::option::Option, - #[prost(message, repeated, tag = "5")] - pub clue_plans: ::prost::alloc::vec::Vec, - /// Planning interface for constructing an optional Memo for the Transaction. - #[prost(message, optional, tag = "6")] - pub memo_plan: ::core::option::Option, + pub detection_data: ::core::option::Option, + /// The memo plan for this transaction. + #[prost(message, optional, tag = "5")] + pub memo: ::core::option::Option, } impl ::prost::Name for TransactionPlan { const NAME: &'static str = "TransactionPlan"; @@ -516,6 +487,19 @@ impl ::prost::Name for TransactionPlan { ::prost::alloc::format!("penumbra.core.transaction.v1alpha1.{}", Self::NAME) } } +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct DetectionDataPlan { + #[prost(message, repeated, tag = "5")] + pub clue_plans: ::prost::alloc::vec::Vec, +} +impl ::prost::Name for DetectionDataPlan { + const NAME: &'static str = "DetectionDataPlan"; + const PACKAGE: &'static str = "penumbra.core.transaction.v1alpha1"; + fn full_name() -> ::prost::alloc::string::String { + ::prost::alloc::format!("penumbra.core.transaction.v1alpha1.{}", Self::NAME) + } +} /// Describes a planned transaction action. /// /// Some transaction Actions don't have any private data and are treated as being plans @@ -598,13 +582,19 @@ pub mod action_plan { UndelegateClaim( super::super::super::component::stake::v1alpha1::UndelegateClaimPlan, ), - /// DAO + /// Community Pool #[prost(message, tag = "50")] - DaoSpend(super::super::super::component::governance::v1alpha1::DaoSpend), + CommunityPoolSpend( + super::super::super::component::governance::v1alpha1::CommunityPoolSpend, + ), #[prost(message, tag = "51")] - DaoOutput(super::super::super::component::governance::v1alpha1::DaoOutput), + CommunityPoolOutput( + super::super::super::component::governance::v1alpha1::CommunityPoolOutput, + ), #[prost(message, tag = "52")] - DaoDeposit(super::super::super::component::governance::v1alpha1::DaoDeposit), + CommunityPoolDeposit( + super::super::super::component::governance::v1alpha1::CommunityPoolDeposit, + ), } } impl ::prost::Name for ActionPlan { @@ -635,7 +625,7 @@ impl ::prost::Name for CluePlan { ::prost::alloc::format!("penumbra.core.transaction.v1alpha1.{}", Self::NAME) } } -/// Describes a plan for forming a `Memo`. +/// Describes a plan for forming the transaction memo. #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct MemoPlan { @@ -653,9 +643,11 @@ impl ::prost::Name for MemoPlan { ::prost::alloc::format!("penumbra.core.transaction.v1alpha1.{}", Self::NAME) } } +/// The encrypted memo data describing information about the purpose of a transaction. #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct MemoCiphertext { + /// The encrypted data. 528 bytes. #[prost(bytes = "vec", tag = "1")] pub inner: ::prost::alloc::vec::Vec, } @@ -666,11 +658,17 @@ impl ::prost::Name for MemoCiphertext { ::prost::alloc::format!("penumbra.core.transaction.v1alpha1.{}", Self::NAME) } } +/// The plaintext describing information about the purpose of a transaction. #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct MemoPlaintext { + /// The sender's return address. + /// + /// This should always be a valid address; the sender is responsible for ensuring + /// that if the receiver returns funds to this address, they will not be lost. #[prost(message, optional, tag = "1")] pub return_address: ::core::option::Option, + /// Free-form text, up to 432 bytes long. #[prost(string, tag = "2")] pub text: ::prost::alloc::string::String, } diff --git a/crates/proto/src/gen/penumbra.core.transaction.v1alpha1.serde.rs b/crates/proto/src/gen/penumbra.core.transaction.v1alpha1.serde.rs index d9d861551e..cb1d94f397 100644 --- a/crates/proto/src/gen/penumbra.core.transaction.v1alpha1.serde.rs +++ b/crates/proto/src/gen/penumbra.core.transaction.v1alpha1.serde.rs @@ -66,14 +66,14 @@ impl serde::Serialize for Action { action::Action::UndelegateClaim(v) => { struct_ser.serialize_field("undelegateClaim", v)?; } - action::Action::DaoSpend(v) => { - struct_ser.serialize_field("daoSpend", v)?; + action::Action::CommunityPoolSpend(v) => { + struct_ser.serialize_field("communityPoolSpend", v)?; } - action::Action::DaoOutput(v) => { - struct_ser.serialize_field("daoOutput", v)?; + action::Action::CommunityPoolOutput(v) => { + struct_ser.serialize_field("communityPoolOutput", v)?; } - action::Action::DaoDeposit(v) => { - struct_ser.serialize_field("daoDeposit", v)?; + action::Action::CommunityPoolDeposit(v) => { + struct_ser.serialize_field("communityPoolDeposit", v)?; } action::Action::Ics20Withdrawal(v) => { struct_ser.serialize_field("ics20Withdrawal", v)?; @@ -121,12 +121,12 @@ impl<'de> serde::Deserialize<'de> for Action { "undelegate", "undelegate_claim", "undelegateClaim", - "dao_spend", - "daoSpend", - "dao_output", - "daoOutput", - "dao_deposit", - "daoDeposit", + "community_pool_spend", + "communityPoolSpend", + "community_pool_output", + "communityPoolOutput", + "community_pool_deposit", + "communityPoolDeposit", "ics20_withdrawal", "ics20Withdrawal", ]; @@ -151,9 +151,9 @@ impl<'de> serde::Deserialize<'de> for Action { Delegate, Undelegate, UndelegateClaim, - DaoSpend, - DaoOutput, - DaoDeposit, + CommunityPoolSpend, + CommunityPoolOutput, + CommunityPoolDeposit, Ics20Withdrawal, } impl<'de> serde::Deserialize<'de> for GeneratedField { @@ -194,9 +194,9 @@ impl<'de> serde::Deserialize<'de> for Action { "delegate" => Ok(GeneratedField::Delegate), "undelegate" => Ok(GeneratedField::Undelegate), "undelegateClaim" | "undelegate_claim" => Ok(GeneratedField::UndelegateClaim), - "daoSpend" | "dao_spend" => Ok(GeneratedField::DaoSpend), - "daoOutput" | "dao_output" => Ok(GeneratedField::DaoOutput), - "daoDeposit" | "dao_deposit" => Ok(GeneratedField::DaoDeposit), + "communityPoolSpend" | "community_pool_spend" => Ok(GeneratedField::CommunityPoolSpend), + "communityPoolOutput" | "community_pool_output" => Ok(GeneratedField::CommunityPoolOutput), + "communityPoolDeposit" | "community_pool_deposit" => Ok(GeneratedField::CommunityPoolDeposit), "ics20Withdrawal" | "ics20_withdrawal" => Ok(GeneratedField::Ics20Withdrawal), _ => Err(serde::de::Error::unknown_field(value, FIELDS)), } @@ -346,25 +346,25 @@ impl<'de> serde::Deserialize<'de> for Action { action__ = map_.next_value::<::std::option::Option<_>>()?.map(action::Action::UndelegateClaim) ; } - GeneratedField::DaoSpend => { + GeneratedField::CommunityPoolSpend => { if action__.is_some() { - return Err(serde::de::Error::duplicate_field("daoSpend")); + return Err(serde::de::Error::duplicate_field("communityPoolSpend")); } - action__ = map_.next_value::<::std::option::Option<_>>()?.map(action::Action::DaoSpend) + action__ = map_.next_value::<::std::option::Option<_>>()?.map(action::Action::CommunityPoolSpend) ; } - GeneratedField::DaoOutput => { + GeneratedField::CommunityPoolOutput => { if action__.is_some() { - return Err(serde::de::Error::duplicate_field("daoOutput")); + return Err(serde::de::Error::duplicate_field("communityPoolOutput")); } - action__ = map_.next_value::<::std::option::Option<_>>()?.map(action::Action::DaoOutput) + action__ = map_.next_value::<::std::option::Option<_>>()?.map(action::Action::CommunityPoolOutput) ; } - GeneratedField::DaoDeposit => { + GeneratedField::CommunityPoolDeposit => { if action__.is_some() { - return Err(serde::de::Error::duplicate_field("daoDeposit")); + return Err(serde::de::Error::duplicate_field("communityPoolDeposit")); } - action__ = map_.next_value::<::std::option::Option<_>>()?.map(action::Action::DaoDeposit) + action__ = map_.next_value::<::std::option::Option<_>>()?.map(action::Action::CommunityPoolDeposit) ; } GeneratedField::Ics20Withdrawal => { @@ -455,14 +455,14 @@ impl serde::Serialize for ActionPlan { action_plan::Action::UndelegateClaim(v) => { struct_ser.serialize_field("undelegateClaim", v)?; } - action_plan::Action::DaoSpend(v) => { - struct_ser.serialize_field("daoSpend", v)?; + action_plan::Action::CommunityPoolSpend(v) => { + struct_ser.serialize_field("communityPoolSpend", v)?; } - action_plan::Action::DaoOutput(v) => { - struct_ser.serialize_field("daoOutput", v)?; + action_plan::Action::CommunityPoolOutput(v) => { + struct_ser.serialize_field("communityPoolOutput", v)?; } - action_plan::Action::DaoDeposit(v) => { - struct_ser.serialize_field("daoDeposit", v)?; + action_plan::Action::CommunityPoolDeposit(v) => { + struct_ser.serialize_field("communityPoolDeposit", v)?; } } } @@ -508,12 +508,12 @@ impl<'de> serde::Deserialize<'de> for ActionPlan { "undelegate", "undelegate_claim", "undelegateClaim", - "dao_spend", - "daoSpend", - "dao_output", - "daoOutput", - "dao_deposit", - "daoDeposit", + "community_pool_spend", + "communityPoolSpend", + "community_pool_output", + "communityPoolOutput", + "community_pool_deposit", + "communityPoolDeposit", ]; #[allow(clippy::enum_variant_names)] @@ -537,9 +537,9 @@ impl<'de> serde::Deserialize<'de> for ActionPlan { Delegate, Undelegate, UndelegateClaim, - DaoSpend, - DaoOutput, - DaoDeposit, + CommunityPoolSpend, + CommunityPoolOutput, + CommunityPoolDeposit, } impl<'de> serde::Deserialize<'de> for GeneratedField { fn deserialize(deserializer: D) -> std::result::Result @@ -580,9 +580,9 @@ impl<'de> serde::Deserialize<'de> for ActionPlan { "delegate" => Ok(GeneratedField::Delegate), "undelegate" => Ok(GeneratedField::Undelegate), "undelegateClaim" | "undelegate_claim" => Ok(GeneratedField::UndelegateClaim), - "daoSpend" | "dao_spend" => Ok(GeneratedField::DaoSpend), - "daoOutput" | "dao_output" => Ok(GeneratedField::DaoOutput), - "daoDeposit" | "dao_deposit" => Ok(GeneratedField::DaoDeposit), + "communityPoolSpend" | "community_pool_spend" => Ok(GeneratedField::CommunityPoolSpend), + "communityPoolOutput" | "community_pool_output" => Ok(GeneratedField::CommunityPoolOutput), + "communityPoolDeposit" | "community_pool_deposit" => Ok(GeneratedField::CommunityPoolDeposit), _ => Err(serde::de::Error::unknown_field(value, FIELDS)), } } @@ -738,25 +738,25 @@ impl<'de> serde::Deserialize<'de> for ActionPlan { action__ = map_.next_value::<::std::option::Option<_>>()?.map(action_plan::Action::UndelegateClaim) ; } - GeneratedField::DaoSpend => { + GeneratedField::CommunityPoolSpend => { if action__.is_some() { - return Err(serde::de::Error::duplicate_field("daoSpend")); + return Err(serde::de::Error::duplicate_field("communityPoolSpend")); } - action__ = map_.next_value::<::std::option::Option<_>>()?.map(action_plan::Action::DaoSpend) + action__ = map_.next_value::<::std::option::Option<_>>()?.map(action_plan::Action::CommunityPoolSpend) ; } - GeneratedField::DaoOutput => { + GeneratedField::CommunityPoolOutput => { if action__.is_some() { - return Err(serde::de::Error::duplicate_field("daoOutput")); + return Err(serde::de::Error::duplicate_field("communityPoolOutput")); } - action__ = map_.next_value::<::std::option::Option<_>>()?.map(action_plan::Action::DaoOutput) + action__ = map_.next_value::<::std::option::Option<_>>()?.map(action_plan::Action::CommunityPoolOutput) ; } - GeneratedField::DaoDeposit => { + GeneratedField::CommunityPoolDeposit => { if action__.is_some() { - return Err(serde::de::Error::duplicate_field("daoDeposit")); + return Err(serde::de::Error::duplicate_field("communityPoolDeposit")); } - action__ = map_.next_value::<::std::option::Option<_>>()?.map(action_plan::Action::DaoDeposit) + action__ = map_.next_value::<::std::option::Option<_>>()?.map(action_plan::Action::CommunityPoolDeposit) ; } } @@ -834,14 +834,14 @@ impl serde::Serialize for ActionView { action_view::ActionView::Undelegate(v) => { struct_ser.serialize_field("undelegate", v)?; } - action_view::ActionView::DaoSpend(v) => { - struct_ser.serialize_field("daoSpend", v)?; + action_view::ActionView::CommunityPoolSpend(v) => { + struct_ser.serialize_field("communityPoolSpend", v)?; } - action_view::ActionView::DaoOutput(v) => { - struct_ser.serialize_field("daoOutput", v)?; + action_view::ActionView::CommunityPoolOutput(v) => { + struct_ser.serialize_field("communityPoolOutput", v)?; } - action_view::ActionView::DaoDeposit(v) => { - struct_ser.serialize_field("daoDeposit", v)?; + action_view::ActionView::CommunityPoolDeposit(v) => { + struct_ser.serialize_field("communityPoolDeposit", v)?; } action_view::ActionView::UndelegateClaim(v) => { struct_ser.serialize_field("undelegateClaim", v)?; @@ -890,12 +890,12 @@ impl<'de> serde::Deserialize<'de> for ActionView { "positionRewardClaim", "delegate", "undelegate", - "dao_spend", - "daoSpend", - "dao_output", - "daoOutput", - "dao_deposit", - "daoDeposit", + "community_pool_spend", + "communityPoolSpend", + "community_pool_output", + "communityPoolOutput", + "community_pool_deposit", + "communityPoolDeposit", "undelegate_claim", "undelegateClaim", "ics20_withdrawal", @@ -921,9 +921,9 @@ impl<'de> serde::Deserialize<'de> for ActionView { PositionRewardClaim, Delegate, Undelegate, - DaoSpend, - DaoOutput, - DaoDeposit, + CommunityPoolSpend, + CommunityPoolOutput, + CommunityPoolDeposit, UndelegateClaim, Ics20Withdrawal, } @@ -964,9 +964,9 @@ impl<'de> serde::Deserialize<'de> for ActionView { "positionRewardClaim" | "position_reward_claim" => Ok(GeneratedField::PositionRewardClaim), "delegate" => Ok(GeneratedField::Delegate), "undelegate" => Ok(GeneratedField::Undelegate), - "daoSpend" | "dao_spend" => Ok(GeneratedField::DaoSpend), - "daoOutput" | "dao_output" => Ok(GeneratedField::DaoOutput), - "daoDeposit" | "dao_deposit" => Ok(GeneratedField::DaoDeposit), + "communityPoolSpend" | "community_pool_spend" => Ok(GeneratedField::CommunityPoolSpend), + "communityPoolOutput" | "community_pool_output" => Ok(GeneratedField::CommunityPoolOutput), + "communityPoolDeposit" | "community_pool_deposit" => Ok(GeneratedField::CommunityPoolDeposit), "undelegateClaim" | "undelegate_claim" => Ok(GeneratedField::UndelegateClaim), "ics20Withdrawal" | "ics20_withdrawal" => Ok(GeneratedField::Ics20Withdrawal), _ => Err(serde::de::Error::unknown_field(value, FIELDS)), @@ -1110,25 +1110,25 @@ impl<'de> serde::Deserialize<'de> for ActionView { action_view__ = map_.next_value::<::std::option::Option<_>>()?.map(action_view::ActionView::Undelegate) ; } - GeneratedField::DaoSpend => { + GeneratedField::CommunityPoolSpend => { if action_view__.is_some() { - return Err(serde::de::Error::duplicate_field("daoSpend")); + return Err(serde::de::Error::duplicate_field("communityPoolSpend")); } - action_view__ = map_.next_value::<::std::option::Option<_>>()?.map(action_view::ActionView::DaoSpend) + action_view__ = map_.next_value::<::std::option::Option<_>>()?.map(action_view::ActionView::CommunityPoolSpend) ; } - GeneratedField::DaoOutput => { + GeneratedField::CommunityPoolOutput => { if action_view__.is_some() { - return Err(serde::de::Error::duplicate_field("daoOutput")); + return Err(serde::de::Error::duplicate_field("communityPoolOutput")); } - action_view__ = map_.next_value::<::std::option::Option<_>>()?.map(action_view::ActionView::DaoOutput) + action_view__ = map_.next_value::<::std::option::Option<_>>()?.map(action_view::ActionView::CommunityPoolOutput) ; } - GeneratedField::DaoDeposit => { + GeneratedField::CommunityPoolDeposit => { if action_view__.is_some() { - return Err(serde::de::Error::duplicate_field("daoDeposit")); + return Err(serde::de::Error::duplicate_field("communityPoolDeposit")); } - action_view__ = map_.next_value::<::std::option::Option<_>>()?.map(action_view::ActionView::DaoDeposit) + action_view__ = map_.next_value::<::std::option::Option<_>>()?.map(action_view::ActionView::CommunityPoolDeposit) ; } GeneratedField::UndelegateClaim => { @@ -1507,7 +1507,7 @@ impl<'de> serde::Deserialize<'de> for DetectionData { deserializer.deserialize_struct("penumbra.core.transaction.v1alpha1.DetectionData", FIELDS, GeneratedVisitor) } } -impl serde::Serialize for EffectHash { +impl serde::Serialize for DetectionDataPlan { #[allow(deprecated)] fn serialize(&self, serializer: S) -> std::result::Result where @@ -1515,124 +1515,30 @@ impl serde::Serialize for EffectHash { { use serde::ser::SerializeStruct; let mut len = 0; - if !self.inner.is_empty() { - len += 1; - } - let mut struct_ser = serializer.serialize_struct("penumbra.core.transaction.v1alpha1.EffectHash", len)?; - if !self.inner.is_empty() { - #[allow(clippy::needless_borrow)] - struct_ser.serialize_field("inner", pbjson::private::base64::encode(&self.inner).as_str())?; - } - struct_ser.end() - } -} -impl<'de> serde::Deserialize<'de> for EffectHash { - #[allow(deprecated)] - fn deserialize(deserializer: D) -> std::result::Result - where - D: serde::Deserializer<'de>, - { - const FIELDS: &[&str] = &[ - "inner", - ]; - - #[allow(clippy::enum_variant_names)] - enum GeneratedField { - Inner, - } - impl<'de> serde::Deserialize<'de> for GeneratedField { - fn deserialize(deserializer: D) -> std::result::Result - where - D: serde::Deserializer<'de>, - { - struct GeneratedVisitor; - - impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { - type Value = GeneratedField; - - fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - write!(formatter, "expected one of: {:?}", &FIELDS) - } - - #[allow(unused_variables)] - fn visit_str(self, value: &str) -> std::result::Result - where - E: serde::de::Error, - { - match value { - "inner" => Ok(GeneratedField::Inner), - _ => Err(serde::de::Error::unknown_field(value, FIELDS)), - } - } - } - deserializer.deserialize_identifier(GeneratedVisitor) - } - } - struct GeneratedVisitor; - impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { - type Value = EffectHash; - - fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - formatter.write_str("struct penumbra.core.transaction.v1alpha1.EffectHash") - } - - fn visit_map(self, mut map_: V) -> std::result::Result - where - V: serde::de::MapAccess<'de>, - { - let mut inner__ = None; - while let Some(k) = map_.next_key()? { - match k { - GeneratedField::Inner => { - if inner__.is_some() { - return Err(serde::de::Error::duplicate_field("inner")); - } - inner__ = - Some(map_.next_value::<::pbjson::private::BytesDeserialize<_>>()?.0) - ; - } - } - } - Ok(EffectHash { - inner: inner__.unwrap_or_default(), - }) - } - } - deserializer.deserialize_struct("penumbra.core.transaction.v1alpha1.EffectHash", FIELDS, GeneratedVisitor) - } -} -impl serde::Serialize for Id { - #[allow(deprecated)] - fn serialize(&self, serializer: S) -> std::result::Result - where - S: serde::Serializer, - { - use serde::ser::SerializeStruct; - let mut len = 0; - if !self.hash.is_empty() { + if !self.clue_plans.is_empty() { len += 1; } - let mut struct_ser = serializer.serialize_struct("penumbra.core.transaction.v1alpha1.Id", len)?; - if !self.hash.is_empty() { - #[allow(clippy::needless_borrow)] - struct_ser.serialize_field("hash", pbjson::private::base64::encode(&self.hash).as_str())?; + let mut struct_ser = serializer.serialize_struct("penumbra.core.transaction.v1alpha1.DetectionDataPlan", len)?; + if !self.clue_plans.is_empty() { + struct_ser.serialize_field("cluePlans", &self.clue_plans)?; } struct_ser.end() } } -impl<'de> serde::Deserialize<'de> for Id { +impl<'de> serde::Deserialize<'de> for DetectionDataPlan { #[allow(deprecated)] fn deserialize(deserializer: D) -> std::result::Result where D: serde::Deserializer<'de>, { const FIELDS: &[&str] = &[ - "hash", + "clue_plans", + "cluePlans", ]; #[allow(clippy::enum_variant_names)] enum GeneratedField { - Hash, + CluePlans, } impl<'de> serde::Deserialize<'de> for GeneratedField { fn deserialize(deserializer: D) -> std::result::Result @@ -1654,7 +1560,7 @@ impl<'de> serde::Deserialize<'de> for Id { E: serde::de::Error, { match value { - "hash" => Ok(GeneratedField::Hash), + "cluePlans" | "clue_plans" => Ok(GeneratedField::CluePlans), _ => Err(serde::de::Error::unknown_field(value, FIELDS)), } } @@ -1664,35 +1570,33 @@ impl<'de> serde::Deserialize<'de> for Id { } struct GeneratedVisitor; impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { - type Value = Id; + type Value = DetectionDataPlan; fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - formatter.write_str("struct penumbra.core.transaction.v1alpha1.Id") + formatter.write_str("struct penumbra.core.transaction.v1alpha1.DetectionDataPlan") } - fn visit_map(self, mut map_: V) -> std::result::Result + fn visit_map(self, mut map_: V) -> std::result::Result where V: serde::de::MapAccess<'de>, { - let mut hash__ = None; + let mut clue_plans__ = None; while let Some(k) = map_.next_key()? { match k { - GeneratedField::Hash => { - if hash__.is_some() { - return Err(serde::de::Error::duplicate_field("hash")); + GeneratedField::CluePlans => { + if clue_plans__.is_some() { + return Err(serde::de::Error::duplicate_field("cluePlans")); } - hash__ = - Some(map_.next_value::<::pbjson::private::BytesDeserialize<_>>()?.0) - ; + clue_plans__ = Some(map_.next_value()?); } } } - Ok(Id { - hash: hash__.unwrap_or_default(), + Ok(DetectionDataPlan { + clue_plans: clue_plans__.unwrap_or_default(), }) } } - deserializer.deserialize_struct("penumbra.core.transaction.v1alpha1.Id", FIELDS, GeneratedVisitor) + deserializer.deserialize_struct("penumbra.core.transaction.v1alpha1.DetectionDataPlan", FIELDS, GeneratedVisitor) } } impl serde::Serialize for MemoCiphertext { @@ -1789,101 +1693,6 @@ impl<'de> serde::Deserialize<'de> for MemoCiphertext { deserializer.deserialize_struct("penumbra.core.transaction.v1alpha1.MemoCiphertext", FIELDS, GeneratedVisitor) } } -impl serde::Serialize for MemoData { - #[allow(deprecated)] - fn serialize(&self, serializer: S) -> std::result::Result - where - S: serde::Serializer, - { - use serde::ser::SerializeStruct; - let mut len = 0; - if !self.encrypted_memo.is_empty() { - len += 1; - } - let mut struct_ser = serializer.serialize_struct("penumbra.core.transaction.v1alpha1.MemoData", len)?; - if !self.encrypted_memo.is_empty() { - #[allow(clippy::needless_borrow)] - struct_ser.serialize_field("encryptedMemo", pbjson::private::base64::encode(&self.encrypted_memo).as_str())?; - } - struct_ser.end() - } -} -impl<'de> serde::Deserialize<'de> for MemoData { - #[allow(deprecated)] - fn deserialize(deserializer: D) -> std::result::Result - where - D: serde::Deserializer<'de>, - { - const FIELDS: &[&str] = &[ - "encrypted_memo", - "encryptedMemo", - ]; - - #[allow(clippy::enum_variant_names)] - enum GeneratedField { - EncryptedMemo, - } - impl<'de> serde::Deserialize<'de> for GeneratedField { - fn deserialize(deserializer: D) -> std::result::Result - where - D: serde::Deserializer<'de>, - { - struct GeneratedVisitor; - - impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { - type Value = GeneratedField; - - fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - write!(formatter, "expected one of: {:?}", &FIELDS) - } - - #[allow(unused_variables)] - fn visit_str(self, value: &str) -> std::result::Result - where - E: serde::de::Error, - { - match value { - "encryptedMemo" | "encrypted_memo" => Ok(GeneratedField::EncryptedMemo), - _ => Err(serde::de::Error::unknown_field(value, FIELDS)), - } - } - } - deserializer.deserialize_identifier(GeneratedVisitor) - } - } - struct GeneratedVisitor; - impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { - type Value = MemoData; - - fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - formatter.write_str("struct penumbra.core.transaction.v1alpha1.MemoData") - } - - fn visit_map(self, mut map_: V) -> std::result::Result - where - V: serde::de::MapAccess<'de>, - { - let mut encrypted_memo__ = None; - while let Some(k) = map_.next_key()? { - match k { - GeneratedField::EncryptedMemo => { - if encrypted_memo__.is_some() { - return Err(serde::de::Error::duplicate_field("encryptedMemo")); - } - encrypted_memo__ = - Some(map_.next_value::<::pbjson::private::BytesDeserialize<_>>()?.0) - ; - } - } - } - Ok(MemoData { - encrypted_memo: encrypted_memo__.unwrap_or_default(), - }) - } - } - deserializer.deserialize_struct("penumbra.core.transaction.v1alpha1.MemoData", FIELDS, GeneratedVisitor) - } -} impl serde::Serialize for MemoPlaintext { #[allow(deprecated)] fn serialize(&self, serializer: S) -> std::result::Result @@ -2749,7 +2558,7 @@ impl serde::Serialize for Transaction { if self.body.is_some() { len += 1; } - if !self.binding_sig.is_empty() { + if self.binding_sig.is_some() { len += 1; } if self.anchor.is_some() { @@ -2759,9 +2568,8 @@ impl serde::Serialize for Transaction { if let Some(v) = self.body.as_ref() { struct_ser.serialize_field("body", v)?; } - if !self.binding_sig.is_empty() { - #[allow(clippy::needless_borrow)] - struct_ser.serialize_field("bindingSig", pbjson::private::base64::encode(&self.binding_sig).as_str())?; + if let Some(v) = self.binding_sig.as_ref() { + struct_ser.serialize_field("bindingSig", v)?; } if let Some(v) = self.anchor.as_ref() { struct_ser.serialize_field("anchor", v)?; @@ -2845,9 +2653,7 @@ impl<'de> serde::Deserialize<'de> for Transaction { if binding_sig__.is_some() { return Err(serde::de::Error::duplicate_field("bindingSig")); } - binding_sig__ = - Some(map_.next_value::<::pbjson::private::BytesDeserialize<_>>()?.0) - ; + binding_sig__ = map_.next_value()?; } GeneratedField::Anchor => { if anchor__.is_some() { @@ -2859,7 +2665,7 @@ impl<'de> serde::Deserialize<'de> for Transaction { } Ok(Transaction { body: body__, - binding_sig: binding_sig__.unwrap_or_default(), + binding_sig: binding_sig__, anchor: anchor__, }) } @@ -2881,13 +2687,10 @@ impl serde::Serialize for TransactionBody { if self.transaction_parameters.is_some() { len += 1; } - if self.fee.is_some() { - len += 1; - } if self.detection_data.is_some() { len += 1; } - if self.memo_data.is_some() { + if self.memo.is_some() { len += 1; } let mut struct_ser = serializer.serialize_struct("penumbra.core.transaction.v1alpha1.TransactionBody", len)?; @@ -2897,14 +2700,11 @@ impl serde::Serialize for TransactionBody { if let Some(v) = self.transaction_parameters.as_ref() { struct_ser.serialize_field("transactionParameters", v)?; } - if let Some(v) = self.fee.as_ref() { - struct_ser.serialize_field("fee", v)?; - } if let Some(v) = self.detection_data.as_ref() { struct_ser.serialize_field("detectionData", v)?; } - if let Some(v) = self.memo_data.as_ref() { - struct_ser.serialize_field("memoData", v)?; + if let Some(v) = self.memo.as_ref() { + struct_ser.serialize_field("memo", v)?; } struct_ser.end() } @@ -2919,20 +2719,17 @@ impl<'de> serde::Deserialize<'de> for TransactionBody { "actions", "transaction_parameters", "transactionParameters", - "fee", "detection_data", "detectionData", - "memo_data", - "memoData", + "memo", ]; #[allow(clippy::enum_variant_names)] enum GeneratedField { Actions, TransactionParameters, - Fee, DetectionData, - MemoData, + Memo, } impl<'de> serde::Deserialize<'de> for GeneratedField { fn deserialize(deserializer: D) -> std::result::Result @@ -2956,9 +2753,8 @@ impl<'de> serde::Deserialize<'de> for TransactionBody { match value { "actions" => Ok(GeneratedField::Actions), "transactionParameters" | "transaction_parameters" => Ok(GeneratedField::TransactionParameters), - "fee" => Ok(GeneratedField::Fee), "detectionData" | "detection_data" => Ok(GeneratedField::DetectionData), - "memoData" | "memo_data" => Ok(GeneratedField::MemoData), + "memo" => Ok(GeneratedField::Memo), _ => Err(serde::de::Error::unknown_field(value, FIELDS)), } } @@ -2980,9 +2776,8 @@ impl<'de> serde::Deserialize<'de> for TransactionBody { { let mut actions__ = None; let mut transaction_parameters__ = None; - let mut fee__ = None; let mut detection_data__ = None; - let mut memo_data__ = None; + let mut memo__ = None; while let Some(k) = map_.next_key()? { match k { GeneratedField::Actions => { @@ -2997,32 +2792,25 @@ impl<'de> serde::Deserialize<'de> for TransactionBody { } transaction_parameters__ = map_.next_value()?; } - GeneratedField::Fee => { - if fee__.is_some() { - return Err(serde::de::Error::duplicate_field("fee")); - } - fee__ = map_.next_value()?; - } GeneratedField::DetectionData => { if detection_data__.is_some() { return Err(serde::de::Error::duplicate_field("detectionData")); } detection_data__ = map_.next_value()?; } - GeneratedField::MemoData => { - if memo_data__.is_some() { - return Err(serde::de::Error::duplicate_field("memoData")); + GeneratedField::Memo => { + if memo__.is_some() { + return Err(serde::de::Error::duplicate_field("memo")); } - memo_data__ = map_.next_value()?; + memo__ = map_.next_value()?; } } } Ok(TransactionBody { actions: actions__.unwrap_or_default(), transaction_parameters: transaction_parameters__, - fee: fee__, detection_data: detection_data__, - memo_data: memo_data__, + memo: memo__, }) } } @@ -3043,9 +2831,6 @@ impl serde::Serialize for TransactionBodyView { if self.transaction_parameters.is_some() { len += 1; } - if self.fee.is_some() { - len += 1; - } if self.detection_data.is_some() { len += 1; } @@ -3059,9 +2844,6 @@ impl serde::Serialize for TransactionBodyView { if let Some(v) = self.transaction_parameters.as_ref() { struct_ser.serialize_field("transactionParameters", v)?; } - if let Some(v) = self.fee.as_ref() { - struct_ser.serialize_field("fee", v)?; - } if let Some(v) = self.detection_data.as_ref() { struct_ser.serialize_field("detectionData", v)?; } @@ -3082,7 +2864,6 @@ impl<'de> serde::Deserialize<'de> for TransactionBodyView { "actionViews", "transaction_parameters", "transactionParameters", - "fee", "detection_data", "detectionData", "memo_view", @@ -3093,7 +2874,6 @@ impl<'de> serde::Deserialize<'de> for TransactionBodyView { enum GeneratedField { ActionViews, TransactionParameters, - Fee, DetectionData, MemoView, } @@ -3119,7 +2899,6 @@ impl<'de> serde::Deserialize<'de> for TransactionBodyView { match value { "actionViews" | "action_views" => Ok(GeneratedField::ActionViews), "transactionParameters" | "transaction_parameters" => Ok(GeneratedField::TransactionParameters), - "fee" => Ok(GeneratedField::Fee), "detectionData" | "detection_data" => Ok(GeneratedField::DetectionData), "memoView" | "memo_view" => Ok(GeneratedField::MemoView), _ => Err(serde::de::Error::unknown_field(value, FIELDS)), @@ -3143,7 +2922,6 @@ impl<'de> serde::Deserialize<'de> for TransactionBodyView { { let mut action_views__ = None; let mut transaction_parameters__ = None; - let mut fee__ = None; let mut detection_data__ = None; let mut memo_view__ = None; while let Some(k) = map_.next_key()? { @@ -3160,12 +2938,6 @@ impl<'de> serde::Deserialize<'de> for TransactionBodyView { } transaction_parameters__ = map_.next_value()?; } - GeneratedField::Fee => { - if fee__.is_some() { - return Err(serde::de::Error::duplicate_field("fee")); - } - fee__ = map_.next_value()?; - } GeneratedField::DetectionData => { if detection_data__.is_some() { return Err(serde::de::Error::duplicate_field("detectionData")); @@ -3183,7 +2955,6 @@ impl<'de> serde::Deserialize<'de> for TransactionBodyView { Ok(TransactionBodyView { action_views: action_views__.unwrap_or_default(), transaction_parameters: transaction_parameters__, - fee: fee__, detection_data: detection_data__, memo_view: memo_view__, }) @@ -3206,6 +2977,9 @@ impl serde::Serialize for TransactionParameters { if !self.chain_id.is_empty() { len += 1; } + if self.fee.is_some() { + len += 1; + } let mut struct_ser = serializer.serialize_struct("penumbra.core.transaction.v1alpha1.TransactionParameters", len)?; if self.expiry_height != 0 { #[allow(clippy::needless_borrow)] @@ -3214,6 +2988,9 @@ impl serde::Serialize for TransactionParameters { if !self.chain_id.is_empty() { struct_ser.serialize_field("chainId", &self.chain_id)?; } + if let Some(v) = self.fee.as_ref() { + struct_ser.serialize_field("fee", v)?; + } struct_ser.end() } } @@ -3228,12 +3005,14 @@ impl<'de> serde::Deserialize<'de> for TransactionParameters { "expiryHeight", "chain_id", "chainId", + "fee", ]; #[allow(clippy::enum_variant_names)] enum GeneratedField { ExpiryHeight, ChainId, + Fee, } impl<'de> serde::Deserialize<'de> for GeneratedField { fn deserialize(deserializer: D) -> std::result::Result @@ -3257,6 +3036,7 @@ impl<'de> serde::Deserialize<'de> for TransactionParameters { match value { "expiryHeight" | "expiry_height" => Ok(GeneratedField::ExpiryHeight), "chainId" | "chain_id" => Ok(GeneratedField::ChainId), + "fee" => Ok(GeneratedField::Fee), _ => Err(serde::de::Error::unknown_field(value, FIELDS)), } } @@ -3278,6 +3058,7 @@ impl<'de> serde::Deserialize<'de> for TransactionParameters { { let mut expiry_height__ = None; let mut chain_id__ = None; + let mut fee__ = None; while let Some(k) = map_.next_key()? { match k { GeneratedField::ExpiryHeight => { @@ -3294,11 +3075,18 @@ impl<'de> serde::Deserialize<'de> for TransactionParameters { } chain_id__ = Some(map_.next_value()?); } + GeneratedField::Fee => { + if fee__.is_some() { + return Err(serde::de::Error::duplicate_field("fee")); + } + fee__ = map_.next_value()?; + } } } Ok(TransactionParameters { expiry_height: expiry_height__.unwrap_or_default(), chain_id: chain_id__.unwrap_or_default(), + fee: fee__, }) } } @@ -3497,40 +3285,27 @@ impl serde::Serialize for TransactionPlan { if !self.actions.is_empty() { len += 1; } - if self.expiry_height != 0 { - len += 1; - } - if !self.chain_id.is_empty() { - len += 1; - } - if self.fee.is_some() { + if self.transaction_parameters.is_some() { len += 1; } - if !self.clue_plans.is_empty() { + if self.detection_data.is_some() { len += 1; } - if self.memo_plan.is_some() { + if self.memo.is_some() { len += 1; } let mut struct_ser = serializer.serialize_struct("penumbra.core.transaction.v1alpha1.TransactionPlan", len)?; if !self.actions.is_empty() { struct_ser.serialize_field("actions", &self.actions)?; } - if self.expiry_height != 0 { - #[allow(clippy::needless_borrow)] - struct_ser.serialize_field("expiryHeight", ToString::to_string(&self.expiry_height).as_str())?; - } - if !self.chain_id.is_empty() { - struct_ser.serialize_field("chainId", &self.chain_id)?; - } - if let Some(v) = self.fee.as_ref() { - struct_ser.serialize_field("fee", v)?; + if let Some(v) = self.transaction_parameters.as_ref() { + struct_ser.serialize_field("transactionParameters", v)?; } - if !self.clue_plans.is_empty() { - struct_ser.serialize_field("cluePlans", &self.clue_plans)?; + if let Some(v) = self.detection_data.as_ref() { + struct_ser.serialize_field("detectionData", v)?; } - if let Some(v) = self.memo_plan.as_ref() { - struct_ser.serialize_field("memoPlan", v)?; + if let Some(v) = self.memo.as_ref() { + struct_ser.serialize_field("memo", v)?; } struct_ser.end() } @@ -3543,25 +3318,19 @@ impl<'de> serde::Deserialize<'de> for TransactionPlan { { const FIELDS: &[&str] = &[ "actions", - "expiry_height", - "expiryHeight", - "chain_id", - "chainId", - "fee", - "clue_plans", - "cluePlans", - "memo_plan", - "memoPlan", + "transaction_parameters", + "transactionParameters", + "detection_data", + "detectionData", + "memo", ]; #[allow(clippy::enum_variant_names)] enum GeneratedField { Actions, - ExpiryHeight, - ChainId, - Fee, - CluePlans, - MemoPlan, + TransactionParameters, + DetectionData, + Memo, } impl<'de> serde::Deserialize<'de> for GeneratedField { fn deserialize(deserializer: D) -> std::result::Result @@ -3584,11 +3353,9 @@ impl<'de> serde::Deserialize<'de> for TransactionPlan { { match value { "actions" => Ok(GeneratedField::Actions), - "expiryHeight" | "expiry_height" => Ok(GeneratedField::ExpiryHeight), - "chainId" | "chain_id" => Ok(GeneratedField::ChainId), - "fee" => Ok(GeneratedField::Fee), - "cluePlans" | "clue_plans" => Ok(GeneratedField::CluePlans), - "memoPlan" | "memo_plan" => Ok(GeneratedField::MemoPlan), + "transactionParameters" | "transaction_parameters" => Ok(GeneratedField::TransactionParameters), + "detectionData" | "detection_data" => Ok(GeneratedField::DetectionData), + "memo" => Ok(GeneratedField::Memo), _ => Err(serde::de::Error::unknown_field(value, FIELDS)), } } @@ -3609,11 +3376,9 @@ impl<'de> serde::Deserialize<'de> for TransactionPlan { V: serde::de::MapAccess<'de>, { let mut actions__ = None; - let mut expiry_height__ = None; - let mut chain_id__ = None; - let mut fee__ = None; - let mut clue_plans__ = None; - let mut memo_plan__ = None; + let mut transaction_parameters__ = None; + let mut detection_data__ = None; + let mut memo__ = None; while let Some(k) = map_.next_key()? { match k { GeneratedField::Actions => { @@ -3622,47 +3387,31 @@ impl<'de> serde::Deserialize<'de> for TransactionPlan { } actions__ = Some(map_.next_value()?); } - GeneratedField::ExpiryHeight => { - if expiry_height__.is_some() { - return Err(serde::de::Error::duplicate_field("expiryHeight")); - } - expiry_height__ = - Some(map_.next_value::<::pbjson::private::NumberDeserialize<_>>()?.0) - ; - } - GeneratedField::ChainId => { - if chain_id__.is_some() { - return Err(serde::de::Error::duplicate_field("chainId")); - } - chain_id__ = Some(map_.next_value()?); - } - GeneratedField::Fee => { - if fee__.is_some() { - return Err(serde::de::Error::duplicate_field("fee")); + GeneratedField::TransactionParameters => { + if transaction_parameters__.is_some() { + return Err(serde::de::Error::duplicate_field("transactionParameters")); } - fee__ = map_.next_value()?; + transaction_parameters__ = map_.next_value()?; } - GeneratedField::CluePlans => { - if clue_plans__.is_some() { - return Err(serde::de::Error::duplicate_field("cluePlans")); + GeneratedField::DetectionData => { + if detection_data__.is_some() { + return Err(serde::de::Error::duplicate_field("detectionData")); } - clue_plans__ = Some(map_.next_value()?); + detection_data__ = map_.next_value()?; } - GeneratedField::MemoPlan => { - if memo_plan__.is_some() { - return Err(serde::de::Error::duplicate_field("memoPlan")); + GeneratedField::Memo => { + if memo__.is_some() { + return Err(serde::de::Error::duplicate_field("memo")); } - memo_plan__ = map_.next_value()?; + memo__ = map_.next_value()?; } } } Ok(TransactionPlan { actions: actions__.unwrap_or_default(), - expiry_height: expiry_height__.unwrap_or_default(), - chain_id: chain_id__.unwrap_or_default(), - fee: fee__, - clue_plans: clue_plans__.unwrap_or_default(), - memo_plan: memo_plan__, + transaction_parameters: transaction_parameters__, + detection_data: detection_data__, + memo: memo__, }) } } @@ -3680,7 +3429,7 @@ impl serde::Serialize for TransactionView { if self.body_view.is_some() { len += 1; } - if !self.binding_sig.is_empty() { + if self.binding_sig.is_some() { len += 1; } if self.anchor.is_some() { @@ -3690,9 +3439,8 @@ impl serde::Serialize for TransactionView { if let Some(v) = self.body_view.as_ref() { struct_ser.serialize_field("bodyView", v)?; } - if !self.binding_sig.is_empty() { - #[allow(clippy::needless_borrow)] - struct_ser.serialize_field("bindingSig", pbjson::private::base64::encode(&self.binding_sig).as_str())?; + if let Some(v) = self.binding_sig.as_ref() { + struct_ser.serialize_field("bindingSig", v)?; } if let Some(v) = self.anchor.as_ref() { struct_ser.serialize_field("anchor", v)?; @@ -3777,9 +3525,7 @@ impl<'de> serde::Deserialize<'de> for TransactionView { if binding_sig__.is_some() { return Err(serde::de::Error::duplicate_field("bindingSig")); } - binding_sig__ = - Some(map_.next_value::<::pbjson::private::BytesDeserialize<_>>()?.0) - ; + binding_sig__ = map_.next_value()?; } GeneratedField::Anchor => { if anchor__.is_some() { @@ -3791,7 +3537,7 @@ impl<'de> serde::Deserialize<'de> for TransactionView { } Ok(TransactionView { body_view: body_view__, - binding_sig: binding_sig__.unwrap_or_default(), + binding_sig: binding_sig__, anchor: anchor__, }) } diff --git a/crates/proto/src/gen/penumbra.core.txhash.v1alpha1.rs b/crates/proto/src/gen/penumbra.core.txhash.v1alpha1.rs new file mode 100644 index 0000000000..431eb9954a --- /dev/null +++ b/crates/proto/src/gen/penumbra.core.txhash.v1alpha1.rs @@ -0,0 +1,31 @@ +/// The hash of a Penumbra transaction's *effecting data*, describing the effects +/// of the transaction on the chain state. +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct EffectHash { + #[prost(bytes = "vec", tag = "1")] + pub inner: ::prost::alloc::vec::Vec, +} +impl ::prost::Name for EffectHash { + const NAME: &'static str = "EffectHash"; + const PACKAGE: &'static str = "penumbra.core.txhash.v1alpha1"; + fn full_name() -> ::prost::alloc::string::String { + ::prost::alloc::format!("penumbra.core.txhash.v1alpha1.{}", Self::NAME) + } +} +/// A transaction ID, the Sha256 hash of a transaction. +/// +/// This is the hash of the plain byte encoding, used by Tendermint. +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct TransactionId { + #[prost(bytes = "vec", tag = "1")] + pub inner: ::prost::alloc::vec::Vec, +} +impl ::prost::Name for TransactionId { + const NAME: &'static str = "TransactionId"; + const PACKAGE: &'static str = "penumbra.core.txhash.v1alpha1"; + fn full_name() -> ::prost::alloc::string::String { + ::prost::alloc::format!("penumbra.core.txhash.v1alpha1.{}", Self::NAME) + } +} diff --git a/crates/proto/src/gen/penumbra.core.txhash.v1alpha1.serde.rs b/crates/proto/src/gen/penumbra.core.txhash.v1alpha1.serde.rs new file mode 100644 index 0000000000..e73d476268 --- /dev/null +++ b/crates/proto/src/gen/penumbra.core.txhash.v1alpha1.serde.rs @@ -0,0 +1,188 @@ +impl serde::Serialize for EffectHash { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let mut len = 0; + if !self.inner.is_empty() { + len += 1; + } + let mut struct_ser = serializer.serialize_struct("penumbra.core.txhash.v1alpha1.EffectHash", len)?; + if !self.inner.is_empty() { + #[allow(clippy::needless_borrow)] + struct_ser.serialize_field("inner", pbjson::private::base64::encode(&self.inner).as_str())?; + } + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for EffectHash { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "inner", + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + Inner, + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "inner" => Ok(GeneratedField::Inner), + _ => Err(serde::de::Error::unknown_field(value, FIELDS)), + } + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = EffectHash; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct penumbra.core.txhash.v1alpha1.EffectHash") + } + + fn visit_map(self, mut map_: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + let mut inner__ = None; + while let Some(k) = map_.next_key()? { + match k { + GeneratedField::Inner => { + if inner__.is_some() { + return Err(serde::de::Error::duplicate_field("inner")); + } + inner__ = + Some(map_.next_value::<::pbjson::private::BytesDeserialize<_>>()?.0) + ; + } + } + } + Ok(EffectHash { + inner: inner__.unwrap_or_default(), + }) + } + } + deserializer.deserialize_struct("penumbra.core.txhash.v1alpha1.EffectHash", FIELDS, GeneratedVisitor) + } +} +impl serde::Serialize for TransactionId { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let mut len = 0; + if !self.inner.is_empty() { + len += 1; + } + let mut struct_ser = serializer.serialize_struct("penumbra.core.txhash.v1alpha1.TransactionId", len)?; + if !self.inner.is_empty() { + #[allow(clippy::needless_borrow)] + struct_ser.serialize_field("inner", pbjson::private::base64::encode(&self.inner).as_str())?; + } + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for TransactionId { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "inner", + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + Inner, + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "inner" => Ok(GeneratedField::Inner), + _ => Err(serde::de::Error::unknown_field(value, FIELDS)), + } + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = TransactionId; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct penumbra.core.txhash.v1alpha1.TransactionId") + } + + fn visit_map(self, mut map_: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + let mut inner__ = None; + while let Some(k) = map_.next_key()? { + match k { + GeneratedField::Inner => { + if inner__.is_some() { + return Err(serde::de::Error::duplicate_field("inner")); + } + inner__ = + Some(map_.next_value::<::pbjson::private::BytesDeserialize<_>>()?.0) + ; + } + } + } + Ok(TransactionId { + inner: inner__.unwrap_or_default(), + }) + } + } + deserializer.deserialize_struct("penumbra.core.txhash.v1alpha1.TransactionId", FIELDS, GeneratedVisitor) + } +} diff --git a/crates/proto/src/gen/penumbra.crypto.decaf377_rdsa.v1alpha1.rs b/crates/proto/src/gen/penumbra.crypto.decaf377_rdsa.v1alpha1.rs index 39a6ae9649..bb6c74838a 100644 --- a/crates/proto/src/gen/penumbra.crypto.decaf377_rdsa.v1alpha1.rs +++ b/crates/proto/src/gen/penumbra.crypto.decaf377_rdsa.v1alpha1.rs @@ -24,3 +24,16 @@ impl ::prost::Name for BindingSignature { ::prost::alloc::format!("penumbra.crypto.decaf377_rdsa.v1alpha1.{}", Self::NAME) } } +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct SpendVerificationKey { + #[prost(bytes = "vec", tag = "1")] + pub inner: ::prost::alloc::vec::Vec, +} +impl ::prost::Name for SpendVerificationKey { + const NAME: &'static str = "SpendVerificationKey"; + const PACKAGE: &'static str = "penumbra.crypto.decaf377_rdsa.v1alpha1"; + fn full_name() -> ::prost::alloc::string::String { + ::prost::alloc::format!("penumbra.crypto.decaf377_rdsa.v1alpha1.{}", Self::NAME) + } +} diff --git a/crates/proto/src/gen/penumbra.crypto.decaf377_rdsa.v1alpha1.serde.rs b/crates/proto/src/gen/penumbra.crypto.decaf377_rdsa.v1alpha1.serde.rs index f8bb3c4ed6..491fb8cdc2 100644 --- a/crates/proto/src/gen/penumbra.crypto.decaf377_rdsa.v1alpha1.serde.rs +++ b/crates/proto/src/gen/penumbra.crypto.decaf377_rdsa.v1alpha1.serde.rs @@ -186,3 +186,97 @@ impl<'de> serde::Deserialize<'de> for SpendAuthSignature { deserializer.deserialize_struct("penumbra.crypto.decaf377_rdsa.v1alpha1.SpendAuthSignature", FIELDS, GeneratedVisitor) } } +impl serde::Serialize for SpendVerificationKey { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let mut len = 0; + if !self.inner.is_empty() { + len += 1; + } + let mut struct_ser = serializer.serialize_struct("penumbra.crypto.decaf377_rdsa.v1alpha1.SpendVerificationKey", len)?; + if !self.inner.is_empty() { + #[allow(clippy::needless_borrow)] + struct_ser.serialize_field("inner", pbjson::private::base64::encode(&self.inner).as_str())?; + } + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for SpendVerificationKey { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "inner", + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + Inner, + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "inner" => Ok(GeneratedField::Inner), + _ => Err(serde::de::Error::unknown_field(value, FIELDS)), + } + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = SpendVerificationKey; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct penumbra.crypto.decaf377_rdsa.v1alpha1.SpendVerificationKey") + } + + fn visit_map(self, mut map_: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + let mut inner__ = None; + while let Some(k) = map_.next_key()? { + match k { + GeneratedField::Inner => { + if inner__.is_some() { + return Err(serde::de::Error::duplicate_field("inner")); + } + inner__ = + Some(map_.next_value::<::pbjson::private::BytesDeserialize<_>>()?.0) + ; + } + } + } + Ok(SpendVerificationKey { + inner: inner__.unwrap_or_default(), + }) + } + } + deserializer.deserialize_struct("penumbra.crypto.decaf377_rdsa.v1alpha1.SpendVerificationKey", FIELDS, GeneratedVisitor) + } +} diff --git a/crates/proto/src/gen/penumbra.view.v1alpha1.rs b/crates/proto/src/gen/penumbra.view.v1alpha1.rs index f887f5dc95..8c8f9fe4fb 100644 --- a/crates/proto/src/gen/penumbra.view.v1alpha1.rs +++ b/crates/proto/src/gen/penumbra.view.v1alpha1.rs @@ -59,7 +59,7 @@ impl ::prost::Name for BroadcastTransactionRequest { pub struct BroadcastTransactionResponse { /// The hash of the transaction that was broadcast. #[prost(message, optional, tag = "1")] - pub id: ::core::option::Option, + pub id: ::core::option::Option, /// The height in which the transaction was detected as included in the chain, if any. /// Will not be included unless await_detection was true. #[prost(uint64, tag = "2")] @@ -90,9 +90,6 @@ pub struct TransactionPlannerRequest { /// If present, only spends funds from the given account. #[prost(message, optional, tag = "4")] pub source: ::core::option::Option, - /// Optionally identifies the wallet id to query. - #[prost(message, optional, tag = "14")] - pub wallet_id: ::core::option::Option, /// Request contents #[prost(message, repeated, tag = "20")] pub outputs: ::prost::alloc::vec::Vec, @@ -484,54 +481,10 @@ impl ::prost::Name for BalancesResponse { ::prost::alloc::format!("penumbra.view.v1alpha1.{}", Self::NAME) } } -/// Scaffolding for bearer-token authentication for the ViewService. -#[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] -pub struct ViewAuthToken { - #[prost(bytes = "vec", tag = "1")] - pub inner: ::prost::alloc::vec::Vec, -} -impl ::prost::Name for ViewAuthToken { - const NAME: &'static str = "ViewAuthToken"; - const PACKAGE: &'static str = "penumbra.view.v1alpha1"; - fn full_name() -> ::prost::alloc::string::String { - ::prost::alloc::format!("penumbra.view.v1alpha1.{}", Self::NAME) - } -} -#[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] -pub struct ViewAuthRequest { - #[prost(message, optional, tag = "1")] - pub fvk: ::core::option::Option, -} -impl ::prost::Name for ViewAuthRequest { - const NAME: &'static str = "ViewAuthRequest"; - const PACKAGE: &'static str = "penumbra.view.v1alpha1"; - fn full_name() -> ::prost::alloc::string::String { - ::prost::alloc::format!("penumbra.view.v1alpha1.{}", Self::NAME) - } -} -#[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] -pub struct ViewAuthResponse { - #[prost(message, optional, tag = "1")] - pub token: ::core::option::Option, -} -impl ::prost::Name for ViewAuthResponse { - const NAME: &'static str = "ViewAuthResponse"; - const PACKAGE: &'static str = "penumbra.view.v1alpha1"; - fn full_name() -> ::prost::alloc::string::String { - ::prost::alloc::format!("penumbra.view.v1alpha1.{}", Self::NAME) - } -} /// Requests sync status of the view service. #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] -pub struct StatusRequest { - /// Identifies the wallet id to query. - #[prost(message, optional, tag = "14")] - pub wallet_id: ::core::option::Option, -} +pub struct StatusRequest {} impl ::prost::Name for StatusRequest { const NAME: &'static str = "StatusRequest"; const PACKAGE: &'static str = "penumbra.view.v1alpha1"; @@ -563,11 +516,7 @@ impl ::prost::Name for StatusResponse { /// Requests streaming updates on the sync height until the view service is synchronized. #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] -pub struct StatusStreamRequest { - /// Identifies the wallet id to query. - #[prost(message, optional, tag = "14")] - pub wallet_id: ::core::option::Option, -} +pub struct StatusStreamRequest {} impl ::prost::Name for StatusStreamRequest { const NAME: &'static str = "StatusStreamRequest"; const PACKAGE: &'static str = "penumbra.view.v1alpha1"; @@ -621,9 +570,6 @@ pub struct NotesRequest { pub amount_to_spend: ::core::option::Option< super::super::core::num::v1alpha1::Amount, >, - /// Identifies the wallet id to query. - #[prost(message, optional, tag = "14")] - pub wallet_id: ::core::option::Option, } impl ::prost::Name for NotesRequest { const NAME: &'static str = "NotesRequest"; @@ -644,9 +590,6 @@ pub struct NotesForVotingRequest { pub address_index: ::core::option::Option< super::super::core::keys::v1alpha1::AddressIndex, >, - /// Identifies the wallet id to query. - #[prost(message, optional, tag = "14")] - pub wallet_id: ::core::option::Option, } impl ::prost::Name for NotesForVotingRequest { const NAME: &'static str = "NotesForVotingRequest"; @@ -668,9 +611,6 @@ pub struct WitnessRequest { pub transaction_plan: ::core::option::Option< super::super::core::transaction::v1alpha1::TransactionPlan, >, - /// Identifies the wallet id to query. - #[prost(message, optional, tag = "14")] - pub wallet_id: ::core::option::Option, } impl ::prost::Name for WitnessRequest { const NAME: &'static str = "WitnessRequest"; @@ -868,9 +808,6 @@ pub struct NoteByCommitmentRequest { /// If set to true, waits to return until the requested note is detected. #[prost(bool, tag = "3")] pub await_detection: bool, - /// Identifies the wallet id to query. - #[prost(message, optional, tag = "14")] - pub wallet_id: ::core::option::Option, } impl ::prost::Name for NoteByCommitmentRequest { const NAME: &'static str = "NoteByCommitmentRequest"; @@ -902,9 +839,6 @@ pub struct SwapByCommitmentRequest { /// If set to true, waits to return until the requested swap is detected. #[prost(bool, tag = "3")] pub await_detection: bool, - /// Identifies the wallet id to query. - #[prost(message, optional, tag = "14")] - pub wallet_id: ::core::option::Option, } impl ::prost::Name for SwapByCommitmentRequest { const NAME: &'static str = "SwapByCommitmentRequest"; @@ -928,11 +862,7 @@ impl ::prost::Name for SwapByCommitmentResponse { } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] -pub struct UnclaimedSwapsRequest { - /// Identifies the wallet id to query. - #[prost(message, optional, tag = "1")] - pub wallet_id: ::core::option::Option, -} +pub struct UnclaimedSwapsRequest {} impl ::prost::Name for UnclaimedSwapsRequest { const NAME: &'static str = "UnclaimedSwapsRequest"; const PACKAGE: &'static str = "penumbra.view.v1alpha1"; @@ -962,9 +892,6 @@ pub struct NullifierStatusRequest { >, #[prost(bool, tag = "3")] pub await_detection: bool, - /// Identifies the wallet id to query. - #[prost(message, optional, tag = "14")] - pub wallet_id: ::core::option::Option, } impl ::prost::Name for NullifierStatusRequest { const NAME: &'static str = "NullifierStatusRequest"; @@ -991,7 +918,7 @@ impl ::prost::Name for NullifierStatusResponse { pub struct TransactionInfoByHashRequest { /// The transaction hash to query for. #[prost(message, optional, tag = "2")] - pub id: ::core::option::Option, + pub id: ::core::option::Option, } impl ::prost::Name for TransactionInfoByHashRequest { const NAME: &'static str = "TransactionInfoByHashRequest"; @@ -1025,7 +952,7 @@ pub struct TransactionInfo { pub height: u64, /// The hash of the transaction. #[prost(message, optional, tag = "2")] - pub id: ::core::option::Option, + pub id: ::core::option::Option, /// The transaction data itself. #[prost(message, optional, tag = "3")] pub transaction: ::core::option::Option< @@ -1232,9 +1159,6 @@ pub mod view_protocol_service_client { /// transaction-related actions, to request data from a view service, which is /// responsible for synchronizing and scanning the public chain state with one or /// more full viewing keys. - /// - /// View protocol requests optionally include the wallet id, used to - /// identify which set of data to query. #[derive(Debug, Clone)] pub struct ViewProtocolServiceClient { inner: tonic::client::Grpc, @@ -2098,121 +2022,6 @@ pub mod view_protocol_service_client { } } } -/// Generated client implementations. -#[cfg(feature = "rpc")] -pub mod view_auth_service_client { - #![allow(unused_variables, dead_code, missing_docs, clippy::let_unit_value)] - use tonic::codegen::*; - use tonic::codegen::http::Uri; - #[derive(Debug, Clone)] - pub struct ViewAuthServiceClient { - inner: tonic::client::Grpc, - } - impl ViewAuthServiceClient { - /// Attempt to create a new client by connecting to a given endpoint. - pub async fn connect(dst: D) -> Result - where - D: TryInto, - D::Error: Into, - { - let conn = tonic::transport::Endpoint::new(dst)?.connect().await?; - Ok(Self::new(conn)) - } - } - impl ViewAuthServiceClient - where - T: tonic::client::GrpcService, - T::Error: Into, - T::ResponseBody: Body + Send + 'static, - ::Error: Into + Send, - { - pub fn new(inner: T) -> Self { - let inner = tonic::client::Grpc::new(inner); - Self { inner } - } - pub fn with_origin(inner: T, origin: Uri) -> Self { - let inner = tonic::client::Grpc::with_origin(inner, origin); - Self { inner } - } - pub fn with_interceptor( - inner: T, - interceptor: F, - ) -> ViewAuthServiceClient> - where - F: tonic::service::Interceptor, - T::ResponseBody: Default, - T: tonic::codegen::Service< - http::Request, - Response = http::Response< - >::ResponseBody, - >, - >, - , - >>::Error: Into + Send + Sync, - { - ViewAuthServiceClient::new(InterceptedService::new(inner, interceptor)) - } - /// Compress requests with the given encoding. - /// - /// This requires the server to support it otherwise it might respond with an - /// error. - #[must_use] - pub fn send_compressed(mut self, encoding: CompressionEncoding) -> Self { - self.inner = self.inner.send_compressed(encoding); - self - } - /// Enable decompressing responses. - #[must_use] - pub fn accept_compressed(mut self, encoding: CompressionEncoding) -> Self { - self.inner = self.inner.accept_compressed(encoding); - self - } - /// Limits the maximum size of a decoded message. - /// - /// Default: `4MB` - #[must_use] - pub fn max_decoding_message_size(mut self, limit: usize) -> Self { - self.inner = self.inner.max_decoding_message_size(limit); - self - } - /// Limits the maximum size of an encoded message. - /// - /// Default: `usize::MAX` - #[must_use] - pub fn max_encoding_message_size(mut self, limit: usize) -> Self { - self.inner = self.inner.max_encoding_message_size(limit); - self - } - pub async fn view_auth( - &mut self, - request: impl tonic::IntoRequest, - ) -> std::result::Result< - tonic::Response, - tonic::Status, - > { - self.inner - .ready() - .await - .map_err(|e| { - tonic::Status::new( - tonic::Code::Unknown, - format!("Service was not ready: {}", e.into()), - ) - })?; - let codec = tonic::codec::ProstCodec::default(); - let path = http::uri::PathAndQuery::from_static( - "/penumbra.view.v1alpha1.ViewAuthService/ViewAuth", - ); - let mut req = request.into_request(); - req.extensions_mut() - .insert( - GrpcMethod::new("penumbra.view.v1alpha1.ViewAuthService", "ViewAuth"), - ); - self.inner.unary(req, path, codec).await - } - } -} /// Generated server implementations. #[cfg(feature = "rpc")] pub mod view_protocol_service_server { @@ -2471,9 +2280,6 @@ pub mod view_protocol_service_server { /// transaction-related actions, to request data from a view service, which is /// responsible for synchronizing and scanning the public chain state with one or /// more full viewing keys. - /// - /// View protocol requests optionally include the wallet id, used to - /// identify which set of data to query. #[derive(Debug)] pub struct ViewProtocolServiceServer { inner: _Inner, @@ -3816,185 +3622,3 @@ pub mod view_protocol_service_server { const NAME: &'static str = "penumbra.view.v1alpha1.ViewProtocolService"; } } -/// Generated server implementations. -#[cfg(feature = "rpc")] -pub mod view_auth_service_server { - #![allow(unused_variables, dead_code, missing_docs, clippy::let_unit_value)] - use tonic::codegen::*; - /// Generated trait containing gRPC methods that should be implemented for use with ViewAuthServiceServer. - #[async_trait] - pub trait ViewAuthService: Send + Sync + 'static { - async fn view_auth( - &self, - request: tonic::Request, - ) -> std::result::Result< - tonic::Response, - tonic::Status, - >; - } - #[derive(Debug)] - pub struct ViewAuthServiceServer { - inner: _Inner, - accept_compression_encodings: EnabledCompressionEncodings, - send_compression_encodings: EnabledCompressionEncodings, - max_decoding_message_size: Option, - max_encoding_message_size: Option, - } - struct _Inner(Arc); - impl ViewAuthServiceServer { - pub fn new(inner: T) -> Self { - Self::from_arc(Arc::new(inner)) - } - pub fn from_arc(inner: Arc) -> Self { - let inner = _Inner(inner); - Self { - inner, - accept_compression_encodings: Default::default(), - send_compression_encodings: Default::default(), - max_decoding_message_size: None, - max_encoding_message_size: None, - } - } - pub fn with_interceptor( - inner: T, - interceptor: F, - ) -> InterceptedService - where - F: tonic::service::Interceptor, - { - InterceptedService::new(Self::new(inner), interceptor) - } - /// Enable decompressing requests with the given encoding. - #[must_use] - pub fn accept_compressed(mut self, encoding: CompressionEncoding) -> Self { - self.accept_compression_encodings.enable(encoding); - self - } - /// Compress responses with the given encoding, if the client supports it. - #[must_use] - pub fn send_compressed(mut self, encoding: CompressionEncoding) -> Self { - self.send_compression_encodings.enable(encoding); - self - } - /// Limits the maximum size of a decoded message. - /// - /// Default: `4MB` - #[must_use] - pub fn max_decoding_message_size(mut self, limit: usize) -> Self { - self.max_decoding_message_size = Some(limit); - self - } - /// Limits the maximum size of an encoded message. - /// - /// Default: `usize::MAX` - #[must_use] - pub fn max_encoding_message_size(mut self, limit: usize) -> Self { - self.max_encoding_message_size = Some(limit); - self - } - } - impl tonic::codegen::Service> for ViewAuthServiceServer - where - T: ViewAuthService, - B: Body + Send + 'static, - B::Error: Into + Send + 'static, - { - type Response = http::Response; - type Error = std::convert::Infallible; - type Future = BoxFuture; - fn poll_ready( - &mut self, - _cx: &mut Context<'_>, - ) -> Poll> { - Poll::Ready(Ok(())) - } - fn call(&mut self, req: http::Request) -> Self::Future { - let inner = self.inner.clone(); - match req.uri().path() { - "/penumbra.view.v1alpha1.ViewAuthService/ViewAuth" => { - #[allow(non_camel_case_types)] - struct ViewAuthSvc(pub Arc); - impl< - T: ViewAuthService, - > tonic::server::UnaryService - for ViewAuthSvc { - type Response = super::ViewAuthResponse; - type Future = BoxFuture< - tonic::Response, - tonic::Status, - >; - fn call( - &mut self, - request: tonic::Request, - ) -> Self::Future { - let inner = Arc::clone(&self.0); - let fut = async move { - ::view_auth(&inner, request).await - }; - Box::pin(fut) - } - } - let accept_compression_encodings = self.accept_compression_encodings; - let send_compression_encodings = self.send_compression_encodings; - let max_decoding_message_size = self.max_decoding_message_size; - let max_encoding_message_size = self.max_encoding_message_size; - let inner = self.inner.clone(); - let fut = async move { - let inner = inner.0; - let method = ViewAuthSvc(inner); - let codec = tonic::codec::ProstCodec::default(); - let mut grpc = tonic::server::Grpc::new(codec) - .apply_compression_config( - accept_compression_encodings, - send_compression_encodings, - ) - .apply_max_message_size_config( - max_decoding_message_size, - max_encoding_message_size, - ); - let res = grpc.unary(method, req).await; - Ok(res) - }; - Box::pin(fut) - } - _ => { - Box::pin(async move { - Ok( - http::Response::builder() - .status(200) - .header("grpc-status", "12") - .header("content-type", "application/grpc") - .body(empty_body()) - .unwrap(), - ) - }) - } - } - } - } - impl Clone for ViewAuthServiceServer { - fn clone(&self) -> Self { - let inner = self.inner.clone(); - Self { - inner, - accept_compression_encodings: self.accept_compression_encodings, - send_compression_encodings: self.send_compression_encodings, - max_decoding_message_size: self.max_decoding_message_size, - max_encoding_message_size: self.max_encoding_message_size, - } - } - } - impl Clone for _Inner { - fn clone(&self) -> Self { - Self(Arc::clone(&self.0)) - } - } - impl std::fmt::Debug for _Inner { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - write!(f, "{:?}", self.0) - } - } - impl tonic::server::NamedService for ViewAuthServiceServer { - const NAME: &'static str = "penumbra.view.v1alpha1.ViewAuthService"; - } -} diff --git a/crates/proto/src/gen/penumbra.view.v1alpha1.serde.rs b/crates/proto/src/gen/penumbra.view.v1alpha1.serde.rs index ba13d30305..2b179533b3 100644 --- a/crates/proto/src/gen/penumbra.view.v1alpha1.serde.rs +++ b/crates/proto/src/gen/penumbra.view.v1alpha1.serde.rs @@ -1997,9 +1997,6 @@ impl serde::Serialize for NoteByCommitmentRequest { if self.await_detection { len += 1; } - if self.wallet_id.is_some() { - len += 1; - } let mut struct_ser = serializer.serialize_struct("penumbra.view.v1alpha1.NoteByCommitmentRequest", len)?; if let Some(v) = self.note_commitment.as_ref() { struct_ser.serialize_field("noteCommitment", v)?; @@ -2007,9 +2004,6 @@ impl serde::Serialize for NoteByCommitmentRequest { if self.await_detection { struct_ser.serialize_field("awaitDetection", &self.await_detection)?; } - if let Some(v) = self.wallet_id.as_ref() { - struct_ser.serialize_field("walletId", v)?; - } struct_ser.end() } } @@ -2024,15 +2018,12 @@ impl<'de> serde::Deserialize<'de> for NoteByCommitmentRequest { "noteCommitment", "await_detection", "awaitDetection", - "wallet_id", - "walletId", ]; #[allow(clippy::enum_variant_names)] enum GeneratedField { NoteCommitment, AwaitDetection, - WalletId, } impl<'de> serde::Deserialize<'de> for GeneratedField { fn deserialize(deserializer: D) -> std::result::Result @@ -2056,7 +2047,6 @@ impl<'de> serde::Deserialize<'de> for NoteByCommitmentRequest { match value { "noteCommitment" | "note_commitment" => Ok(GeneratedField::NoteCommitment), "awaitDetection" | "await_detection" => Ok(GeneratedField::AwaitDetection), - "walletId" | "wallet_id" => Ok(GeneratedField::WalletId), _ => Err(serde::de::Error::unknown_field(value, FIELDS)), } } @@ -2078,7 +2068,6 @@ impl<'de> serde::Deserialize<'de> for NoteByCommitmentRequest { { let mut note_commitment__ = None; let mut await_detection__ = None; - let mut wallet_id__ = None; while let Some(k) = map_.next_key()? { match k { GeneratedField::NoteCommitment => { @@ -2093,18 +2082,11 @@ impl<'de> serde::Deserialize<'de> for NoteByCommitmentRequest { } await_detection__ = Some(map_.next_value()?); } - GeneratedField::WalletId => { - if wallet_id__.is_some() { - return Err(serde::de::Error::duplicate_field("walletId")); - } - wallet_id__ = map_.next_value()?; - } } } Ok(NoteByCommitmentRequest { note_commitment: note_commitment__, await_detection: await_detection__.unwrap_or_default(), - wallet_id: wallet_id__, }) } } @@ -2217,9 +2199,6 @@ impl serde::Serialize for NotesForVotingRequest { if self.address_index.is_some() { len += 1; } - if self.wallet_id.is_some() { - len += 1; - } let mut struct_ser = serializer.serialize_struct("penumbra.view.v1alpha1.NotesForVotingRequest", len)?; if self.votable_at_height != 0 { #[allow(clippy::needless_borrow)] @@ -2228,9 +2207,6 @@ impl serde::Serialize for NotesForVotingRequest { if let Some(v) = self.address_index.as_ref() { struct_ser.serialize_field("addressIndex", v)?; } - if let Some(v) = self.wallet_id.as_ref() { - struct_ser.serialize_field("walletId", v)?; - } struct_ser.end() } } @@ -2245,15 +2221,12 @@ impl<'de> serde::Deserialize<'de> for NotesForVotingRequest { "votableAtHeight", "address_index", "addressIndex", - "wallet_id", - "walletId", ]; #[allow(clippy::enum_variant_names)] enum GeneratedField { VotableAtHeight, AddressIndex, - WalletId, } impl<'de> serde::Deserialize<'de> for GeneratedField { fn deserialize(deserializer: D) -> std::result::Result @@ -2277,7 +2250,6 @@ impl<'de> serde::Deserialize<'de> for NotesForVotingRequest { match value { "votableAtHeight" | "votable_at_height" => Ok(GeneratedField::VotableAtHeight), "addressIndex" | "address_index" => Ok(GeneratedField::AddressIndex), - "walletId" | "wallet_id" => Ok(GeneratedField::WalletId), _ => Err(serde::de::Error::unknown_field(value, FIELDS)), } } @@ -2299,7 +2271,6 @@ impl<'de> serde::Deserialize<'de> for NotesForVotingRequest { { let mut votable_at_height__ = None; let mut address_index__ = None; - let mut wallet_id__ = None; while let Some(k) = map_.next_key()? { match k { GeneratedField::VotableAtHeight => { @@ -2316,18 +2287,11 @@ impl<'de> serde::Deserialize<'de> for NotesForVotingRequest { } address_index__ = map_.next_value()?; } - GeneratedField::WalletId => { - if wallet_id__.is_some() { - return Err(serde::de::Error::duplicate_field("walletId")); - } - wallet_id__ = map_.next_value()?; - } } } Ok(NotesForVotingRequest { votable_at_height: votable_at_height__.unwrap_or_default(), address_index: address_index__, - wallet_id: wallet_id__, }) } } @@ -2464,9 +2428,6 @@ impl serde::Serialize for NotesRequest { if self.amount_to_spend.is_some() { len += 1; } - if self.wallet_id.is_some() { - len += 1; - } let mut struct_ser = serializer.serialize_struct("penumbra.view.v1alpha1.NotesRequest", len)?; if self.include_spent { struct_ser.serialize_field("includeSpent", &self.include_spent)?; @@ -2480,9 +2441,6 @@ impl serde::Serialize for NotesRequest { if let Some(v) = self.amount_to_spend.as_ref() { struct_ser.serialize_field("amountToSpend", v)?; } - if let Some(v) = self.wallet_id.as_ref() { - struct_ser.serialize_field("walletId", v)?; - } struct_ser.end() } } @@ -2501,8 +2459,6 @@ impl<'de> serde::Deserialize<'de> for NotesRequest { "addressIndex", "amount_to_spend", "amountToSpend", - "wallet_id", - "walletId", ]; #[allow(clippy::enum_variant_names)] @@ -2511,7 +2467,6 @@ impl<'de> serde::Deserialize<'de> for NotesRequest { AssetId, AddressIndex, AmountToSpend, - WalletId, } impl<'de> serde::Deserialize<'de> for GeneratedField { fn deserialize(deserializer: D) -> std::result::Result @@ -2537,7 +2492,6 @@ impl<'de> serde::Deserialize<'de> for NotesRequest { "assetId" | "asset_id" => Ok(GeneratedField::AssetId), "addressIndex" | "address_index" => Ok(GeneratedField::AddressIndex), "amountToSpend" | "amount_to_spend" => Ok(GeneratedField::AmountToSpend), - "walletId" | "wallet_id" => Ok(GeneratedField::WalletId), _ => Err(serde::de::Error::unknown_field(value, FIELDS)), } } @@ -2561,7 +2515,6 @@ impl<'de> serde::Deserialize<'de> for NotesRequest { let mut asset_id__ = None; let mut address_index__ = None; let mut amount_to_spend__ = None; - let mut wallet_id__ = None; while let Some(k) = map_.next_key()? { match k { GeneratedField::IncludeSpent => { @@ -2588,12 +2541,6 @@ impl<'de> serde::Deserialize<'de> for NotesRequest { } amount_to_spend__ = map_.next_value()?; } - GeneratedField::WalletId => { - if wallet_id__.is_some() { - return Err(serde::de::Error::duplicate_field("walletId")); - } - wallet_id__ = map_.next_value()?; - } } } Ok(NotesRequest { @@ -2601,7 +2548,6 @@ impl<'de> serde::Deserialize<'de> for NotesRequest { asset_id: asset_id__, address_index: address_index__, amount_to_spend: amount_to_spend__, - wallet_id: wallet_id__, }) } } @@ -2714,9 +2660,6 @@ impl serde::Serialize for NullifierStatusRequest { if self.await_detection { len += 1; } - if self.wallet_id.is_some() { - len += 1; - } let mut struct_ser = serializer.serialize_struct("penumbra.view.v1alpha1.NullifierStatusRequest", len)?; if let Some(v) = self.nullifier.as_ref() { struct_ser.serialize_field("nullifier", v)?; @@ -2724,9 +2667,6 @@ impl serde::Serialize for NullifierStatusRequest { if self.await_detection { struct_ser.serialize_field("awaitDetection", &self.await_detection)?; } - if let Some(v) = self.wallet_id.as_ref() { - struct_ser.serialize_field("walletId", v)?; - } struct_ser.end() } } @@ -2740,15 +2680,12 @@ impl<'de> serde::Deserialize<'de> for NullifierStatusRequest { "nullifier", "await_detection", "awaitDetection", - "wallet_id", - "walletId", ]; #[allow(clippy::enum_variant_names)] enum GeneratedField { Nullifier, AwaitDetection, - WalletId, } impl<'de> serde::Deserialize<'de> for GeneratedField { fn deserialize(deserializer: D) -> std::result::Result @@ -2772,7 +2709,6 @@ impl<'de> serde::Deserialize<'de> for NullifierStatusRequest { match value { "nullifier" => Ok(GeneratedField::Nullifier), "awaitDetection" | "await_detection" => Ok(GeneratedField::AwaitDetection), - "walletId" | "wallet_id" => Ok(GeneratedField::WalletId), _ => Err(serde::de::Error::unknown_field(value, FIELDS)), } } @@ -2794,7 +2730,6 @@ impl<'de> serde::Deserialize<'de> for NullifierStatusRequest { { let mut nullifier__ = None; let mut await_detection__ = None; - let mut wallet_id__ = None; while let Some(k) = map_.next_key()? { match k { GeneratedField::Nullifier => { @@ -2809,18 +2744,11 @@ impl<'de> serde::Deserialize<'de> for NullifierStatusRequest { } await_detection__ = Some(map_.next_value()?); } - GeneratedField::WalletId => { - if wallet_id__.is_some() { - return Err(serde::de::Error::duplicate_field("walletId")); - } - wallet_id__ = map_.next_value()?; - } } } Ok(NullifierStatusRequest { nullifier: nullifier__, await_detection: await_detection__.unwrap_or_default(), - wallet_id: wallet_id__, }) } } @@ -3350,14 +3278,8 @@ impl serde::Serialize for StatusRequest { S: serde::Serializer, { use serde::ser::SerializeStruct; - let mut len = 0; - if self.wallet_id.is_some() { - len += 1; - } - let mut struct_ser = serializer.serialize_struct("penumbra.view.v1alpha1.StatusRequest", len)?; - if let Some(v) = self.wallet_id.as_ref() { - struct_ser.serialize_field("walletId", v)?; - } + let len = 0; + let struct_ser = serializer.serialize_struct("penumbra.view.v1alpha1.StatusRequest", len)?; struct_ser.end() } } @@ -3368,13 +3290,10 @@ impl<'de> serde::Deserialize<'de> for StatusRequest { D: serde::Deserializer<'de>, { const FIELDS: &[&str] = &[ - "wallet_id", - "walletId", ]; #[allow(clippy::enum_variant_names)] enum GeneratedField { - WalletId, } impl<'de> serde::Deserialize<'de> for GeneratedField { fn deserialize(deserializer: D) -> std::result::Result @@ -3395,10 +3314,7 @@ impl<'de> serde::Deserialize<'de> for StatusRequest { where E: serde::de::Error, { - match value { - "walletId" | "wallet_id" => Ok(GeneratedField::WalletId), - _ => Err(serde::de::Error::unknown_field(value, FIELDS)), - } + Err(serde::de::Error::unknown_field(value, FIELDS)) } } deserializer.deserialize_identifier(GeneratedVisitor) @@ -3416,19 +3332,10 @@ impl<'de> serde::Deserialize<'de> for StatusRequest { where V: serde::de::MapAccess<'de>, { - let mut wallet_id__ = None; - while let Some(k) = map_.next_key()? { - match k { - GeneratedField::WalletId => { - if wallet_id__.is_some() { - return Err(serde::de::Error::duplicate_field("walletId")); - } - wallet_id__ = map_.next_value()?; - } - } + while map_.next_key::()?.is_some() { + let _ = map_.next_value::()?; } Ok(StatusRequest { - wallet_id: wallet_id__, }) } } @@ -3576,14 +3483,8 @@ impl serde::Serialize for StatusStreamRequest { S: serde::Serializer, { use serde::ser::SerializeStruct; - let mut len = 0; - if self.wallet_id.is_some() { - len += 1; - } - let mut struct_ser = serializer.serialize_struct("penumbra.view.v1alpha1.StatusStreamRequest", len)?; - if let Some(v) = self.wallet_id.as_ref() { - struct_ser.serialize_field("walletId", v)?; - } + let len = 0; + let struct_ser = serializer.serialize_struct("penumbra.view.v1alpha1.StatusStreamRequest", len)?; struct_ser.end() } } @@ -3594,13 +3495,10 @@ impl<'de> serde::Deserialize<'de> for StatusStreamRequest { D: serde::Deserializer<'de>, { const FIELDS: &[&str] = &[ - "wallet_id", - "walletId", ]; #[allow(clippy::enum_variant_names)] enum GeneratedField { - WalletId, } impl<'de> serde::Deserialize<'de> for GeneratedField { fn deserialize(deserializer: D) -> std::result::Result @@ -3621,10 +3519,7 @@ impl<'de> serde::Deserialize<'de> for StatusStreamRequest { where E: serde::de::Error, { - match value { - "walletId" | "wallet_id" => Ok(GeneratedField::WalletId), - _ => Err(serde::de::Error::unknown_field(value, FIELDS)), - } + Err(serde::de::Error::unknown_field(value, FIELDS)) } } deserializer.deserialize_identifier(GeneratedVisitor) @@ -3642,19 +3537,10 @@ impl<'de> serde::Deserialize<'de> for StatusStreamRequest { where V: serde::de::MapAccess<'de>, { - let mut wallet_id__ = None; - while let Some(k) = map_.next_key()? { - match k { - GeneratedField::WalletId => { - if wallet_id__.is_some() { - return Err(serde::de::Error::duplicate_field("walletId")); - } - wallet_id__ = map_.next_value()?; - } - } + while map_.next_key::()?.is_some() { + let _ = map_.next_value::()?; } Ok(StatusStreamRequest { - wallet_id: wallet_id__, }) } } @@ -3812,9 +3698,6 @@ impl serde::Serialize for SwapByCommitmentRequest { if self.await_detection { len += 1; } - if self.wallet_id.is_some() { - len += 1; - } let mut struct_ser = serializer.serialize_struct("penumbra.view.v1alpha1.SwapByCommitmentRequest", len)?; if let Some(v) = self.swap_commitment.as_ref() { struct_ser.serialize_field("swapCommitment", v)?; @@ -3822,9 +3705,6 @@ impl serde::Serialize for SwapByCommitmentRequest { if self.await_detection { struct_ser.serialize_field("awaitDetection", &self.await_detection)?; } - if let Some(v) = self.wallet_id.as_ref() { - struct_ser.serialize_field("walletId", v)?; - } struct_ser.end() } } @@ -3839,15 +3719,12 @@ impl<'de> serde::Deserialize<'de> for SwapByCommitmentRequest { "swapCommitment", "await_detection", "awaitDetection", - "wallet_id", - "walletId", ]; #[allow(clippy::enum_variant_names)] enum GeneratedField { SwapCommitment, AwaitDetection, - WalletId, } impl<'de> serde::Deserialize<'de> for GeneratedField { fn deserialize(deserializer: D) -> std::result::Result @@ -3871,7 +3748,6 @@ impl<'de> serde::Deserialize<'de> for SwapByCommitmentRequest { match value { "swapCommitment" | "swap_commitment" => Ok(GeneratedField::SwapCommitment), "awaitDetection" | "await_detection" => Ok(GeneratedField::AwaitDetection), - "walletId" | "wallet_id" => Ok(GeneratedField::WalletId), _ => Err(serde::de::Error::unknown_field(value, FIELDS)), } } @@ -3893,7 +3769,6 @@ impl<'de> serde::Deserialize<'de> for SwapByCommitmentRequest { { let mut swap_commitment__ = None; let mut await_detection__ = None; - let mut wallet_id__ = None; while let Some(k) = map_.next_key()? { match k { GeneratedField::SwapCommitment => { @@ -3908,18 +3783,11 @@ impl<'de> serde::Deserialize<'de> for SwapByCommitmentRequest { } await_detection__ = Some(map_.next_value()?); } - GeneratedField::WalletId => { - if wallet_id__.is_some() { - return Err(serde::de::Error::duplicate_field("walletId")); - } - wallet_id__ = map_.next_value()?; - } } } Ok(SwapByCommitmentRequest { swap_commitment: swap_commitment__, await_detection: await_detection__.unwrap_or_default(), - wallet_id: wallet_id__, }) } } @@ -4792,9 +4660,6 @@ impl serde::Serialize for TransactionPlannerRequest { if self.source.is_some() { len += 1; } - if self.wallet_id.is_some() { - len += 1; - } if !self.outputs.is_empty() { len += 1; } @@ -4839,9 +4704,6 @@ impl serde::Serialize for TransactionPlannerRequest { if let Some(v) = self.source.as_ref() { struct_ser.serialize_field("source", v)?; } - if let Some(v) = self.wallet_id.as_ref() { - struct_ser.serialize_field("walletId", v)?; - } if !self.outputs.is_empty() { struct_ser.serialize_field("outputs", &self.outputs)?; } @@ -4887,8 +4749,6 @@ impl<'de> serde::Deserialize<'de> for TransactionPlannerRequest { "fee", "memo", "source", - "wallet_id", - "walletId", "outputs", "swaps", "swap_claims", @@ -4913,7 +4773,6 @@ impl<'de> serde::Deserialize<'de> for TransactionPlannerRequest { Fee, Memo, Source, - WalletId, Outputs, Swaps, SwapClaims, @@ -4949,7 +4808,6 @@ impl<'de> serde::Deserialize<'de> for TransactionPlannerRequest { "fee" => Ok(GeneratedField::Fee), "memo" => Ok(GeneratedField::Memo), "source" => Ok(GeneratedField::Source), - "walletId" | "wallet_id" => Ok(GeneratedField::WalletId), "outputs" => Ok(GeneratedField::Outputs), "swaps" => Ok(GeneratedField::Swaps), "swapClaims" | "swap_claims" => Ok(GeneratedField::SwapClaims), @@ -4983,7 +4841,6 @@ impl<'de> serde::Deserialize<'de> for TransactionPlannerRequest { let mut fee__ = None; let mut memo__ = None; let mut source__ = None; - let mut wallet_id__ = None; let mut outputs__ = None; let mut swaps__ = None; let mut swap_claims__ = None; @@ -5022,12 +4879,6 @@ impl<'de> serde::Deserialize<'de> for TransactionPlannerRequest { } source__ = map_.next_value()?; } - GeneratedField::WalletId => { - if wallet_id__.is_some() { - return Err(serde::de::Error::duplicate_field("walletId")); - } - wallet_id__ = map_.next_value()?; - } GeneratedField::Outputs => { if outputs__.is_some() { return Err(serde::de::Error::duplicate_field("outputs")); @@ -5095,7 +4946,6 @@ impl<'de> serde::Deserialize<'de> for TransactionPlannerRequest { fee: fee__, memo: memo__, source: source__, - wallet_id: wallet_id__, outputs: outputs__.unwrap_or_default(), swaps: swaps__.unwrap_or_default(), swap_claims: swap_claims__.unwrap_or_default(), @@ -6082,14 +5932,8 @@ impl serde::Serialize for UnclaimedSwapsRequest { S: serde::Serializer, { use serde::ser::SerializeStruct; - let mut len = 0; - if self.wallet_id.is_some() { - len += 1; - } - let mut struct_ser = serializer.serialize_struct("penumbra.view.v1alpha1.UnclaimedSwapsRequest", len)?; - if let Some(v) = self.wallet_id.as_ref() { - struct_ser.serialize_field("walletId", v)?; - } + let len = 0; + let struct_ser = serializer.serialize_struct("penumbra.view.v1alpha1.UnclaimedSwapsRequest", len)?; struct_ser.end() } } @@ -6100,13 +5944,10 @@ impl<'de> serde::Deserialize<'de> for UnclaimedSwapsRequest { D: serde::Deserializer<'de>, { const FIELDS: &[&str] = &[ - "wallet_id", - "walletId", ]; #[allow(clippy::enum_variant_names)] enum GeneratedField { - WalletId, } impl<'de> serde::Deserialize<'de> for GeneratedField { fn deserialize(deserializer: D) -> std::result::Result @@ -6127,10 +5968,7 @@ impl<'de> serde::Deserialize<'de> for UnclaimedSwapsRequest { where E: serde::de::Error, { - match value { - "walletId" | "wallet_id" => Ok(GeneratedField::WalletId), - _ => Err(serde::de::Error::unknown_field(value, FIELDS)), - } + Err(serde::de::Error::unknown_field(value, FIELDS)) } } deserializer.deserialize_identifier(GeneratedVisitor) @@ -6148,19 +5986,10 @@ impl<'de> serde::Deserialize<'de> for UnclaimedSwapsRequest { where V: serde::de::MapAccess<'de>, { - let mut wallet_id__ = None; - while let Some(k) = map_.next_key()? { - match k { - GeneratedField::WalletId => { - if wallet_id__.is_some() { - return Err(serde::de::Error::duplicate_field("walletId")); - } - wallet_id__ = map_.next_value()?; - } - } + while map_.next_key::()?.is_some() { + let _ = map_.next_value::()?; } Ok(UnclaimedSwapsRequest { - wallet_id: wallet_id__, }) } } @@ -6258,282 +6087,6 @@ impl<'de> serde::Deserialize<'de> for UnclaimedSwapsResponse { deserializer.deserialize_struct("penumbra.view.v1alpha1.UnclaimedSwapsResponse", FIELDS, GeneratedVisitor) } } -impl serde::Serialize for ViewAuthRequest { - #[allow(deprecated)] - fn serialize(&self, serializer: S) -> std::result::Result - where - S: serde::Serializer, - { - use serde::ser::SerializeStruct; - let mut len = 0; - if self.fvk.is_some() { - len += 1; - } - let mut struct_ser = serializer.serialize_struct("penumbra.view.v1alpha1.ViewAuthRequest", len)?; - if let Some(v) = self.fvk.as_ref() { - struct_ser.serialize_field("fvk", v)?; - } - struct_ser.end() - } -} -impl<'de> serde::Deserialize<'de> for ViewAuthRequest { - #[allow(deprecated)] - fn deserialize(deserializer: D) -> std::result::Result - where - D: serde::Deserializer<'de>, - { - const FIELDS: &[&str] = &[ - "fvk", - ]; - - #[allow(clippy::enum_variant_names)] - enum GeneratedField { - Fvk, - } - impl<'de> serde::Deserialize<'de> for GeneratedField { - fn deserialize(deserializer: D) -> std::result::Result - where - D: serde::Deserializer<'de>, - { - struct GeneratedVisitor; - - impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { - type Value = GeneratedField; - - fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - write!(formatter, "expected one of: {:?}", &FIELDS) - } - - #[allow(unused_variables)] - fn visit_str(self, value: &str) -> std::result::Result - where - E: serde::de::Error, - { - match value { - "fvk" => Ok(GeneratedField::Fvk), - _ => Err(serde::de::Error::unknown_field(value, FIELDS)), - } - } - } - deserializer.deserialize_identifier(GeneratedVisitor) - } - } - struct GeneratedVisitor; - impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { - type Value = ViewAuthRequest; - - fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - formatter.write_str("struct penumbra.view.v1alpha1.ViewAuthRequest") - } - - fn visit_map(self, mut map_: V) -> std::result::Result - where - V: serde::de::MapAccess<'de>, - { - let mut fvk__ = None; - while let Some(k) = map_.next_key()? { - match k { - GeneratedField::Fvk => { - if fvk__.is_some() { - return Err(serde::de::Error::duplicate_field("fvk")); - } - fvk__ = map_.next_value()?; - } - } - } - Ok(ViewAuthRequest { - fvk: fvk__, - }) - } - } - deserializer.deserialize_struct("penumbra.view.v1alpha1.ViewAuthRequest", FIELDS, GeneratedVisitor) - } -} -impl serde::Serialize for ViewAuthResponse { - #[allow(deprecated)] - fn serialize(&self, serializer: S) -> std::result::Result - where - S: serde::Serializer, - { - use serde::ser::SerializeStruct; - let mut len = 0; - if self.token.is_some() { - len += 1; - } - let mut struct_ser = serializer.serialize_struct("penumbra.view.v1alpha1.ViewAuthResponse", len)?; - if let Some(v) = self.token.as_ref() { - struct_ser.serialize_field("token", v)?; - } - struct_ser.end() - } -} -impl<'de> serde::Deserialize<'de> for ViewAuthResponse { - #[allow(deprecated)] - fn deserialize(deserializer: D) -> std::result::Result - where - D: serde::Deserializer<'de>, - { - const FIELDS: &[&str] = &[ - "token", - ]; - - #[allow(clippy::enum_variant_names)] - enum GeneratedField { - Token, - } - impl<'de> serde::Deserialize<'de> for GeneratedField { - fn deserialize(deserializer: D) -> std::result::Result - where - D: serde::Deserializer<'de>, - { - struct GeneratedVisitor; - - impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { - type Value = GeneratedField; - - fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - write!(formatter, "expected one of: {:?}", &FIELDS) - } - - #[allow(unused_variables)] - fn visit_str(self, value: &str) -> std::result::Result - where - E: serde::de::Error, - { - match value { - "token" => Ok(GeneratedField::Token), - _ => Err(serde::de::Error::unknown_field(value, FIELDS)), - } - } - } - deserializer.deserialize_identifier(GeneratedVisitor) - } - } - struct GeneratedVisitor; - impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { - type Value = ViewAuthResponse; - - fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - formatter.write_str("struct penumbra.view.v1alpha1.ViewAuthResponse") - } - - fn visit_map(self, mut map_: V) -> std::result::Result - where - V: serde::de::MapAccess<'de>, - { - let mut token__ = None; - while let Some(k) = map_.next_key()? { - match k { - GeneratedField::Token => { - if token__.is_some() { - return Err(serde::de::Error::duplicate_field("token")); - } - token__ = map_.next_value()?; - } - } - } - Ok(ViewAuthResponse { - token: token__, - }) - } - } - deserializer.deserialize_struct("penumbra.view.v1alpha1.ViewAuthResponse", FIELDS, GeneratedVisitor) - } -} -impl serde::Serialize for ViewAuthToken { - #[allow(deprecated)] - fn serialize(&self, serializer: S) -> std::result::Result - where - S: serde::Serializer, - { - use serde::ser::SerializeStruct; - let mut len = 0; - if !self.inner.is_empty() { - len += 1; - } - let mut struct_ser = serializer.serialize_struct("penumbra.view.v1alpha1.ViewAuthToken", len)?; - if !self.inner.is_empty() { - #[allow(clippy::needless_borrow)] - struct_ser.serialize_field("inner", pbjson::private::base64::encode(&self.inner).as_str())?; - } - struct_ser.end() - } -} -impl<'de> serde::Deserialize<'de> for ViewAuthToken { - #[allow(deprecated)] - fn deserialize(deserializer: D) -> std::result::Result - where - D: serde::Deserializer<'de>, - { - const FIELDS: &[&str] = &[ - "inner", - ]; - - #[allow(clippy::enum_variant_names)] - enum GeneratedField { - Inner, - } - impl<'de> serde::Deserialize<'de> for GeneratedField { - fn deserialize(deserializer: D) -> std::result::Result - where - D: serde::Deserializer<'de>, - { - struct GeneratedVisitor; - - impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { - type Value = GeneratedField; - - fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - write!(formatter, "expected one of: {:?}", &FIELDS) - } - - #[allow(unused_variables)] - fn visit_str(self, value: &str) -> std::result::Result - where - E: serde::de::Error, - { - match value { - "inner" => Ok(GeneratedField::Inner), - _ => Err(serde::de::Error::unknown_field(value, FIELDS)), - } - } - } - deserializer.deserialize_identifier(GeneratedVisitor) - } - } - struct GeneratedVisitor; - impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { - type Value = ViewAuthToken; - - fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - formatter.write_str("struct penumbra.view.v1alpha1.ViewAuthToken") - } - - fn visit_map(self, mut map_: V) -> std::result::Result - where - V: serde::de::MapAccess<'de>, - { - let mut inner__ = None; - while let Some(k) = map_.next_key()? { - match k { - GeneratedField::Inner => { - if inner__.is_some() { - return Err(serde::de::Error::duplicate_field("inner")); - } - inner__ = - Some(map_.next_value::<::pbjson::private::BytesDeserialize<_>>()?.0) - ; - } - } - } - Ok(ViewAuthToken { - inner: inner__.unwrap_or_default(), - }) - } - } - deserializer.deserialize_struct("penumbra.view.v1alpha1.ViewAuthToken", FIELDS, GeneratedVisitor) - } -} impl serde::Serialize for WalletIdRequest { #[allow(deprecated)] fn serialize(&self, serializer: S) -> std::result::Result @@ -6912,9 +6465,6 @@ impl serde::Serialize for WitnessRequest { if self.transaction_plan.is_some() { len += 1; } - if self.wallet_id.is_some() { - len += 1; - } let mut struct_ser = serializer.serialize_struct("penumbra.view.v1alpha1.WitnessRequest", len)?; if !self.note_commitments.is_empty() { struct_ser.serialize_field("noteCommitments", &self.note_commitments)?; @@ -6922,9 +6472,6 @@ impl serde::Serialize for WitnessRequest { if let Some(v) = self.transaction_plan.as_ref() { struct_ser.serialize_field("transactionPlan", v)?; } - if let Some(v) = self.wallet_id.as_ref() { - struct_ser.serialize_field("walletId", v)?; - } struct_ser.end() } } @@ -6939,15 +6486,12 @@ impl<'de> serde::Deserialize<'de> for WitnessRequest { "noteCommitments", "transaction_plan", "transactionPlan", - "wallet_id", - "walletId", ]; #[allow(clippy::enum_variant_names)] enum GeneratedField { NoteCommitments, TransactionPlan, - WalletId, } impl<'de> serde::Deserialize<'de> for GeneratedField { fn deserialize(deserializer: D) -> std::result::Result @@ -6971,7 +6515,6 @@ impl<'de> serde::Deserialize<'de> for WitnessRequest { match value { "noteCommitments" | "note_commitments" => Ok(GeneratedField::NoteCommitments), "transactionPlan" | "transaction_plan" => Ok(GeneratedField::TransactionPlan), - "walletId" | "wallet_id" => Ok(GeneratedField::WalletId), _ => Err(serde::de::Error::unknown_field(value, FIELDS)), } } @@ -6993,7 +6536,6 @@ impl<'de> serde::Deserialize<'de> for WitnessRequest { { let mut note_commitments__ = None; let mut transaction_plan__ = None; - let mut wallet_id__ = None; while let Some(k) = map_.next_key()? { match k { GeneratedField::NoteCommitments => { @@ -7008,18 +6550,11 @@ impl<'de> serde::Deserialize<'de> for WitnessRequest { } transaction_plan__ = map_.next_value()?; } - GeneratedField::WalletId => { - if wallet_id__.is_some() { - return Err(serde::de::Error::duplicate_field("walletId")); - } - wallet_id__ = map_.next_value()?; - } } } Ok(WitnessRequest { note_commitments: note_commitments__.unwrap_or_default(), transaction_plan: transaction_plan__, - wallet_id: wallet_id__, }) } } diff --git a/crates/proto/src/gen/proto_descriptor.bin.no_lfs b/crates/proto/src/gen/proto_descriptor.bin.no_lfs index 7cfebdc11c..1932603254 100644 Binary files a/crates/proto/src/gen/proto_descriptor.bin.no_lfs and b/crates/proto/src/gen/proto_descriptor.bin.no_lfs differ diff --git a/crates/proto/src/lib.rs b/crates/proto/src/lib.rs index c33b360375..70a561abf8 100644 --- a/crates/proto/src/lib.rs +++ b/crates/proto/src/lib.rs @@ -61,6 +61,13 @@ pub mod penumbra { } } + pub mod txhash { + pub mod v1alpha1 { + include!("gen/penumbra.core.txhash.v1alpha1.rs"); + include!("gen/penumbra.core.txhash.v1alpha1.serde.rs"); + } + } + /// Components of the Penumbra application. pub mod component { @@ -78,10 +85,10 @@ pub mod penumbra { } } - pub mod dao { + pub mod community_pool { pub mod v1alpha1 { - include!("gen/penumbra.core.component.dao.v1alpha1.rs"); - include!("gen/penumbra.core.component.dao.v1alpha1.serde.rs"); + include!("gen/penumbra.core.component.community_pool.v1alpha1.rs"); + include!("gen/penumbra.core.component.community_pool.v1alpha1.serde.rs"); } } diff --git a/crates/proto/src/protobuf.rs b/crates/proto/src/protobuf.rs index c2d11e4815..7975b71591 100644 --- a/crates/proto/src/protobuf.rs +++ b/crates/proto/src/protobuf.rs @@ -38,8 +38,9 @@ where // that shouldn't depend on the Penumbra proto framework. use crate::penumbra::core::component::ibc::v1alpha1::IbcRelay; -use crate::penumbra::core::keys::v1alpha1::SpendVerificationKey; -use crate::penumbra::crypto::decaf377_rdsa::v1alpha1::{BindingSignature, SpendAuthSignature}; +use crate::penumbra::crypto::decaf377_rdsa::v1alpha1::{ + BindingSignature, SpendAuthSignature, SpendVerificationKey, +}; use decaf377_rdsa::{Binding, Signature, SpendAuth, VerificationKey}; diff --git a/crates/view/Cargo.toml b/crates/view/Cargo.toml index c8ba80e57e..f483fc5080 100644 --- a/crates/view/Cargo.toml +++ b/crates/view/Cargo.toml @@ -31,7 +31,7 @@ penumbra-governance = { path = "../core/component/governance", default-features penumbra-stake = { path = "../core/component/stake", default-features = false } penumbra-ibc = { path = "../core/component/ibc", default-features = false } penumbra-distributions = { path = "../core/component/distributions", default-features = false } -penumbra-dao = { path = "../core/component/dao", default-features = false } +penumbra-community-pool = { path = "../core/component/community-pool", default-features = false } penumbra-dex = { path = "../core/component/dex", default-features = false } penumbra-sct = { path = "../core/component/sct", default-features = false } penumbra-fee = { path = "../core/component/fee", default-features = false } @@ -39,7 +39,7 @@ penumbra-compact-block = { path = "../core/component/compact-block", default-fea penumbra-app = { path = "../core/app" } penumbra-transaction = { path = "../core/transaction" } -ibc-types = { version = "0.10.0", default-features = false } +ibc-types = { version = "0.11.0", default-features = false } ark-std = { version = "0.4", default-features = false } decaf377 = { version = "0.5", features = ["r1cs"] } diff --git a/crates/view/src/client.rs b/crates/view/src/client.rs index 4d7b9fcc92..e08807a379 100644 --- a/crates/view/src/client.rs +++ b/crates/view/src/client.rs @@ -2,6 +2,9 @@ use std::{collections::BTreeMap, future::Future, pin::Pin}; use anyhow::Result; use futures::{FutureExt, Stream, StreamExt, TryStreamExt}; +use tonic::codegen::Bytes; +use tracing::instrument; + use penumbra_app::params::AppParameters; use penumbra_asset::asset::{self, DenomMetadata, Id}; use penumbra_chain::params::FmdParameters; @@ -10,10 +13,7 @@ use penumbra_dex::{ TradingPair, }; use penumbra_fee::GasPrices; -use penumbra_keys::{ - keys::{AddressIndex, WalletId}, - Address, -}; +use penumbra_keys::{keys::AddressIndex, Address}; use penumbra_num::Amount; use penumbra_proto::view::v1alpha1::{ self as pb, view_protocol_service_client::ViewProtocolServiceClient, WitnessRequest, @@ -21,12 +21,10 @@ use penumbra_proto::view::v1alpha1::{ use penumbra_sct::Nullifier; use penumbra_shielded_pool::note; use penumbra_stake::IdentityKey; - use penumbra_transaction::AuthorizationData; -use penumbra_transaction::{plan::TransactionPlan, Transaction, WitnessData}; - -use tonic::codegen::Bytes; -use tracing::instrument; +use penumbra_transaction::{ + plan::TransactionPlan, txhash::TransactionId, Transaction, WitnessData, +}; use crate::{SpendableNoteRecord, StatusStreamResponse, SwapRecord, TransactionInfo}; @@ -47,13 +45,11 @@ pub trait ViewClient { /// Get the current status of chain sync. fn status( &mut self, - wallet_id: WalletId, ) -> Pin> + Send + 'static>>; /// Stream status updates on chain sync until it completes. fn status_stream( &mut self, - wallet_id: WalletId, ) -> Pin< Box< dyn Future< @@ -102,21 +98,18 @@ pub trait ViewClient { /// Queries for a specific note by commitment, returning immediately if it is not found. fn note_by_commitment( &mut self, - wallet_id: WalletId, note_commitment: note::StateCommitment, ) -> Pin> + Send + 'static>>; /// Queries for a specific swap by commitment, returning immediately if it is not found. fn swap_by_commitment( &mut self, - wallet_id: WalletId, swap_commitment: penumbra_tct::StateCommitment, ) -> Pin> + Send + 'static>>; /// Queries for a specific nullifier's status, returning immediately if it is not found. fn nullifier_status( &mut self, - wallet_id: WalletId, nullifier: Nullifier, ) -> Pin> + Send + 'static>>; @@ -124,7 +117,6 @@ pub trait ViewClient { /// present, but waiting otherwise. fn await_nullifier( &mut self, - wallet_id: WalletId, nullifier: Nullifier, ) -> Pin> + Send + 'static>>; @@ -133,7 +125,6 @@ pub trait ViewClient { /// This is useful for waiting for a note to be detected by the view service. fn await_note_by_commitment( &mut self, - wallet_id: WalletId, note_commitment: note::StateCommitment, ) -> Pin> + Send + 'static>>; @@ -145,7 +136,6 @@ pub trait ViewClient { /// service could have advanced the state commitment tree state between queries). fn witness( &mut self, - wallet_id: WalletId, plan: &TransactionPlan, ) -> Pin> + Send + 'static>>; @@ -169,7 +159,7 @@ pub trait ViewClient { /// Generates a full perspective for a selected transaction using a full viewing key fn transaction_info_by_hash( &mut self, - id: penumbra_transaction::Id, + id: TransactionId, ) -> Pin> + Send + 'static>>; /// Queries for transactions in a range of block heights @@ -183,13 +173,12 @@ pub trait ViewClient { &mut self, transaction: Transaction, await_detection: bool, - ) -> Pin> + Send + 'static>>; + ) -> Pin> + Send + 'static>>; /// Return unspent notes, grouped by address index and then by asset id. - #[instrument(skip(self, wallet_id))] + #[instrument(skip(self))] fn unspent_notes_by_address_and_asset( &mut self, - wallet_id: WalletId, ) -> Pin< Box< dyn Future< @@ -201,7 +190,6 @@ pub trait ViewClient { >, > { let notes = self.notes(pb::NotesRequest { - wallet_id: Some(wallet_id.into()), include_spent: false, ..Default::default() }); @@ -227,10 +215,9 @@ pub trait ViewClient { } /// Return unspent notes, grouped by account ID (combining ephemeral addresses for the account) and then by asset id. - #[instrument(skip(self, wallet_id))] + #[instrument(skip(self))] fn unspent_notes_by_account_and_asset( &mut self, - wallet_id: WalletId, ) -> Pin< Box< dyn Future< @@ -240,7 +227,6 @@ pub trait ViewClient { >, > { let notes = self.notes(pb::NotesRequest { - wallet_id: Some(wallet_id.into()), include_spent: false, ..Default::default() }); @@ -266,10 +252,9 @@ pub trait ViewClient { } /// Return unspent notes, grouped by denom and then by address index. - #[instrument(skip(self, wallet_id))] + #[instrument(skip(self))] fn unspent_notes_by_asset_and_address( &mut self, - wallet_id: WalletId, ) -> Pin< Box< dyn Future< @@ -281,7 +266,6 @@ pub trait ViewClient { >, > { let notes = self.notes(pb::NotesRequest { - wallet_id: Some(wallet_id.into()), include_spent: false, ..Default::default() }); @@ -334,13 +318,10 @@ where { fn status( &mut self, - wallet_id: WalletId, ) -> Pin> + Send + 'static>> { let mut self2 = self.clone(); async move { - let status = self2.status(tonic::Request::new(pb::StatusRequest { - wallet_id: Some(wallet_id.into()), - })); + let status = self2.status(tonic::Request::new(pb::StatusRequest {})); let status = status.await?.into_inner(); Ok(status) } @@ -349,7 +330,6 @@ where fn status_stream( &mut self, - wallet_id: WalletId, ) -> Pin< Box< dyn Future< @@ -362,9 +342,7 @@ where > { let mut self2 = self.clone(); async move { - let stream = self2.status_stream(tonic::Request::new(pb::StatusStreamRequest { - wallet_id: Some(wallet_id.into()), - })); + let stream = self2.status_stream(tonic::Request::new(pb::StatusStreamRequest {})); let stream = stream.await?.into_inner(); Ok(stream @@ -486,7 +464,6 @@ where fn note_by_commitment( &mut self, - wallet_id: WalletId, note_commitment: note::StateCommitment, ) -> Pin> + Send + 'static>> { let mut self2 = self.clone(); @@ -494,7 +471,6 @@ where let note_commitment_response = ViewProtocolServiceClient::note_by_commitment( &mut self2, tonic::Request::new(pb::NoteByCommitmentRequest { - wallet_id: Some(wallet_id.into()), note_commitment: Some(note_commitment.into()), await_detection: false, }), @@ -552,7 +528,6 @@ where fn swap_by_commitment( &mut self, - wallet_id: WalletId, swap_commitment: penumbra_tct::StateCommitment, ) -> Pin> + Send + 'static>> { let mut self2 = self.clone(); @@ -560,7 +535,6 @@ where let swap_commitment_response = ViewProtocolServiceClient::swap_by_commitment( &mut self2, tonic::Request::new(pb::SwapByCommitmentRequest { - wallet_id: Some(wallet_id.into()), swap_commitment: Some(swap_commitment.into()), await_detection: false, }), @@ -580,7 +554,6 @@ where /// This is useful for waiting for a note to be detected by the view service. fn await_note_by_commitment( &mut self, - wallet_id: WalletId, note_commitment: note::StateCommitment, ) -> Pin> + Send + 'static>> { let mut self2 = self.clone(); @@ -588,7 +561,6 @@ where let spendable_note = ViewProtocolServiceClient::note_by_commitment( &mut self2, tonic::Request::new(pb::NoteByCommitmentRequest { - wallet_id: Some(wallet_id.into()), note_commitment: Some(note_commitment.into()), await_detection: true, }), @@ -605,7 +577,6 @@ where /// Queries for a specific nullifier's status, returning immediately if it is not found. fn nullifier_status( &mut self, - wallet_id: WalletId, nullifier: Nullifier, ) -> Pin> + Send + 'static>> { let mut self2 = self.clone(); @@ -613,7 +584,6 @@ where let rsp = ViewProtocolServiceClient::nullifier_status( &mut self2, tonic::Request::new(pb::NullifierStatusRequest { - wallet_id: Some(wallet_id.into()), nullifier: Some(nullifier.into()), await_detection: false, }), @@ -627,7 +597,6 @@ where /// present, but waiting otherwise. fn await_nullifier( &mut self, - wallet_id: WalletId, nullifier: Nullifier, ) -> Pin> + Send + 'static>> { let mut self2 = self.clone(); @@ -635,7 +604,6 @@ where let rsp = ViewProtocolServiceClient::nullifier_status( &mut self2, tonic::Request::new(pb::NullifierStatusRequest { - wallet_id: Some(wallet_id.into()), nullifier: Some(nullifier.into()), await_detection: true, }), @@ -648,7 +616,6 @@ where fn witness( &mut self, - wallet_id: WalletId, plan: &TransactionPlan, ) -> Pin> + Send + 'static>> { // TODO: delete this code and move it into the view service. @@ -671,7 +638,6 @@ where .collect(); let request = WitnessRequest { - wallet_id: Some(wallet_id.into()), note_commitments, transaction_plan: Some(plan.clone().into()), }; @@ -753,7 +719,7 @@ where fn transaction_info_by_hash( &mut self, - id: penumbra_transaction::Id, + id: TransactionId, ) -> Pin> + Send + 'static>> { let mut self2 = self.clone(); async move { @@ -861,8 +827,7 @@ where &mut self, transaction: Transaction, await_detection: bool, - ) -> Pin> + Send + 'static>> - { + ) -> Pin> + Send + 'static>> { let mut self2 = self.clone(); async move { let rsp = ViewProtocolServiceClient::broadcast_transaction( @@ -893,7 +858,6 @@ where async move { let address = self2.address_by_index(tonic::Request::new(pb::AddressByIndexRequest { address_index: Some(address_index.into()), - ..Default::default() })); let address = address .await? @@ -938,9 +902,7 @@ where async move { let swaps_response = ViewProtocolServiceClient::unclaimed_swaps( &mut self2, - tonic::Request::new(pb::UnclaimedSwapsRequest { - ..Default::default() - }), + tonic::Request::new(pb::UnclaimedSwapsRequest {}), ); let pb_swaps: Vec<_> = swaps_response.await?.into_inner().try_collect().await?; diff --git a/crates/view/src/metrics.rs b/crates/view/src/metrics.rs index 8f5131ec82..668c4d13b5 100644 --- a/crates/view/src/metrics.rs +++ b/crates/view/src/metrics.rs @@ -11,6 +11,7 @@ //! This trick is probably good to avoid in general, because it could be //! confusing, but in this limited case, it seems like a clean option. +#[allow(unused_imports)] pub use metrics::*; /// Registers all metrics used by this crate. diff --git a/crates/view/src/planner.rs b/crates/view/src/planner.rs index e0f8234b16..74c18ba4a9 100644 --- a/crates/view/src/planner.rs +++ b/crates/view/src/planner.rs @@ -5,10 +5,12 @@ use std::{ }; use anyhow::Result; +use rand::{CryptoRng, RngCore}; +use tracing::instrument; use penumbra_asset::{asset, Balance, Value, STAKING_TOKEN_ASSET_ID}; use penumbra_chain::params::{ChainParameters, FmdParameters}; -use penumbra_dao::DaoDeposit; +use penumbra_community_pool::CommunityPoolDeposit; use penumbra_dex::{ lp::action::{PositionClose, PositionOpen}, lp::plan::PositionWithdrawPlan, @@ -25,10 +27,7 @@ use penumbra_governance::{ ProposalWithdraw, ValidatorVote, Vote, }; use penumbra_ibc::IbcRelay; -use penumbra_keys::{ - keys::{AddressIndex, WalletId}, - Address, -}; +use penumbra_keys::{keys::AddressIndex, Address}; use penumbra_num::Amount; use penumbra_proto::view::v1alpha1::{NotesForVotingRequest, NotesRequest}; use penumbra_shielded_pool::{Ics20Withdrawal, Note, OutputPlan, SpendPlan}; @@ -40,8 +39,6 @@ use penumbra_transaction::{ memo::MemoPlaintext, plan::{ActionPlan, MemoPlan, TransactionPlan}, }; -use rand::{CryptoRng, RngCore}; -use tracing::instrument; use crate::{SpendableNoteRecord, ViewClient}; @@ -102,14 +99,12 @@ impl Planner { /// Get all the note requests necessary to fulfill the current [`Balance`]. pub fn notes_requests( &self, - wallet_id: WalletId, source: AddressIndex, ) -> (Vec, Vec) { ( self.balance .required() .map(|Value { asset_id, amount }| NotesRequest { - wallet_id: Some(wallet_id.into()), asset_id: Some(asset_id.into()), address_index: Some(source.into()), amount_to_spend: Some(amount.into()), @@ -125,7 +120,6 @@ impl Planner { start_block_height, .. }, )| NotesForVotingRequest { - wallet_id: Some(wallet_id.into()), votable_at_height: *start_block_height, address_index: Some(source.into()), }, @@ -137,7 +131,7 @@ impl Planner { /// Set the expiry height for the transaction plan. #[instrument(skip(self))] pub fn expiry_height(&mut self, expiry_height: u64) -> &mut Self { - self.plan.expiry_height = expiry_height; + self.plan.transaction_parameters.expiry_height = expiry_height; self } @@ -146,7 +140,7 @@ impl Planner { /// Errors if the memo is too long. #[instrument(skip(self))] pub fn memo(&mut self, memo: MemoPlaintext) -> anyhow::Result<&mut Self> { - self.plan.memo_plan = Some(MemoPlan::new(&mut self.rng, memo)?); + self.plan.memo = Some(MemoPlan::new(&mut self.rng, memo)?); Ok(self) } @@ -156,13 +150,15 @@ impl Planner { #[instrument(skip(self))] pub fn fee(&mut self, fee: Fee) -> &mut Self { self.balance += fee.0; - self.plan.fee = fee; + self.plan.transaction_parameters.fee = fee; self } /// Calculate gas cost-based fees and add to the transaction plan. /// /// This function should be called once. + // TODO: clarify why we have both `add_gas_fees` and `fee` + // should one be `auto_fee` and the other `set_fee`? #[instrument(skip(self))] pub fn add_gas_fees(&mut self) -> &mut Self { let minimum_fee = self.gas_prices.price(&self.plan.gas_cost()); @@ -173,7 +169,7 @@ impl Planner { // change outputs. let fee = Fee::from_staking_token_amount(minimum_fee * Amount::from(2u32)); self.balance += fee.0; - self.plan.fee = fee; + self.plan.transaction_parameters.fee = fee; self } @@ -355,10 +351,12 @@ impl Planner { self } - /// Deposit a value into the DAO. + /// Deposit a value into the Community Pool. #[instrument(skip(self))] - pub fn dao_deposit(&mut self, value: Value) -> &mut Self { - self.action(ActionPlan::DaoDeposit(DaoDeposit { value })); + pub fn community_pool_deposit(&mut self, value: Value) -> &mut Self { + self.action(ActionPlan::CommunityPoolDeposit(CommunityPoolDeposit { + value, + })); self } @@ -452,7 +450,6 @@ impl Planner { pub async fn plan( &mut self, view: &mut V, - wallet_id: WalletId, source: AddressIndex, ) -> anyhow::Result { // Gather all the information needed from the view service @@ -467,7 +464,7 @@ impl Planner { let mut spendable_notes = Vec::new(); let mut voting_notes = Vec::new(); - let (spendable_requests, voting_requests) = self.notes_requests(wallet_id, source); + let (spendable_requests, voting_requests) = self.notes_requests(source); for request in spendable_requests { let notes = view.notes(request).await?; spendable_notes.extend(notes); @@ -514,7 +511,7 @@ impl Planner { tracing::debug!(plan = ?self.plan, balance = ?self.balance, "finalizing transaction"); // Fill in the chain id based on the view service - self.plan.chain_id = chain_params.chain_id.clone(); + self.plan.transaction_parameters.chain_id = chain_params.chain_id.clone(); // Add the required spends to the planner for record in spendable_notes { @@ -593,12 +590,12 @@ impl Planner { // to now calculate the transaction's fee again and capture the excess as change // by subtracting the excess from the required value balance. let tx_real_fee = self.gas_prices.price(&self.plan.gas_cost()); - let excess_fee_spent = self.plan.fee.amount() - tx_real_fee; + let excess_fee_spent = self.plan.transaction_parameters.fee.amount() - tx_real_fee; self.balance -= Value { amount: excess_fee_spent, asset_id: *STAKING_TOKEN_ASSET_ID, }; - self.plan.fee = Fee::from_staking_token_amount(tx_real_fee); + self.plan.transaction_parameters.fee = Fee::from_staking_token_amount(tx_real_fee); // For any remaining provided balance, make a single change note for each for value in self.balance.provided().collect::>() { @@ -620,17 +617,17 @@ impl Planner { } // If there are outputs, we check that a memo has been added. If not, we add a blank memo. - if self.plan.num_outputs() > 0 && self.plan.memo_plan.is_none() { + if self.plan.num_outputs() > 0 && self.plan.memo.is_none() { self.memo(MemoPlaintext::blank_memo(self_address.clone())) .expect("empty string is a valid memo"); - } else if self.plan.num_outputs() == 0 && self.plan.memo_plan.is_some() { + } else if self.plan.num_outputs() == 0 && self.plan.memo.is_some() { anyhow::bail!("if no outputs, no memo should be added"); } // Add clue plans for `Output`s. let precision_bits = fmd_params.precision_bits; self.plan - .add_all_clue_plans(&mut self.rng, precision_bits.into()); + .populate_detection_data(&mut self.rng, precision_bits.into()); tracing::debug!(plan = ?self.plan, "finished balancing transaction"); diff --git a/crates/view/src/service.rs b/crates/view/src/service.rs index 2b414bf92b..09ea426795 100644 --- a/crates/view/src/service.rs +++ b/crates/view/src/service.rs @@ -29,13 +29,12 @@ use penumbra_dex::{ }; use penumbra_fee::Fee; use penumbra_keys::{ - keys::{AddressIndex, FullViewingKey, WalletId}, + keys::{AddressIndex, FullViewingKey}, Address, }; use penumbra_num::Amount; use penumbra_proto::view::v1alpha1::{WalletIdRequest, WalletIdResponse}; use penumbra_proto::{ - core::keys::v1alpha1 as pbc, util::tendermint_proxy::v1alpha1::{ tendermint_proxy_service_client::TendermintProxyServiceClient, BroadcastTxSyncRequest, GetStatusRequest, @@ -52,7 +51,8 @@ use penumbra_proto::{ use penumbra_stake::rate::RateData; use penumbra_tct::{Proof, StateCommitment}; use penumbra_transaction::{ - plan::TransactionPlan, AuthorizationData, Transaction, TransactionPerspective, WitnessData, + plan::TransactionPlan, txhash::TransactionId, AuthorizationData, Transaction, + TransactionPerspective, WitnessData, }; use crate::{Planner, Storage, Worker}; @@ -71,7 +71,6 @@ pub struct ViewService { // A shared error slot for errors bubbled up by the worker. This is a regular Mutex // rather than a Tokio Mutex because it should be uncontended. error_slot: Arc>>, - wallet_id: WalletId, // A copy of the SCT used by the worker task. state_commitment_tree: Arc>, // The Url for the pd gRPC endpoint on remote node. @@ -105,12 +104,8 @@ impl ViewService { tokio::spawn(worker.run()); - let fvk = storage.full_viewing_key().await?; - let wallet_id = fvk.wallet_id(); - Ok(Self { storage, - wallet_id, error_slot, sync_height_rx, state_commitment_tree: sct, @@ -118,19 +113,6 @@ impl ViewService { }) } - /// Checks that the wallet ID, if present, matches the one for this service. - async fn check_wallet_id(&self, fvk: Option<&pbc::WalletId>) -> Result<(), tonic::Status> { - if let Some(fvk) = fvk { - if fvk != &self.wallet_id.into() { - return Err(tonic::Status::new( - tonic::Code::InvalidArgument, - "Invalid account ID", - )); - } - } - Ok(()) - } - async fn check_worker(&self) -> Result<(), tonic::Status> { // If the shared error slot is set, then an error has occurred in the worker // that we should bubble up. @@ -173,7 +155,7 @@ impl ViewService { &self, transaction: Transaction, await_detection: bool, - ) -> anyhow::Result { + ) -> anyhow::Result { use penumbra_app::ActionHandler; // 1. Pre-check the transaction for (stateless) validity. @@ -601,9 +583,6 @@ impl ViewProtocolService for ViewService { ); } - let fvk = self.storage.full_viewing_key().await.map_err(|e| { - tonic::Status::failed_precondition(format!("Error retrieving full viewing key: {e:#}")) - })?; let mut client_of_self = ViewProtocolServiceClient::new(ViewProtocolServiceServer::new(self.clone())); @@ -615,7 +594,7 @@ impl ViewProtocolService for ViewService { .unwrap_or(0u32); let plan = planner - .plan(&mut client_of_self, fvk.wallet_id(), source.into()) + .plan(&mut client_of_self, source.into()) .await .context("could not plan requested transaction") .map_err(|e| tonic::Status::invalid_argument(format!("{e:#}")))?; @@ -718,13 +697,13 @@ impl ViewProtocolService for ViewService { "missing transaction ID in TransactionInfoByHashRequest", ) })? - .hash, + .inner, ) .await .map_err(|_| { tonic::Status::failed_precondition(format!( "Error retrieving transaction by hash {}", - hex::encode(request.id.expect("transaction id is present").hash) + hex::encode(request.id.expect("transaction id is present").inner) )) })?; @@ -814,7 +793,7 @@ impl ViewProtocolService for ViewService { let memo = tx.decrypt_memo(&fvk).map_err(|_| { tonic::Status::internal("Error decrypting memo for OutputView") })?; - address_views.insert(memo.return_address, fvk.view_address(address)); + address_views.insert(memo.return_address(), fvk.view_address(address)); } ActionView::Swap(SwapView::Visible { swap_plaintext, .. }) => { let address = swap_plaintext.claim_address; @@ -877,8 +856,6 @@ impl ViewProtocolService for ViewService { request: tonic::Request, ) -> Result, tonic::Status> { self.check_worker().await?; - self.check_wallet_id(request.get_ref().wallet_id.as_ref()) - .await?; let request = request.into_inner(); @@ -962,8 +939,6 @@ impl ViewProtocolService for ViewService { request: tonic::Request, ) -> Result, tonic::Status> { self.check_worker().await?; - self.check_wallet_id(request.get_ref().wallet_id.as_ref()) - .await?; let request = request.into_inner(); @@ -994,8 +969,6 @@ impl ViewProtocolService for ViewService { request: tonic::Request, ) -> Result, tonic::Status> { self.check_worker().await?; - self.check_wallet_id(request.get_ref().wallet_id.as_ref()) - .await?; let request = request.into_inner(); @@ -1016,11 +989,9 @@ impl ViewProtocolService for ViewService { async fn status( &self, - request: tonic::Request, + _: tonic::Request, ) -> Result, tonic::Status> { self.check_worker().await?; - self.check_wallet_id(request.get_ref().wallet_id.as_ref()) - .await?; Ok(tonic::Response::new(self.status().await.map_err(|e| { tonic::Status::internal(format!("error: {e}")) @@ -1029,11 +1000,9 @@ impl ViewProtocolService for ViewService { async fn status_stream( &self, - request: tonic::Request, + _: tonic::Request, ) -> Result, tonic::Status> { self.check_worker().await?; - self.check_wallet_id(request.get_ref().wallet_id.as_ref()) - .await?; let (latest_known_block_height, _) = self.latest_known_block_height().await.map_err(|e| { @@ -1066,8 +1035,6 @@ impl ViewProtocolService for ViewService { request: tonic::Request, ) -> Result, tonic::Status> { self.check_worker().await?; - self.check_wallet_id(request.get_ref().wallet_id.as_ref()) - .await?; let request = request.into_inner(); @@ -1119,8 +1086,6 @@ impl ViewProtocolService for ViewService { request: tonic::Request, ) -> Result, tonic::Status> { self.check_worker().await?; - self.check_wallet_id(request.get_ref().wallet_id.as_ref()) - .await?; let address_index = request .get_ref() @@ -1276,8 +1241,6 @@ impl ViewProtocolService for ViewService { request: tonic::Request, ) -> Result, tonic::Status> { self.check_worker().await?; - self.check_wallet_id(request.get_ref().wallet_id.as_ref()) - .await?; // Acquire a read lock for the SCT that will live for the entire request, // so that all auth paths are relative to the same SCT root. @@ -1390,7 +1353,6 @@ impl ViewProtocolService for ViewService { .map_err(|e| tonic::Status::invalid_argument(format!("{:#}", e)))?; let witness_request = pb::WitnessRequest { - wallet_id: Some(self.wallet_id.into()), note_commitments, transaction_plan: Some(transaction_plan.clone().into()), }; @@ -1531,11 +1493,9 @@ impl ViewProtocolService for ViewService { async fn unclaimed_swaps( &self, - request: tonic::Request, + _: tonic::Request, ) -> Result, tonic::Status> { self.check_worker().await?; - self.check_wallet_id(request.get_ref().wallet_id.as_ref()) - .await?; let swaps = self.storage.unclaimed_swaps().await.map_err(|e| { tonic::Status::unavailable(format!("error fetching unclaimed swaps: {e}")) diff --git a/crates/view/src/storage.rs b/crates/view/src/storage.rs index e65dfc2362..3908ad4ea1 100644 --- a/crates/view/src/storage.rs +++ b/crates/view/src/storage.rs @@ -6,7 +6,7 @@ use parking_lot::Mutex; use penumbra_app::params::AppParameters; use penumbra_asset::{asset, asset::DenomMetadata, asset::Id, Value}; use penumbra_chain::params::{ChainParameters, FmdParameters}; -use penumbra_dao::params::DaoParameters; +use penumbra_community_pool::params::CommunityPoolParameters; use penumbra_dex::{ lp::position::{self, Position, State}, TradingPair, @@ -222,10 +222,11 @@ impl Storage { [fee_params_bytes], )?; - let dao_params_bytes = &DaoParameters::encode_to_vec(¶ms.dao_params)[..]; + let community_pool_params_bytes = + &CommunityPoolParameters::encode_to_vec(¶ms.community_pool_params)[..]; tx.execute( - "INSERT INTO dao_params (bytes) VALUES (?1)", - [dao_params_bytes], + "INSERT INTO community_pool_params (bytes) VALUES (?1)", + [community_pool_params_bytes], )?; let distributions_params_bytes = @@ -588,11 +589,11 @@ impl Storage { .prepare_cached("SELECT bytes FROM governance_params LIMIT 1")? .query_row([], |row| row.get::<_, Option>>("bytes"))? .ok_or_else(|| anyhow!("missing governance params"))?; - let dao_bytes = pool + let community_pool_bytes = pool .get()? - .prepare_cached("SELECT bytes FROM dao_params LIMIT 1")? + .prepare_cached("SELECT bytes FROM community_pool_params LIMIT 1")? .query_row([], |row| row.get::<_, Option>>("bytes"))? - .ok_or_else(|| anyhow!("missing dao params"))?; + .ok_or_else(|| anyhow!("missing Community Pool params"))?; let fee_bytes = pool .get()? .prepare_cached("SELECT bytes FROM fee_params LIMIT 1")? @@ -609,7 +610,9 @@ impl Storage { stake_params: StakeParameters::decode(stake_bytes.as_slice())?, ibc_params: IBCParameters::decode(ibc_bytes.as_slice())?, governance_params: GovernanceParameters::decode(governance_bytes.as_slice())?, - dao_params: DaoParameters::decode(dao_bytes.as_slice())?, + community_pool_params: CommunityPoolParameters::decode( + community_pool_bytes.as_slice(), + )?, fee_params: FeeParameters::decode(fee_bytes.as_slice())?, distributions_params: DistributionsParameters::decode( distributions_bytes.as_slice(), @@ -1385,10 +1388,10 @@ impl Storage { [fee_params_bytes], )?; - let dao_params_bytes = &DaoParameters::encode_to_vec(¶ms.dao_params)[..]; + let community_pool_params_bytes = &CommunityPoolParameters::encode_to_vec(¶ms.community_pool_params)[..]; dbtx.execute( - "UPDATE dao_params SET bytes = ?1", - [dao_params_bytes], + "UPDATE community_pool_params SET bytes = ?1", + [community_pool_params_bytes], )?; let distributions_params_bytes = &DistributionsParameters::encode_to_vec(¶ms.distributions_params)[..]; @@ -1536,7 +1539,7 @@ impl Storage { let tx_hash_owned = sha2::Sha256::digest(&tx_bytes); let tx_hash = tx_hash_owned.as_slice(); let tx_block_height = filtered_block.height as i64; - let return_address = transaction.decrypt_memo(&fvk).map_or(None, |x| Some(x.return_address.to_vec())); + let return_address = transaction.decrypt_memo(&fvk).map_or(None, |x| Some(x.return_address().to_vec())); tracing::debug!(tx_hash = ?hex::encode(tx_hash), "recording extended transaction"); diff --git a/crates/view/src/storage/schema.sql b/crates/view/src/storage/schema.sql index 5ec09e8396..3722fbe6a1 100644 --- a/crates/view/src/storage/schema.sql +++ b/crates/view/src/storage/schema.sql @@ -9,7 +9,7 @@ CREATE TABLE stake_params (bytes BLOB NOT NULL); CREATE TABLE ibc_params (bytes BLOB NOT NULL); CREATE TABLE governance_params (bytes BLOB NOT NULL); CREATE TABLE chain_params (bytes BLOB NOT NULL); -CREATE TABLE dao_params (bytes BLOB NOT NULL); +CREATE TABLE community_pool_params (bytes BLOB NOT NULL); CREATE TABLE fee_params (bytes BLOB NOT NULL); CREATE TABLE distributions_params (bytes BLOB NOT NULL); CREATE TABLE fmd_parameters (bytes BLOB NOT NULL); diff --git a/crates/view/src/transaction_info.rs b/crates/view/src/transaction_info.rs index eb3b83da14..24faf63bd1 100644 --- a/crates/view/src/transaction_info.rs +++ b/crates/view/src/transaction_info.rs @@ -1,11 +1,13 @@ -use penumbra_transaction::{Id, Transaction, TransactionPerspective, TransactionView}; +use penumbra_transaction::{ + txhash::TransactionId, Transaction, TransactionPerspective, TransactionView, +}; #[derive(Debug, Clone)] pub struct TransactionInfo { // The height the transaction was included in a block, if known. pub height: u64, // The hash of the transaction. - pub id: Id, + pub id: TransactionId, // The transaction data itself. pub transaction: Transaction, // The transaction perspective, as seen by this view server. diff --git a/crates/wallet/src/build.rs b/crates/wallet/src/build.rs index af6520be0b..44f61a3105 100644 --- a/crates/wallet/src/build.rs +++ b/crates/wallet/src/build.rs @@ -1,4 +1,5 @@ use anyhow::Result; + use penumbra_custody::{AuthorizeRequest, CustodyClient}; use penumbra_keys::FullViewingKey; use penumbra_transaction::{plan::TransactionPlan, AuthorizationData, Transaction}; @@ -26,7 +27,7 @@ where .try_into()?; // Send a witness request to the view service to get witness data - let witness_data = view.witness(fvk.wallet_id(), &plan).await?; + let witness_data = view.witness(&plan).await?; // ... and then build the transaction: #[cfg(not(feature = "parallel"))] diff --git a/crates/wallet/src/plan.rs b/crates/wallet/src/plan.rs index 937fa7bc43..01344aad76 100644 --- a/crates/wallet/src/plan.rs +++ b/crates/wallet/src/plan.rs @@ -1,29 +1,25 @@ -use penumbra_dex::swap_claim::SwapClaimPlan; -use penumbra_proto::view::v1alpha1::NotesRequest; use std::collections::BTreeMap; use anyhow::{Context, Result}; use ark_std::UniformRand; use decaf377::Fq; +use rand_core::{CryptoRng, RngCore}; +use tracing::instrument; + use penumbra_asset::Value; +use penumbra_dex::swap_claim::SwapClaimPlan; use penumbra_fee::Fee; use penumbra_governance::{proposal_state, Proposal, ValidatorVote}; -use penumbra_keys::{ - keys::{AddressIndex, WalletId}, - Address, -}; +use penumbra_keys::{keys::AddressIndex, Address}; use penumbra_num::Amount; +use penumbra_proto::view::v1alpha1::NotesRequest; use penumbra_stake::rate::RateData; use penumbra_stake::validator; -use penumbra_transaction::{memo::MemoPlaintext, plan::TransactionPlan}; -use penumbra_view::{SpendableNoteRecord, ViewClient}; -use rand_core::{CryptoRng, RngCore}; -use tracing::instrument; - +use penumbra_transaction::{memo::MemoPlaintext, plan::TransactionPlan, TransactionParameters}; pub use penumbra_view::Planner; +use penumbra_view::{SpendableNoteRecord, ViewClient}; pub async fn validator_definition( - wallet_id: WalletId, view: &mut V, rng: R, new_validator: validator::Definition, @@ -37,13 +33,12 @@ where Planner::new(rng) .fee(fee) .validator_definition(new_validator) - .plan(view, wallet_id, source_address) + .plan(view, source_address) .await .context("can't build validator definition plan") } pub async fn validator_vote( - wallet_id: WalletId, view: &mut V, rng: R, vote: ValidatorVote, @@ -57,15 +52,14 @@ where Planner::new(rng) .fee(fee) .validator_vote(vote) - .plan(view, wallet_id, source_address) + .plan(view, source_address) .await .context("can't build validator vote plan") } /// Generate a new transaction plan delegating stake -#[instrument(skip(wallet_id, view, rng, rate_data, unbonded_amount, fee, source_address))] +#[instrument(skip(view, rng, rate_data, unbonded_amount, fee, source_address))] pub async fn delegate( - wallet_id: WalletId, view: &mut V, rng: R, rate_data: RateData, @@ -80,24 +74,14 @@ where Planner::new(rng) .fee(fee) .delegate(unbonded_amount, rate_data) - .plan(view, wallet_id, source_address) + .plan(view, source_address) .await .context("can't build delegate plan") } #[allow(clippy::too_many_arguments)] -#[instrument(skip( - wallet_id, - view, - rng, - values, - fee, - dest_address, - source_address_index, - tx_memo -))] +#[instrument(skip(view, rng, values, fee, dest_address, source_address_index, tx_memo))] pub async fn send( - wallet_id: WalletId, view: &mut V, rng: R, values: &[Value], @@ -125,17 +109,13 @@ where let source_address = view.address_by_index(source_address_index).await?; planner .memo(tx_memo.unwrap_or_else(|| MemoPlaintext::blank_memo(source_address)))? - .plan(view, wallet_id, source_address_index) + .plan(view, source_address_index) .await .context("can't build send transaction") } -#[instrument(skip(wallet_id, view, rng))] -pub async fn sweep( - wallet_id: WalletId, - view: &mut V, - mut rng: R, -) -> anyhow::Result> +#[instrument(skip(view, rng))] +pub async fn sweep(view: &mut V, mut rng: R) -> anyhow::Result> where V: ViewClient, R: RngCore + CryptoRng, @@ -147,7 +127,7 @@ where // Finally, sweep dust notes by spending them to their owner's address. // This will consolidate small-value notes into larger ones. - plans.extend(sweep_notes(wallet_id, view, &mut rng).await?); + plans.extend(sweep_notes(view, &mut rng).await?); Ok(plans) } @@ -179,10 +159,13 @@ where let output_data = swap.output_data; let mut plan = TransactionPlan { - chain_id: chain_params.clone().chain_id, - fee: swap_plaintext.claim_fee.clone(), + transaction_parameters: TransactionParameters { + chain_id: chain_params.clone().chain_id, + fee: swap_plaintext.claim_fee.clone(), + ..Default::default() + }, // The transaction doesn't need a memo, because it's to ourselves. - memo_plan: None, + memo: None, ..Default::default() }; @@ -201,12 +184,8 @@ where Ok(plans) } -#[instrument(skip(wallet_id, view, rng))] -pub async fn sweep_notes( - wallet_id: WalletId, - view: &mut V, - mut rng: R, -) -> anyhow::Result> +#[instrument(skip(view, rng))] +pub async fn sweep_notes(view: &mut V, mut rng: R) -> anyhow::Result> where V: ViewClient, R: RngCore + CryptoRng, @@ -215,7 +194,6 @@ where let all_notes = view .notes(NotesRequest { - wallet_id: Some(wallet_id.into()), ..Default::default() }) .await?; @@ -254,7 +232,7 @@ where } let plan = planner - .plan(view, wallet_id, index) + .plan(view, index) .await .context("can't build sweep transaction")?; @@ -267,9 +245,8 @@ where Ok(plans) } -#[instrument(skip(wallet_id, view, rng))] +#[instrument(skip(view, rng))] pub async fn proposal_submit( - wallet_id: WalletId, view: &mut V, rng: R, proposal: Proposal, @@ -289,15 +266,14 @@ where .governance_params .proposal_deposit_amount, ) - .plan(view, wallet_id, source_address) + .plan(view, source_address) .await .context("can't build proposal submit transaction") } #[allow(clippy::too_many_arguments)] -#[instrument(skip(wallet_id, view, rng))] +#[instrument(skip(view, rng))] pub async fn proposal_withdraw( - wallet_id: WalletId, view: &mut V, rng: R, proposal_id: u64, @@ -312,15 +288,14 @@ where Planner::new(rng) .fee(fee) .proposal_withdraw(proposal_id, reason) - .plan(view, wallet_id, source_address) + .plan(view, source_address) .await .context("can't build proposal withdraw transaction") } #[allow(clippy::too_many_arguments)] -#[instrument(skip(wallet_id, view, rng))] +#[instrument(skip(view, rng))] pub async fn proposal_deposit_claim( - wallet_id: WalletId, view: &mut V, rng: R, proposal_id: u64, @@ -336,7 +311,7 @@ where Planner::new(rng) .fee(fee) .proposal_deposit_claim(proposal_id, deposit_amount, outcome) - .plan(view, wallet_id, source_address) + .plan(view, source_address) .await .context("can't build proposal withdraw transaction") } diff --git a/crates/wasm/src/build.rs b/crates/wasm/src/build.rs index 0d619dd96b..9ff7f5070f 100644 --- a/crates/wasm/src/build.rs +++ b/crates/wasm/src/build.rs @@ -36,7 +36,7 @@ pub fn build_action( let full_viewing_key: FullViewingKey = FullViewingKey::from_str(full_viewing_key)?; - let memo_key = transaction_plan.memo_plan.map(|memo_plan| memo_plan.key); + let memo_key = transaction_plan.memo.map(|memo_plan| memo_plan.key); let action = ActionPlan::build_unauth(action_plan, &full_viewing_key, &witness, memo_key)?; diff --git a/crates/wasm/src/keys.rs b/crates/wasm/src/keys.rs index 7a746170bb..1d3009ed85 100644 --- a/crates/wasm/src/keys.rs +++ b/crates/wasm/src/keys.rs @@ -7,9 +7,9 @@ use wasm_bindgen::prelude::*; use penumbra_keys::keys::{Bip44Path, SeedPhrase, SpendKey}; use penumbra_keys::{Address, FullViewingKey}; use penumbra_proof_params::{ - DELEGATOR_VOTE_PROOF_PROVING_KEY, NULLIFIER_DERIVATION_PROOF_PROVING_KEY, - OUTPUT_PROOF_PROVING_KEY, SPEND_PROOF_PROVING_KEY, SWAPCLAIM_PROOF_PROVING_KEY, - SWAP_PROOF_PROVING_KEY, UNDELEGATECLAIM_PROOF_PROVING_KEY, + CONVERT_PROOF_PROVING_KEY, DELEGATOR_VOTE_PROOF_PROVING_KEY, + NULLIFIER_DERIVATION_PROOF_PROVING_KEY, OUTPUT_PROOF_PROVING_KEY, SPEND_PROOF_PROVING_KEY, + SWAPCLAIM_PROOF_PROVING_KEY, SWAP_PROOF_PROVING_KEY, }; use penumbra_proto::{core::keys::v1alpha1 as pb, serializers::bech32str, DomainType}; use wasm_bindgen_futures::js_sys::Uint8Array; @@ -35,7 +35,7 @@ pub fn load_proving_key(parameters: JsValue, key_type: &str) -> WasmResult<()> { "nullifier_derivation" => &NULLIFIER_DERIVATION_PROOF_PROVING_KEY, "swap" => &SWAP_PROOF_PROVING_KEY, "swap_claim" => &SWAPCLAIM_PROOF_PROVING_KEY, - "undelegate_claim" => &UNDELEGATECLAIM_PROOF_PROVING_KEY, + "convert" => &CONVERT_PROOF_PROVING_KEY, _ => return Err(anyhow::anyhow!("Unsupported key type").into()), }; diff --git a/crates/wasm/src/planner.rs b/crates/wasm/src/planner.rs index f6f550dc33..fdc5086f4e 100644 --- a/crates/wasm/src/planner.rs +++ b/crates/wasm/src/planner.rs @@ -103,7 +103,6 @@ impl Planner { self.balance .required() .map(|Value { asset_id, amount }| NotesRequest { - wallet_id: None, asset_id: Some(asset_id.into()), address_index: source.clone(), amount_to_spend: Some(amount.into()), @@ -119,7 +118,6 @@ impl Planner { start_block_height, .. }, )| NotesForVotingRequest { - wallet_id: None, votable_at_height: *start_block_height, address_index: source.clone(), }, @@ -130,7 +128,7 @@ impl Planner { /// Set the expiry height for the transaction plan. pub fn expiry_height(&mut self, expiry_height: u64) -> &mut Self { - self.plan.expiry_height = expiry_height; + self.plan.transaction_parameters.expiry_height = expiry_height; self } @@ -138,7 +136,7 @@ impl Planner { /// /// Errors if the memo is too long. pub fn memo(&mut self, memo: MemoPlaintext) -> Result<&mut Self> { - self.plan.memo_plan = Some(MemoPlan::new(&mut self.rng, memo)?); + self.plan.memo = Some(MemoPlan::new(&mut self.rng, memo)?); Ok(self) } @@ -147,7 +145,7 @@ impl Planner { /// This function should be called once. pub fn fee(&mut self, fee: Fee) -> &mut Self { self.balance += fee.0; - self.plan.fee = fee; + self.plan.transaction_parameters.fee = fee; self } @@ -163,7 +161,7 @@ impl Planner { // change outputs. let fee = Fee::from_staking_token_amount(minimum_fee * Amount::from(2u32)); self.balance += fee.0; - self.plan.fee = fee; + self.plan.transaction_parameters.fee = fee; self } @@ -424,7 +422,7 @@ impl Planner { self_address: Address, ) -> anyhow::Result { // Fill in the chain id based on the view service - self.plan.chain_id = chain_params.chain_id.clone(); + self.plan.transaction_parameters.chain_id = chain_params.chain_id.clone(); // Add the required spends to the planner for record in spendable_notes { @@ -504,12 +502,12 @@ impl Planner { // to now calculate the transaction's fee again and capture the excess as change // by subtracting the excess from the required value balance. let tx_real_fee = self.gas_prices.price(&self.plan.gas_cost()); - let excess_fee_spent = self.plan.fee.amount() - tx_real_fee; + let excess_fee_spent = self.plan.transaction_parameters.fee.amount() - tx_real_fee; self.balance -= Value { amount: excess_fee_spent, asset_id: *STAKING_TOKEN_ASSET_ID, }; - self.plan.fee = Fee::from_staking_token_amount(tx_real_fee); + self.plan.transaction_parameters.fee = Fee::from_staking_token_amount(tx_real_fee); // For any remaining provided balance, make a single change note for each for value in self.balance.provided().collect::>() { @@ -531,16 +529,16 @@ impl Planner { } // If there are outputs, we check that a memo has been added. If not, we add a blank memo. - if self.plan.num_outputs() > 0 && self.plan.memo_plan.is_none() { + if self.plan.num_outputs() > 0 && self.plan.memo.is_none() { self.memo(MemoPlaintext::blank_memo(self_address))?; - } else if self.plan.num_outputs() == 0 && self.plan.memo_plan.is_some() { + } else if self.plan.num_outputs() == 0 && self.plan.memo.is_some() { anyhow::bail!("if no outputs, no memo should be added"); } // Add clue plans for `Output`s. let precision_bits = fmd_params.precision_bits; self.plan - .add_all_clue_plans(&mut self.rng, precision_bits.into()); + .populate_detection_data(&mut self.rng, precision_bits.into()); // Clear the planner and pull out the plan to return self.balance = Balance::zero(); diff --git a/crates/wasm/src/tx.rs b/crates/wasm/src/tx.rs index 6bfeac2301..3a0d2f5767 100644 --- a/crates/wasm/src/tx.rs +++ b/crates/wasm/src/tx.rs @@ -79,7 +79,7 @@ pub fn authorize(spend_key_str: &str, transaction_plan: JsValue) -> WasmResult { let address = swap_plaintext.claim_address; diff --git a/crates/wasm/tests/test_build.rs b/crates/wasm/tests/test_build.rs index f57f399ceb..4d2a2c7d73 100644 --- a/crates/wasm/tests/test_build.rs +++ b/crates/wasm/tests/test_build.rs @@ -50,8 +50,7 @@ mod tests { let swap_key: &[u8] = include_bytes!("../../crypto/proof-params/src/gen/swap_pk.bin"); let swap_claim_key: &[u8] = include_bytes!("../../crypto/proof-params/src/gen/swapclaim_pk.bin"); - let undelegate_claim_key: &[u8] = - include_bytes!("../../crypto/proof-params/src/gen/undelegateclaim_pk.bin"); + let convert_key: &[u8] = include_bytes!("../../crypto/proof-params/src/gen/convert_pk.bin"); // Serialize &[u8] to JsValue. let spend_key_js: JsValue = serde_wasm_bindgen::to_value(&spend_key).unwrap(); @@ -62,8 +61,7 @@ mod tests { serde_wasm_bindgen::to_value(&nullifier_derivation_key).unwrap(); let swap_key_js: JsValue = serde_wasm_bindgen::to_value(&swap_key).unwrap(); let swap_claim_key_js: JsValue = serde_wasm_bindgen::to_value(&swap_claim_key).unwrap(); - let undelegate_claim_key_js: JsValue = - serde_wasm_bindgen::to_value(&undelegate_claim_key).unwrap(); + let convert_key_js: JsValue = serde_wasm_bindgen::to_value(&convert_key).unwrap(); // Dynamically load the proving keys at runtime for each key type. load_proving_key(spend_key_js, "spend").expect("can load spend key"); @@ -74,8 +72,7 @@ mod tests { .expect("can load nullifier derivation key"); load_proving_key(swap_key_js, "swap").expect("can load swap key"); load_proving_key(swap_claim_key_js, "swap_claim").expect("can load swap claim key"); - load_proving_key(undelegate_claim_key_js, "undelegate_claim") - .expect("can load undelegate claim key"); + load_proving_key(convert_key_js, "convert").expect("can load convert key"); // Define database parameters. #[derive(Clone, Debug, Serialize, Deserialize)] @@ -167,7 +164,9 @@ mod tests { "height_spent": "0", "position": "3204061134848", "source": { - "inner": "oJ9Bo9v22srtUmKdTAMVwPOuGumWE2cAuBbZHci8B1I=" + "transaction": { + "id": "oJ9Bo9v22srtUmKdTAMVwPOuGumWE2cAuBbZHci8B1I=" + } } } "#; diff --git a/crates/wasm/tests/test_deserialize.rs b/crates/wasm/tests/test_deserialize.rs new file mode 100644 index 0000000000..88d511505c --- /dev/null +++ b/crates/wasm/tests/test_deserialize.rs @@ -0,0 +1,35 @@ +use penumbra_proto::core::component::ibc::v1alpha1::Ics20Withdrawal as PbIcs20Withdrawal; +use penumbra_shielded_pool::Ics20Withdrawal; + +#[test] +fn height_properly_serializes_from_json() { + let data = r#" + { + "amount": { + "lo": "12000000" + }, + "denom": { + "denom": "upenumbra" + }, + "destinationChainAddress": "xyz", + "returnAddress": { + "inner": "by+DwROtdzWZu+W+gQ+e7pJ328aBf4Lng1dtnnkH971ebSC4O1+fQE+QmMNQ0iEg1/ARaF6yop4BurwW0Z1B7v0/o3AYchf6IEMYBxGyN18=" + }, + "timeoutHeight": { + "revisionNumber": "5", + "revisionHeight": "3928271" + }, + "timeoutTime": "1701471437169", + "sourceChannel": "channel-0" + } + "#; + + let withdrawal_proto: PbIcs20Withdrawal = serde_json::from_str(data).unwrap(); + let height = withdrawal_proto.clone().timeout_height.unwrap(); + assert_eq!(height.revision_number, 5u64); + assert_eq!(height.revision_height, 3928271u64); + + let domain_type: Ics20Withdrawal = withdrawal_proto.try_into().unwrap(); + assert_eq!(domain_type.timeout_height.revision_number, 5u64); + assert_eq!(domain_type.timeout_height.revision_height, 3928271u64); +} diff --git a/deployments/helmfile.d/penumbra-testnet-cuiloa.yaml b/deployments/helmfile.d/penumbra-testnet-cuiloa.yaml index fca0e4cadd..c4d7f8efe0 100644 --- a/deployments/helmfile.d/penumbra-testnet-cuiloa.yaml +++ b/deployments/helmfile.d/penumbra-testnet-cuiloa.yaml @@ -17,10 +17,10 @@ releases: - ingressRoute: enabled: false - image: - tag: main + tag: "v0.64.1" - persistence: enabled: true - size: 50G + size: 200G - cometbft: config: indexer: psql diff --git a/deployments/helmfile.d/vars/penumbra-devnet-nodes-ips.yml b/deployments/helmfile.d/vars/penumbra-devnet-nodes-ips.yml index 596932b68d..828fa95cf5 100644 --- a/deployments/helmfile.d/vars/penumbra-devnet-nodes-ips.yml +++ b/deployments/helmfile.d/vars/penumbra-devnet-nodes-ips.yml @@ -1,8 +1,8 @@ nodes: - external_address: 35.202.100.199:26656 - moniker: phobos-seed + moniker: ceres-seed seed_mode: true - external_address: 34.16.34.194:26656 - moniker: deimos + moniker: vesta - external_address: 34.173.166.32:26656 - moniker: naiad + moniker: pallas diff --git a/deployments/helmfile.d/vars/penumbra-preview-nodes-ips.yml b/deployments/helmfile.d/vars/penumbra-preview-nodes-ips.yml index 23e5357c80..07441f78d0 100644 --- a/deployments/helmfile.d/vars/penumbra-preview-nodes-ips.yml +++ b/deployments/helmfile.d/vars/penumbra-preview-nodes-ips.yml @@ -1,10 +1,10 @@ nodes: - external_address: 34.135.6.235:26656 - moniker: phobos-seed + moniker: ceres-seed seed_mode: true - external_address: 34.28.180.178:26656 - moniker: deimos + moniker: vesta - external_address: 34.42.196.153:26656 - moniker: naiad + moniker: pallas - external_address: 35.239.76.154:26656 - moniker: thalassa + moniker: hygiea diff --git a/deployments/helmfile.d/vars/penumbra-testnet-nodes-ips.yml b/deployments/helmfile.d/vars/penumbra-testnet-nodes-ips.yml index 8b476dede5..d6b36ebf19 100644 --- a/deployments/helmfile.d/vars/penumbra-testnet-nodes-ips.yml +++ b/deployments/helmfile.d/vars/penumbra-testnet-nodes-ips.yml @@ -1,10 +1,10 @@ nodes: - external_address: 35.225.116.144:26656 - moniker: phobos-seed + moniker: ceres-seed seed_mode: true - external_address: 35.224.80.161:26656 - moniker: deimos + moniker: vesta - external_address: 34.68.200.112:26656 - moniker: naiad + moniker: pallas - external_address: 35.192.219.42:26656 - moniker: thalassa + moniker: hygiea diff --git a/deployments/relayer/configs/penumbra-preview.json b/deployments/relayer/configs/penumbra-preview.json index 78e02cbde9..ad8294d28d 100644 --- a/deployments/relayer/configs/penumbra-preview.json +++ b/deployments/relayer/configs/penumbra-preview.json @@ -2,9 +2,9 @@ "type": "penumbra", "value": { "key": "default", - "chain-id": "penumbra-testnet-tethys-cc6f18f4", + "chain-id": "penumbra-testnet-titan-da6576af", "rpc-addr": "https://rpc.testnet-preview.penumbra.zone:443", - "account-prefix": "penumbrav2t", + "account-prefix": "penumbra", "keyring-backend": "test", "gas-adjustment": 1.0, "gas-prices": "0.00upenumbra", diff --git a/deployments/relayer/configs/penumbra-testnet.json b/deployments/relayer/configs/penumbra-testnet.json index 31648348ea..23d14f213a 100644 --- a/deployments/relayer/configs/penumbra-testnet.json +++ b/deployments/relayer/configs/penumbra-testnet.json @@ -2,9 +2,9 @@ "type": "penumbra", "value": { "key": "default", - "chain-id": "penumbra-testnet-pasiphae", + "chain-id": "penumbra-testnet-titan", "rpc-addr": "https://rpc.testnet.penumbra.zone:443", - "account-prefix": "penumbrav2t", + "account-prefix": "penumbra", "keyring-backend": "test", "gas-adjustment": 1.0, "gas-prices": "0.00upenumbra", diff --git a/deployments/scripts/get-lb-ips b/deployments/scripts/get-lb-ips index 0adf8ab29d..fce404867f 100755 --- a/deployments/scripts/get-lb-ips +++ b/deployments/scripts/get-lb-ips @@ -13,8 +13,9 @@ fi # Declare monikers for nodes on the network. # These monikers will be added to the generated vars file, -# alongside the IP info. -node_names=(phobos-seed deimos naiad thalassa) +# alongside the IP info. Here we use notable asteroids, +# reserving moons for testnet names. +node_names=(ceres-seed vesta pallas hygiea) HELM_RELEASE="${1:-}" shift 1 diff --git a/deployments/scripts/rust-docs b/deployments/scripts/rust-docs index 06273f55d9..6a96aa1a21 100755 --- a/deployments/scripts/rust-docs +++ b/deployments/scripts/rust-docs @@ -38,12 +38,13 @@ cargo +nightly doc --no-deps \ -p penumbra-asset \ -p penumbra-chain \ -p penumbra-custody \ - -p penumbra-dao \ + -p penumbra-community-pool \ -p penumbra-dex \ -p penumbra-distributions \ -p penumbra-governance \ -p penumbra-ibc \ -p penumbra-keys \ + -p penumbra-txhash \ -p penumbra-measure \ -p penumbra-num \ -p penumbra-proof-params \ diff --git a/docs/guide/src/dev/protobuf.md b/docs/guide/src/dev/protobuf.md index 578db3adca..57b87b4aa4 100644 --- a/docs/guide/src/dev/protobuf.md +++ b/docs/guide/src/dev/protobuf.md @@ -33,7 +33,7 @@ unzip protoc-24.4-linux-x86_64.zip -d ~/.local/ ## Installing buf The `buf` tool is required to update lockfiles used for version management in -the [Buf Schema Registry](https://buf.build.penumbra-zone/penumbra). Visit +the [Buf Schema Registry](https://buf.build/penumbra-zone/penumbra). Visit the [buf download page](https://buf.build/docs/installation/) to obtain a version. After installing, run `buf --version` and confirm you're running at least `1.27.0` (or newer). diff --git a/docs/guide/src/extension.md b/docs/guide/src/extension.md index 2cc267c4dc..f4acb5b945 100644 --- a/docs/guide/src/extension.md +++ b/docs/guide/src/extension.md @@ -30,7 +30,7 @@ recent testnet: diff --git a/docs/guide/src/pcli/governance.md b/docs/guide/src/pcli/governance.md index fa7bab5453..e10bbc9a5c 100644 --- a/docs/guide/src/pcli/governance.md +++ b/docs/guide/src/pcli/governance.md @@ -14,7 +14,7 @@ in mind, here are some quick links: - [I want to submit a new proposal.](#submitting-a-proposal) - [I submitted a proposal and I want to withdraw it before voting concludes.](#withdrawing-a-proposal) - [Voting has concluded on a proposal I submitted and I want to claim my deposit.](#claiming-a-proposal-deposit) -- [I want to contribute funds to the DAO.](#contributing-to-the-dao) +- [I want to contribute funds to the Community Pool.](#contributing-to-the-community-pool) ## Getting Proposal Information @@ -98,9 +98,9 @@ slashed (but regardless of whether it passes or fails), the deposit will then be proposer at the end of voting. From the proposer's point of view, the lifecycle of a proposal begins when it is -_submitted_ and ends when it the deposit is _claimed_. During the voting period, the proposer may +_submitted_ and ends when the deposit is _claimed_. During the voting period, the proposer may also optionally _withdraw_ the proposal, which prevents it from passing, but does not prevent it -from being slashed. This is usually used when a proposal has been superceded by a revised +from being slashed. This is usually used when a proposal has been superseded by a revised alternative. @@ -114,7 +114,7 @@ boxes are the state of the proposal on chain, and colored circles are outcomes o ### Kinds Of Proposal There are 4 kinds of governance proposal on Penumbra: **signaling**, **emergency**, **parameter -change**, and **DAO spend**. +change**, and **community pool spend**. #### Signaling Proposals @@ -147,15 +147,15 @@ nothing happens. This is to prevent two simultaneous parameter change proposals each others' changes or merging with one another into an undesired state. Almost always, the set of old parameters should be the current parameters at the time the proposal is submitted. -#### DAO Spend Proposals +#### Community Pool Spend Proposals -DAO spend proposals submit a _transaction plan_ which may spend funds from the DAO if passed. +Community Pool spend proposals submit a _transaction plan_ which may spend funds from the Community Pool if passed. -DAO spend transactions have exclusive capability to use two special actions which are not allowed in -directly submitted user transactions: `DaoSpend` and `DaoOutput`. These actions, respectively, spend -funds from the DAO, and mint funds _transparently_ to an output address (unlike regular output -actions, which are shielded). DAO spend transactions are unable to use regular shielded outputs, -spend funds from any source other than the DAO itself, perform swaps, or submit, withdraw, or claim +Community Pool spend transactions have exclusive capability to use two special actions which are not allowed in +directly submitted user transactions: `CommunityPoolSpend` and `CommunityPoolOutput`. These actions, respectively, spend +funds from the Community Pool, and mint funds _transparently_ to an output address (unlike regular output +actions, which are shielded). Community Pool spend transactions are unable to use regular shielded outputs, +spend funds from any source other than the Community Pool itself, perform swaps, or submit, withdraw, or claim governance proposals. ### Submitting A Proposal @@ -188,42 +188,48 @@ for the proposal deposit after voting concludes, provided the proposal is not sl denomination `proposal_N_deposit`, where `N` is the ID of your proposal. Note that _whoever holds this NFT has exclusive control of the proposal_: they can withdraw it or claim the deposit. -#### Making A DAO Spend Transaction Plan +#### Making A Community Pool Spend Transaction Plan -In order to submit a DAO spend proposal, it is necessary to create a transaction plan. At present, +In order to submit a Community Pool spend proposal, it is necessary to create a transaction plan. At present, the only way to specify this is to provide a rather human-unfriendly JSON-formatted transaction plan, because there is no stable human-readable representation for a transaction plan at present. This will change in the future as better tooling is developed. -For now, here is a template for a transaction plan that withdraws 100 penumbra from the DAO and +For now, here is a template for a transaction plan that withdraws 100 penumbra from the Community Pool and sends it to a specified address (in this case, the address of the author of this document): ```json { - "fee": { "amount": { "lo": 0, "hi": 0 } }, - "actions": [ - { "daoSpend": { "value": { - "amount": { "lo": 100000000, "hi": 0 }, - "assetId": { "inner": "KeqcLzNx9qSH5+lcJHBB9KNW+YPrBk5dKzvPMiypahA=" } - } } }, - { "daoOutput": { - "value": { - "amount": { "lo": 100000000, "hi": 0 }, - "assetId": { "inner": "KeqcLzNx9qSH5+lcJHBB9KNW+YPrBk5dKzvPMiypahA=" } - }, - "address": { - "inner": "vzZ60xfMPPwewTiSb08jk5OdUjc0BhQ7IXLgHAayJoi5mvmlnTpqFuaPU2hCBhwaEwO2c03tBbN/GVh0+CajAjYBmBq3yHAbzNJCnZS8jUs=" - } - } } - ] + "fee": { "amount": { "lo": 0, "hi": 0 } }, + "actions": [ + { + "communityPoolSpend": { + "value": { + "amount": { "lo": 100000000, "hi": 0 }, + "assetId": { "inner": "KeqcLzNx9qSH5+lcJHBB9KNW+YPrBk5dKzvPMiypahA=" } + } + } + }, + { + "communityPoolOutput": { + "value": { + "amount": { "lo": 100000000, "hi": 0 }, + "assetId": { "inner": "KeqcLzNx9qSH5+lcJHBB9KNW+YPrBk5dKzvPMiypahA=" } + }, + "address": { + "inner": "vzZ60xfMPPwewTiSb08jk5OdUjc0BhQ7IXLgHAayJoi5mvmlnTpqFuaPU2hCBhwaEwO2c03tBbN/GVh0+CajAjYBmBq3yHAbzNJCnZS8jUs=" + } + } + } + ] } ``` Note that the asset ID and address are specified not in the usual bech32 formats you are used to seeing, but in base64. To get your address in this format, use `pcli view address 0 --base64`. -To template a DAO spend proposal using a JSON transaction plan, use the `pcli tx proposal template -dao-spend --transaction-plan .json`, which will take the transaction plan and include it +To template a Community Pool spend proposal using a JSON transaction plan, use the `pcli tx proposal template +community-pool-spend --transaction-plan .json`, which will take the transaction plan and include it in the generated proposal template. If no plan is specified, the transaction plan will be the empty transaction which does nothing when executed. @@ -261,34 +267,34 @@ proposal was not slashed (that is, it passed _or_ failed), this action will also original proposal deposit. Note that you _can_ claim a slashed proposal: you will receive the slashed proposal result NFT, but you will not receive the original proposal deposit. -## Contributing To The DAO +## Contributing To The Community Pool -Anyone can contribute any amount of any denomination to the Penumbra DAO. To do this, use the -command `pcli tx dao-deposit`, like so: +Anyone can contribute any amount of any denomination to the Penumbra Community Pool. To do this, use the +command `pcli tx community-pool-deposit`, like so: ```bash -pcli tx dao-deposit 100penumbra +pcli tx community-pool-deposit 100penumbra ``` -Funds contributed to the DAO cannot be withdrawn except by a successful DAO spend governance +Funds contributed to the Community Pool cannot be withdrawn except by a successful Community Pool spend governance proposal. -To query the current DAO balance, use `pcli query dao balance` with the **base denomination** of an +To query the current Community Pool balance, use `pcli query community-pool balance` with the **base denomination** of an asset or its asset ID (display denominations are not currently accepted). For example: ```bash -pcli query dao balance upenumbra +pcli query Community Pool balance upenumbra ``` -DAO spend proposals are only accepted for voting if they would not overdraw the current funds in the -DAO at the time the proposal is submitted, so it's worth checking this information before submitting +Community Pool spend proposals are only accepted for voting if they would not overdraw the current funds in the +Community Pool at the time the proposal is submitted, so it's worth checking this information before submitting such a proposal. -### Sending Validator Funding Streams To The DAO +### Sending Validator Funding Streams To The Community Pool -A validator may non-custodially send funds to the DAO, similarly to any other funding stream. To do +A validator may non-custodially send funds to the Community Pool, similarly to any other funding stream. To do this, add a `[[funding_stream]]` section to your validator definition TOML file that declares the -DAO as a recipient for a funding stream. For example, your definition might look like this: +Community Pool as a recipient for a funding stream. For example, your definition might look like this: ```toml sequence_number = 0 @@ -308,8 +314,8 @@ value = "tDk3/k8zjEyDQjQC1jUyv8nJ1cC1B/MgrDzeWvBTGDM=" recipient = "penumbrav2t1hum845ches70c8kp8zfx7nerjwfe653hxsrpgwepwtspcp4jy6ytnxhe5kwn56sku684x6zzqcwp5ycrkee5mmg9kdl3jkr5lqn2xq3kqxvp4d7gwqdue5jznk2ter2t66mk4n" rate_bps = 100 -# Send another 1% commission to the DAO: +# Send another 1% commission to the Community Pool: [[funding_stream]] -recipient = "DAO" +recipient = "CommunityPool" rate_bps = 100 ``` diff --git a/docs/guide/src/pcli/transaction.md b/docs/guide/src/pcli/transaction.md index 32bf0b5f21..cec969d02a 100644 --- a/docs/guide/src/pcli/transaction.md +++ b/docs/guide/src/pcli/transaction.md @@ -50,7 +50,7 @@ later to add the previously delegated funds to your wallet. Penumbra features on-chain governance similar to Cosmos Hub where anyone can submit proposals and both validators and delegators to vote on them. Penumbra's governance model incorporates a single -DAO account, into which anyone can freely deposit, but from which only a successful governance vote +Community Pool account, into which anyone can freely deposit, but from which only a successful governance vote can spend. For details on using governance, see the [governance section](./governance.md). ## Managing Liquidity Positions @@ -159,6 +159,7 @@ Penumbra's constant-price pool is a versatile market primitive, allowing users e ```bash pcli tx lp replicate xyk [--current-price AMT] [--fee-bps AMT] ``` + For instance, to provide ~100penumbra and ~100test_usd liquidity on the `penumbra:test_usd` pair with a pool fee of `33bps`, run: ```bash @@ -180,7 +181,7 @@ has been configured between the Osmosis testnet and the *current* Penumbra testn Penumbra aims to implement full IBC support for cross-chain asset transfers. For now, however, we're only running a relayer between the Penumbra testnet and the [Osmosis testnet] chains. -For Testnet 63 Rhea, the channel information is: +For Testnet 64 Titan, the channel information is:
\ No newline at end of file +Index of crates +
\ No newline at end of file diff --git a/flake.lock b/flake.lock new file mode 100644 index 0000000000..c63cd7c4e9 --- /dev/null +++ b/flake.lock @@ -0,0 +1,85 @@ +{ + "nodes": { + "flake-utils": { + "inputs": { + "systems": "systems" + }, + "locked": { + "lastModified": 1701680307, + "narHash": "sha256-kAuep2h5ajznlPMD9rnQyffWG8EM/C73lejGofXvdM8=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "4022d587cbbfd70fe950c1e2083a02621806a725", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1703961334, + "narHash": "sha256-M1mV/Cq+pgjk0rt6VxoyyD+O8cOUiai8t9Q6Yyq4noY=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "b0d36bd0a420ecee3bc916c91886caca87c894e9", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "root": { + "inputs": { + "flake-utils": "flake-utils", + "nixpkgs": "nixpkgs", + "rust-overlay": "rust-overlay" + } + }, + "rust-overlay": { + "inputs": { + "flake-utils": [ + "flake-utils" + ], + "nixpkgs": [ + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1704075545, + "narHash": "sha256-L3zgOuVKhPjKsVLc3yTm2YJ6+BATyZBury7wnhyc8QU=", + "owner": "oxalica", + "repo": "rust-overlay", + "rev": "a0df72e106322b67e9c6e591fe870380bd0da0d5", + "type": "github" + }, + "original": { + "owner": "oxalica", + "repo": "rust-overlay", + "type": "github" + } + }, + "systems": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flake.nix b/flake.nix new file mode 100644 index 0000000000..1a13f84a13 --- /dev/null +++ b/flake.nix @@ -0,0 +1,46 @@ +{ + description = "a nix development shell for penumbra"; + + inputs = { + nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; + flake-utils.url = "github:numtide/flake-utils"; + rust-overlay = { + url = "github:oxalica/rust-overlay"; + inputs = { + nixpkgs.follows = "nixpkgs"; + flake-utils.follows = "flake-utils"; + }; + }; + }; + + outputs = { self, nixpkgs, flake-utils, rust-overlay }: + flake-utils.lib.eachDefaultSystem + (system: + let + overlays = [ (import rust-overlay) ]; + pkgs = import nixpkgs { + inherit system overlays; + }; + nativeBuildInputs = with pkgs; [ + pkg-config + ]; + buildInputs = with pkgs; [ + clang + openssl + rust-bin.stable.latest.default + ]; + in + with pkgs; + { + devShells.default = mkShell { + inherit buildInputs nativeBuildInputs; + shellHook = '' + export CC="${pkgs.clang}/bin/clang" + export CXX="${pkgs.clang}/bin/clang++" + export LIBCLANG_PATH="${pkgs.libclang.lib}/lib" + ''; + LIBCLANG_PATH = "${pkgs.llvmPackages.libclang}/lib/libclang.so"; + }; + } + ); +} diff --git a/proto/go/gen/penumbra/cnidarium/v1alpha1/cnidarium.pb.go b/proto/go/gen/penumbra/cnidarium/v1alpha1/cnidarium.pb.go index 71d63ba1a4..fdd647d160 100644 --- a/proto/go/gen/penumbra/cnidarium/v1alpha1/cnidarium.pb.go +++ b/proto/go/gen/penumbra/cnidarium/v1alpha1/cnidarium.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.31.0 +// protoc-gen-go v1.32.0 // protoc (unknown) // source: penumbra/cnidarium/v1alpha1/cnidarium.proto @@ -260,6 +260,165 @@ func (x *PrefixValueResponse) GetValue() []byte { return nil } +// Requests a stream of new key-value pairs that have been committed to the state. +type WatchRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // A regex for keys in the verifiable storage. + // + // Only key-value updates whose keys match this regex will be returned. + // Note that the empty string matches all keys. + // To exclude all keys, use the regex "$^", which matches no strings. + KeyRegex string `protobuf:"bytes,1,opt,name=key_regex,json=keyRegex,proto3" json:"key_regex,omitempty"` + // A regex for keys in the nonverifiable storage. + // + // Only key-value updates whose keys match this regex will be returned. + // Note that the empty string matches all keys. + // To exclude all keys, use the regex "$^", which matches no strings. + NvKeyRegex string `protobuf:"bytes,2,opt,name=nv_key_regex,json=nvKeyRegex,proto3" json:"nv_key_regex,omitempty"` +} + +func (x *WatchRequest) Reset() { + *x = WatchRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_penumbra_cnidarium_v1alpha1_cnidarium_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *WatchRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*WatchRequest) ProtoMessage() {} + +func (x *WatchRequest) ProtoReflect() protoreflect.Message { + mi := &file_penumbra_cnidarium_v1alpha1_cnidarium_proto_msgTypes[4] + 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 WatchRequest.ProtoReflect.Descriptor instead. +func (*WatchRequest) Descriptor() ([]byte, []int) { + return file_penumbra_cnidarium_v1alpha1_cnidarium_proto_rawDescGZIP(), []int{4} +} + +func (x *WatchRequest) GetKeyRegex() string { + if x != nil { + return x.KeyRegex + } + return "" +} + +func (x *WatchRequest) GetNvKeyRegex() string { + if x != nil { + return x.NvKeyRegex + } + return "" +} + +// A key-value pair that has been committed to the state. +type WatchResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The state version the key-value pair was committed at. + Version uint64 `protobuf:"varint,1,opt,name=version,proto3" json:"version,omitempty"` + // The entry that was committed. + // + // Types that are assignable to Entry: + // + // *WatchResponse_Kv + // *WatchResponse_NvKv + Entry isWatchResponse_Entry `protobuf_oneof:"entry"` +} + +func (x *WatchResponse) Reset() { + *x = WatchResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_penumbra_cnidarium_v1alpha1_cnidarium_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *WatchResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*WatchResponse) ProtoMessage() {} + +func (x *WatchResponse) ProtoReflect() protoreflect.Message { + mi := &file_penumbra_cnidarium_v1alpha1_cnidarium_proto_msgTypes[5] + 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 WatchResponse.ProtoReflect.Descriptor instead. +func (*WatchResponse) Descriptor() ([]byte, []int) { + return file_penumbra_cnidarium_v1alpha1_cnidarium_proto_rawDescGZIP(), []int{5} +} + +func (x *WatchResponse) GetVersion() uint64 { + if x != nil { + return x.Version + } + return 0 +} + +func (m *WatchResponse) GetEntry() isWatchResponse_Entry { + if m != nil { + return m.Entry + } + return nil +} + +func (x *WatchResponse) GetKv() *WatchResponse_KeyValue { + if x, ok := x.GetEntry().(*WatchResponse_Kv); ok { + return x.Kv + } + return nil +} + +func (x *WatchResponse) GetNvKv() *WatchResponse_NvKeyValue { + if x, ok := x.GetEntry().(*WatchResponse_NvKv); ok { + return x.NvKv + } + return nil +} + +type isWatchResponse_Entry interface { + isWatchResponse_Entry() +} + +type WatchResponse_Kv struct { + Kv *WatchResponse_KeyValue `protobuf:"bytes,5,opt,name=kv,proto3,oneof"` +} + +type WatchResponse_NvKv struct { + NvKv *WatchResponse_NvKeyValue `protobuf:"bytes,6,opt,name=nv_kv,json=nvKv,proto3,oneof"` +} + +func (*WatchResponse_Kv) isWatchResponse_Entry() {} + +func (*WatchResponse_NvKv) isWatchResponse_Entry() {} + type KeyValueResponse_Value struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -271,7 +430,7 @@ type KeyValueResponse_Value struct { func (x *KeyValueResponse_Value) Reset() { *x = KeyValueResponse_Value{} if protoimpl.UnsafeEnabled { - mi := &file_penumbra_cnidarium_v1alpha1_cnidarium_proto_msgTypes[4] + mi := &file_penumbra_cnidarium_v1alpha1_cnidarium_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -284,7 +443,7 @@ func (x *KeyValueResponse_Value) String() string { func (*KeyValueResponse_Value) ProtoMessage() {} func (x *KeyValueResponse_Value) ProtoReflect() protoreflect.Message { - mi := &file_penumbra_cnidarium_v1alpha1_cnidarium_proto_msgTypes[4] + mi := &file_penumbra_cnidarium_v1alpha1_cnidarium_proto_msgTypes[6] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -307,6 +466,138 @@ func (x *KeyValueResponse_Value) GetValue() []byte { return nil } +// Elements of the verifiable storage have string keys. +type WatchResponse_KeyValue struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Key string `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"` + Value []byte `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"` + // If set to true, the key-value pair was deleted. + // This allows distinguishing a deleted key-value pair from a key-value pair whose value is empty. + Deleted bool `protobuf:"varint,3,opt,name=deleted,proto3" json:"deleted,omitempty"` +} + +func (x *WatchResponse_KeyValue) Reset() { + *x = WatchResponse_KeyValue{} + if protoimpl.UnsafeEnabled { + mi := &file_penumbra_cnidarium_v1alpha1_cnidarium_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *WatchResponse_KeyValue) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*WatchResponse_KeyValue) ProtoMessage() {} + +func (x *WatchResponse_KeyValue) ProtoReflect() protoreflect.Message { + mi := &file_penumbra_cnidarium_v1alpha1_cnidarium_proto_msgTypes[7] + 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 WatchResponse_KeyValue.ProtoReflect.Descriptor instead. +func (*WatchResponse_KeyValue) Descriptor() ([]byte, []int) { + return file_penumbra_cnidarium_v1alpha1_cnidarium_proto_rawDescGZIP(), []int{5, 0} +} + +func (x *WatchResponse_KeyValue) GetKey() string { + if x != nil { + return x.Key + } + return "" +} + +func (x *WatchResponse_KeyValue) GetValue() []byte { + if x != nil { + return x.Value + } + return nil +} + +func (x *WatchResponse_KeyValue) GetDeleted() bool { + if x != nil { + return x.Deleted + } + return false +} + +// Elements of the nonverifiable storage have byte keys. +type WatchResponse_NvKeyValue struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Key []byte `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"` + Value []byte `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"` + // If set to true, the key-value pair was deleted. + // This allows distinguishing a deleted key-value pair from a key-value pair whose value is empty. + Deleted bool `protobuf:"varint,3,opt,name=deleted,proto3" json:"deleted,omitempty"` +} + +func (x *WatchResponse_NvKeyValue) Reset() { + *x = WatchResponse_NvKeyValue{} + if protoimpl.UnsafeEnabled { + mi := &file_penumbra_cnidarium_v1alpha1_cnidarium_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *WatchResponse_NvKeyValue) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*WatchResponse_NvKeyValue) ProtoMessage() {} + +func (x *WatchResponse_NvKeyValue) ProtoReflect() protoreflect.Message { + mi := &file_penumbra_cnidarium_v1alpha1_cnidarium_proto_msgTypes[8] + 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 WatchResponse_NvKeyValue.ProtoReflect.Descriptor instead. +func (*WatchResponse_NvKeyValue) Descriptor() ([]byte, []int) { + return file_penumbra_cnidarium_v1alpha1_cnidarium_proto_rawDescGZIP(), []int{5, 1} +} + +func (x *WatchResponse_NvKeyValue) GetKey() []byte { + if x != nil { + return x.Key + } + return nil +} + +func (x *WatchResponse_NvKeyValue) GetValue() []byte { + if x != nil { + return x.Value + } + return nil +} + +func (x *WatchResponse_NvKeyValue) GetDeleted() bool { + if x != nil { + return x.Deleted + } + return false +} + var File_penumbra_cnidarium_v1alpha1_cnidarium_proto protoreflect.FileDescriptor var file_penumbra_cnidarium_v1alpha1_cnidarium_proto_rawDesc = []byte{ @@ -342,41 +633,74 @@ var file_penumbra_cnidarium_v1alpha1_cnidarium_proto_rawDesc = []byte{ 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 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, 0x0c, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x32, 0xeb, 0x01, 0x0a, 0x0c, - 0x51, 0x75, 0x65, 0x72, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x67, 0x0a, 0x08, - 0x4b, 0x65, 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x2c, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, - 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6e, 0x69, 0x64, 0x61, 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x76, 0x31, - 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4b, 0x65, 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, - 0x61, 0x2e, 0x63, 0x6e, 0x69, 0x64, 0x61, 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x76, 0x31, 0x61, 0x6c, - 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4b, 0x65, 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x72, 0x0a, 0x0b, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x56, - 0x61, 0x6c, 0x75, 0x65, 0x12, 0x2f, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, + 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x4d, 0x0a, 0x0c, 0x57, + 0x61, 0x74, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x6b, + 0x65, 0x79, 0x5f, 0x72, 0x65, 0x67, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x6b, 0x65, 0x79, 0x52, 0x65, 0x67, 0x65, 0x78, 0x12, 0x20, 0x0a, 0x0c, 0x6e, 0x76, 0x5f, 0x6b, + 0x65, 0x79, 0x5f, 0x72, 0x65, 0x67, 0x65, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, + 0x6e, 0x76, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x67, 0x65, 0x78, 0x22, 0xe5, 0x02, 0x0a, 0x0d, 0x57, + 0x61, 0x74, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 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, 0x45, 0x0a, 0x02, 0x6b, 0x76, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6e, + 0x69, 0x64, 0x61, 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, + 0x2e, 0x57, 0x61, 0x74, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x4b, + 0x65, 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x48, 0x00, 0x52, 0x02, 0x6b, 0x76, 0x12, 0x4c, 0x0a, + 0x05, 0x6e, 0x76, 0x5f, 0x6b, 0x76, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x70, + 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6e, 0x69, 0x64, 0x61, 0x72, 0x69, 0x75, + 0x6d, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x57, 0x61, 0x74, 0x63, 0x68, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x4e, 0x76, 0x4b, 0x65, 0x79, 0x56, 0x61, + 0x6c, 0x75, 0x65, 0x48, 0x00, 0x52, 0x04, 0x6e, 0x76, 0x4b, 0x76, 0x1a, 0x4c, 0x0a, 0x08, 0x4b, + 0x65, 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, 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, 0x0c, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, + 0x18, 0x0a, 0x07, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x07, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x1a, 0x4e, 0x0a, 0x0a, 0x4e, 0x76, 0x4b, + 0x65, 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, + 0x18, 0x0a, 0x07, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x07, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x42, 0x07, 0x0a, 0x05, 0x65, 0x6e, 0x74, + 0x72, 0x79, 0x32, 0xcd, 0x02, 0x0a, 0x0c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x53, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x12, 0x67, 0x0a, 0x08, 0x4b, 0x65, 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, + 0x2c, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6e, 0x69, 0x64, 0x61, + 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4b, 0x65, + 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, + 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6e, 0x69, 0x64, 0x61, 0x72, 0x69, + 0x75, 0x6d, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4b, 0x65, 0x79, 0x56, + 0x61, 0x6c, 0x75, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x72, 0x0a, 0x0b, + 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x2f, 0x2e, 0x70, 0x65, + 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6e, 0x69, 0x64, 0x61, 0x72, 0x69, 0x75, 0x6d, + 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, + 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x70, + 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6e, 0x69, 0x64, 0x61, 0x72, 0x69, 0x75, + 0x6d, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x65, 0x66, 0x69, + 0x78, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x30, 0x01, + 0x12, 0x60, 0x0a, 0x05, 0x57, 0x61, 0x74, 0x63, 0x68, 0x12, 0x29, 0x2e, 0x70, 0x65, 0x6e, 0x75, + 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6e, 0x69, 0x64, 0x61, 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x76, + 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x57, 0x61, 0x74, 0x63, 0x68, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6e, 0x69, 0x64, 0x61, 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, - 0x61, 0x31, 0x2e, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, - 0x2e, 0x63, 0x6e, 0x69, 0x64, 0x61, 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, - 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x30, 0x01, 0x42, 0x9d, 0x02, 0x0a, 0x1f, 0x63, 0x6f, - 0x6d, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6e, 0x69, 0x64, 0x61, - 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x42, 0x0e, 0x43, - 0x6e, 0x69, 0x64, 0x61, 0x72, 0x69, 0x75, 0x6d, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, - 0x5c, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x65, 0x6e, 0x75, - 0x6d, 0x62, 0x72, 0x61, 0x2d, 0x7a, 0x6f, 0x6e, 0x65, 0x2f, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, - 0x72, 0x61, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x6f, 0x2f, 0x67, 0x65, 0x6e, 0x2f, - 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2f, 0x63, 0x6e, 0x69, 0x64, 0x61, 0x72, 0x69, - 0x75, 0x6d, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x3b, 0x63, 0x6e, 0x69, 0x64, - 0x61, 0x72, 0x69, 0x75, 0x6d, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0xa2, 0x02, 0x03, - 0x50, 0x43, 0x58, 0xaa, 0x02, 0x1b, 0x50, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x43, - 0x6e, 0x69, 0x64, 0x61, 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x56, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, - 0x31, 0xca, 0x02, 0x1b, 0x50, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x5c, 0x43, 0x6e, 0x69, - 0x64, 0x61, 0x72, 0x69, 0x75, 0x6d, 0x5c, 0x56, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0xe2, - 0x02, 0x27, 0x50, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x5c, 0x43, 0x6e, 0x69, 0x64, 0x61, - 0x72, 0x69, 0x75, 0x6d, 0x5c, 0x56, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x5c, 0x47, 0x50, - 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x1d, 0x50, 0x65, 0x6e, 0x75, - 0x6d, 0x62, 0x72, 0x61, 0x3a, 0x3a, 0x43, 0x6e, 0x69, 0x64, 0x61, 0x72, 0x69, 0x75, 0x6d, 0x3a, - 0x3a, 0x56, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x33, + 0x61, 0x31, 0x2e, 0x57, 0x61, 0x74, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x30, 0x01, 0x42, 0x9d, 0x02, 0x0a, 0x1f, 0x63, 0x6f, 0x6d, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, + 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6e, 0x69, 0x64, 0x61, 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x76, 0x31, + 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x42, 0x0e, 0x43, 0x6e, 0x69, 0x64, 0x61, 0x72, 0x69, 0x75, + 0x6d, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x5c, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, + 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2d, 0x7a, 0x6f, + 0x6e, 0x65, 0x2f, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2f, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x2f, 0x67, 0x6f, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, + 0x61, 0x2f, 0x63, 0x6e, 0x69, 0x64, 0x61, 0x72, 0x69, 0x75, 0x6d, 0x2f, 0x76, 0x31, 0x61, 0x6c, + 0x70, 0x68, 0x61, 0x31, 0x3b, 0x63, 0x6e, 0x69, 0x64, 0x61, 0x72, 0x69, 0x75, 0x6d, 0x76, 0x31, + 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0xa2, 0x02, 0x03, 0x50, 0x43, 0x58, 0xaa, 0x02, 0x1b, 0x50, + 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x43, 0x6e, 0x69, 0x64, 0x61, 0x72, 0x69, 0x75, + 0x6d, 0x2e, 0x56, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0xca, 0x02, 0x1b, 0x50, 0x65, 0x6e, + 0x75, 0x6d, 0x62, 0x72, 0x61, 0x5c, 0x43, 0x6e, 0x69, 0x64, 0x61, 0x72, 0x69, 0x75, 0x6d, 0x5c, + 0x56, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0xe2, 0x02, 0x27, 0x50, 0x65, 0x6e, 0x75, 0x6d, + 0x62, 0x72, 0x61, 0x5c, 0x43, 0x6e, 0x69, 0x64, 0x61, 0x72, 0x69, 0x75, 0x6d, 0x5c, 0x56, 0x31, + 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, + 0x74, 0x61, 0xea, 0x02, 0x1d, 0x50, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x3a, 0x3a, 0x43, + 0x6e, 0x69, 0x64, 0x61, 0x72, 0x69, 0x75, 0x6d, 0x3a, 0x3a, 0x56, 0x31, 0x61, 0x6c, 0x70, 0x68, + 0x61, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -391,27 +715,35 @@ func file_penumbra_cnidarium_v1alpha1_cnidarium_proto_rawDescGZIP() []byte { return file_penumbra_cnidarium_v1alpha1_cnidarium_proto_rawDescData } -var file_penumbra_cnidarium_v1alpha1_cnidarium_proto_msgTypes = make([]protoimpl.MessageInfo, 5) +var file_penumbra_cnidarium_v1alpha1_cnidarium_proto_msgTypes = make([]protoimpl.MessageInfo, 9) var file_penumbra_cnidarium_v1alpha1_cnidarium_proto_goTypes = []interface{}{ - (*KeyValueRequest)(nil), // 0: penumbra.cnidarium.v1alpha1.KeyValueRequest - (*KeyValueResponse)(nil), // 1: penumbra.cnidarium.v1alpha1.KeyValueResponse - (*PrefixValueRequest)(nil), // 2: penumbra.cnidarium.v1alpha1.PrefixValueRequest - (*PrefixValueResponse)(nil), // 3: penumbra.cnidarium.v1alpha1.PrefixValueResponse - (*KeyValueResponse_Value)(nil), // 4: penumbra.cnidarium.v1alpha1.KeyValueResponse.Value - (*types.MerkleProof)(nil), // 5: ibc.core.commitment.v1.MerkleProof + (*KeyValueRequest)(nil), // 0: penumbra.cnidarium.v1alpha1.KeyValueRequest + (*KeyValueResponse)(nil), // 1: penumbra.cnidarium.v1alpha1.KeyValueResponse + (*PrefixValueRequest)(nil), // 2: penumbra.cnidarium.v1alpha1.PrefixValueRequest + (*PrefixValueResponse)(nil), // 3: penumbra.cnidarium.v1alpha1.PrefixValueResponse + (*WatchRequest)(nil), // 4: penumbra.cnidarium.v1alpha1.WatchRequest + (*WatchResponse)(nil), // 5: penumbra.cnidarium.v1alpha1.WatchResponse + (*KeyValueResponse_Value)(nil), // 6: penumbra.cnidarium.v1alpha1.KeyValueResponse.Value + (*WatchResponse_KeyValue)(nil), // 7: penumbra.cnidarium.v1alpha1.WatchResponse.KeyValue + (*WatchResponse_NvKeyValue)(nil), // 8: penumbra.cnidarium.v1alpha1.WatchResponse.NvKeyValue + (*types.MerkleProof)(nil), // 9: ibc.core.commitment.v1.MerkleProof } var file_penumbra_cnidarium_v1alpha1_cnidarium_proto_depIdxs = []int32{ - 4, // 0: penumbra.cnidarium.v1alpha1.KeyValueResponse.value:type_name -> penumbra.cnidarium.v1alpha1.KeyValueResponse.Value - 5, // 1: penumbra.cnidarium.v1alpha1.KeyValueResponse.proof:type_name -> ibc.core.commitment.v1.MerkleProof - 0, // 2: penumbra.cnidarium.v1alpha1.QueryService.KeyValue:input_type -> penumbra.cnidarium.v1alpha1.KeyValueRequest - 2, // 3: penumbra.cnidarium.v1alpha1.QueryService.PrefixValue:input_type -> penumbra.cnidarium.v1alpha1.PrefixValueRequest - 1, // 4: penumbra.cnidarium.v1alpha1.QueryService.KeyValue:output_type -> penumbra.cnidarium.v1alpha1.KeyValueResponse - 3, // 5: penumbra.cnidarium.v1alpha1.QueryService.PrefixValue:output_type -> penumbra.cnidarium.v1alpha1.PrefixValueResponse - 4, // [4:6] is the sub-list for method output_type - 2, // [2:4] is the sub-list for method input_type - 2, // [2:2] is the sub-list for extension type_name - 2, // [2:2] is the sub-list for extension extendee - 0, // [0:2] is the sub-list for field type_name + 6, // 0: penumbra.cnidarium.v1alpha1.KeyValueResponse.value:type_name -> penumbra.cnidarium.v1alpha1.KeyValueResponse.Value + 9, // 1: penumbra.cnidarium.v1alpha1.KeyValueResponse.proof:type_name -> ibc.core.commitment.v1.MerkleProof + 7, // 2: penumbra.cnidarium.v1alpha1.WatchResponse.kv:type_name -> penumbra.cnidarium.v1alpha1.WatchResponse.KeyValue + 8, // 3: penumbra.cnidarium.v1alpha1.WatchResponse.nv_kv:type_name -> penumbra.cnidarium.v1alpha1.WatchResponse.NvKeyValue + 0, // 4: penumbra.cnidarium.v1alpha1.QueryService.KeyValue:input_type -> penumbra.cnidarium.v1alpha1.KeyValueRequest + 2, // 5: penumbra.cnidarium.v1alpha1.QueryService.PrefixValue:input_type -> penumbra.cnidarium.v1alpha1.PrefixValueRequest + 4, // 6: penumbra.cnidarium.v1alpha1.QueryService.Watch:input_type -> penumbra.cnidarium.v1alpha1.WatchRequest + 1, // 7: penumbra.cnidarium.v1alpha1.QueryService.KeyValue:output_type -> penumbra.cnidarium.v1alpha1.KeyValueResponse + 3, // 8: penumbra.cnidarium.v1alpha1.QueryService.PrefixValue:output_type -> penumbra.cnidarium.v1alpha1.PrefixValueResponse + 5, // 9: penumbra.cnidarium.v1alpha1.QueryService.Watch:output_type -> penumbra.cnidarium.v1alpha1.WatchResponse + 7, // [7:10] is the sub-list for method output_type + 4, // [4:7] is the sub-list for method input_type + 4, // [4:4] is the sub-list for extension type_name + 4, // [4:4] is the sub-list for extension extendee + 0, // [0:4] is the sub-list for field type_name } func init() { file_penumbra_cnidarium_v1alpha1_cnidarium_proto_init() } @@ -469,6 +801,30 @@ func file_penumbra_cnidarium_v1alpha1_cnidarium_proto_init() { } } file_penumbra_cnidarium_v1alpha1_cnidarium_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*WatchRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_penumbra_cnidarium_v1alpha1_cnidarium_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*WatchResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_penumbra_cnidarium_v1alpha1_cnidarium_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*KeyValueResponse_Value); i { case 0: return &v.state @@ -480,6 +836,34 @@ func file_penumbra_cnidarium_v1alpha1_cnidarium_proto_init() { return nil } } + file_penumbra_cnidarium_v1alpha1_cnidarium_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*WatchResponse_KeyValue); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_penumbra_cnidarium_v1alpha1_cnidarium_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*WatchResponse_NvKeyValue); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + file_penumbra_cnidarium_v1alpha1_cnidarium_proto_msgTypes[5].OneofWrappers = []interface{}{ + (*WatchResponse_Kv)(nil), + (*WatchResponse_NvKv)(nil), } type x struct{} out := protoimpl.TypeBuilder{ @@ -487,7 +871,7 @@ func file_penumbra_cnidarium_v1alpha1_cnidarium_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_penumbra_cnidarium_v1alpha1_cnidarium_proto_rawDesc, NumEnums: 0, - NumMessages: 5, + NumMessages: 9, NumExtensions: 0, NumServices: 1, }, diff --git a/proto/go/gen/penumbra/core/app/v1alpha1/app.pb.go b/proto/go/gen/penumbra/core/app/v1alpha1/app.pb.go index b51947e985..7b6789a8ed 100644 --- a/proto/go/gen/penumbra/core/app/v1alpha1/app.pb.go +++ b/proto/go/gen/penumbra/core/app/v1alpha1/app.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.31.0 +// protoc-gen-go v1.32.0 // protoc (unknown) // source: penumbra/core/app/v1alpha1/app.proto @@ -8,7 +8,7 @@ package appv1alpha1 import ( v1alpha11 "github.com/penumbra-zone/penumbra/proto/go/gen/penumbra/core/component/chain/v1alpha1" - v1alpha12 "github.com/penumbra-zone/penumbra/proto/go/gen/penumbra/core/component/dao/v1alpha1" + v1alpha12 "github.com/penumbra-zone/penumbra/proto/go/gen/penumbra/core/component/community_pool/v1alpha1" v1alpha17 "github.com/penumbra-zone/penumbra/proto/go/gen/penumbra/core/component/distributions/v1alpha1" v1alpha16 "github.com/penumbra-zone/penumbra/proto/go/gen/penumbra/core/component/fee/v1alpha1" v1alpha13 "github.com/penumbra-zone/penumbra/proto/go/gen/penumbra/core/component/governance/v1alpha1" @@ -152,8 +152,8 @@ type AppParameters struct { // Chain module parameters. ChainParams *v1alpha11.ChainParameters `protobuf:"bytes,1,opt,name=chain_params,json=chainParams,proto3" json:"chain_params,omitempty"` - // DAO module parameters. - DaoParams *v1alpha12.DaoParameters `protobuf:"bytes,2,opt,name=dao_params,json=daoParams,proto3" json:"dao_params,omitempty"` + // Community Pool module parameters. + CommunityPoolParams *v1alpha12.CommunityPoolParameters `protobuf:"bytes,2,opt,name=community_pool_params,json=communityPoolParams,proto3" json:"community_pool_params,omitempty"` // Governance module parameters. GovernanceParams *v1alpha13.GovernanceParameters `protobuf:"bytes,3,opt,name=governance_params,json=governanceParams,proto3" json:"governance_params,omitempty"` // IBC module parameters. @@ -205,9 +205,9 @@ func (x *AppParameters) GetChainParams() *v1alpha11.ChainParameters { return nil } -func (x *AppParameters) GetDaoParams() *v1alpha12.DaoParameters { +func (x *AppParameters) GetCommunityPoolParams() *v1alpha12.CommunityPoolParameters { if x != nil { - return x.DaoParams + return x.CommunityPoolParams } return nil } @@ -439,8 +439,8 @@ type GenesisContent struct { IbcContent *v1alpha14.GenesisContent `protobuf:"bytes,4,opt,name=ibc_content,json=ibcContent,proto3" json:"ibc_content,omitempty"` // Chain module genesis state. ChainContent *v1alpha11.GenesisContent `protobuf:"bytes,5,opt,name=chain_content,json=chainContent,proto3" json:"chain_content,omitempty"` - // DAO module genesis state. - DaoContent *v1alpha12.GenesisContent `protobuf:"bytes,6,opt,name=dao_content,json=daoContent,proto3" json:"dao_content,omitempty"` + // Community Pool module genesis state. + CommunityPoolContent *v1alpha12.GenesisContent `protobuf:"bytes,6,opt,name=community_pool_content,json=communityPoolContent,proto3" json:"community_pool_content,omitempty"` // Fee module genesis state. FeeContent *v1alpha16.GenesisContent `protobuf:"bytes,7,opt,name=fee_content,json=feeContent,proto3" json:"fee_content,omitempty"` // Distributions module genesis state. @@ -514,9 +514,9 @@ func (x *GenesisContent) GetChainContent() *v1alpha11.GenesisContent { return nil } -func (x *GenesisContent) GetDaoContent() *v1alpha12.GenesisContent { +func (x *GenesisContent) GetCommunityPoolContent() *v1alpha12.GenesisContent { if x != nil { - return x.DaoContent + return x.CommunityPoolContent } return nil } @@ -545,62 +545,66 @@ var file_penumbra_core_app_v1alpha1_app_proto_rawDesc = []byte{ 0x61, 0x31, 0x1a, 0x32, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2f, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x63, 0x68, 0x61, 0x69, 0x6e, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x44, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2f, - 0x64, 0x61, 0x6f, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x64, 0x61, 0x6f, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x42, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, - 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2f, - 0x64, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x76, 0x31, - 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x64, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x2e, 0x70, 0x65, 0x6e, 0x75, - 0x6d, 0x62, 0x72, 0x61, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, - 0x65, 0x6e, 0x74, 0x2f, 0x66, 0x65, 0x65, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, - 0x2f, 0x66, 0x65, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x3c, 0x70, 0x65, 0x6e, 0x75, - 0x6d, 0x62, 0x72, 0x61, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, - 0x65, 0x6e, 0x74, 0x2f, 0x67, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x2f, 0x76, - 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x67, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, - 0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, - 0x72, 0x61, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, - 0x74, 0x2f, 0x69, 0x62, 0x63, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x69, - 0x62, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x42, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, - 0x72, 0x61, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, - 0x74, 0x2f, 0x73, 0x68, 0x69, 0x65, 0x6c, 0x64, 0x65, 0x64, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x2f, - 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x73, 0x68, 0x69, 0x65, 0x6c, 0x64, 0x65, - 0x64, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x32, 0x70, 0x65, + 0x63, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x74, 0x79, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x2f, 0x76, + 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x74, + 0x79, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x42, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x63, 0x6f, 0x6d, 0x70, - 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2f, 0x73, 0x74, 0x61, 0x6b, 0x65, 0x2f, 0x76, 0x31, 0x61, 0x6c, - 0x70, 0x68, 0x61, 0x31, 0x2f, 0x73, 0x74, 0x61, 0x6b, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x1a, 0x34, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, - 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x76, 0x31, 0x61, 0x6c, - 0x70, 0x68, 0x61, 0x31, 0x2f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x5b, 0x0a, 0x1b, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0x79, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 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, - 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, 0x22, 0x96, 0x01, 0x0a, 0x1c, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x42, 0x79, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x53, 0x0a, 0x0c, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x70, 0x65, 0x6e, - 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, - 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, - 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0c, 0x74, 0x72, 0x61, - 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 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, 0x22, 0xaf, 0x05, 0x0a, - 0x0d, 0x41, 0x70, 0x70, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x12, 0x5a, - 0x0a, 0x0c, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, - 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x63, - 0x68, 0x61, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x43, 0x68, - 0x61, 0x69, 0x6e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x52, 0x0b, 0x63, - 0x68, 0x61, 0x69, 0x6e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x52, 0x0a, 0x0a, 0x64, 0x61, - 0x6f, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x33, - 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, - 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x64, 0x61, 0x6f, 0x2e, 0x76, 0x31, 0x61, - 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, 0x61, 0x6f, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, - 0x65, 0x72, 0x73, 0x52, 0x09, 0x64, 0x61, 0x6f, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x6e, + 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2f, 0x64, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x64, 0x69, 0x73, + 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x1a, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, + 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2f, 0x66, 0x65, 0x65, 0x2f, 0x76, 0x31, + 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x66, 0x65, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x1a, 0x3c, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, + 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2f, 0x67, 0x6f, 0x76, 0x65, 0x72, 0x6e, + 0x61, 0x6e, 0x63, 0x65, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x67, 0x6f, + 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x2e, + 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x63, 0x6f, + 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2f, 0x69, 0x62, 0x63, 0x2f, 0x76, 0x31, 0x61, 0x6c, + 0x70, 0x68, 0x61, 0x31, 0x2f, 0x69, 0x62, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x42, + 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x63, 0x6f, + 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2f, 0x73, 0x68, 0x69, 0x65, 0x6c, 0x64, 0x65, 0x64, + 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x73, + 0x68, 0x69, 0x65, 0x6c, 0x64, 0x65, 0x64, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x1a, 0x32, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2f, 0x63, 0x6f, 0x72, + 0x65, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2f, 0x73, 0x74, 0x61, 0x6b, + 0x65, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x73, 0x74, 0x61, 0x6b, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x34, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, + 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x74, 0x72, 0x61, 0x6e, 0x73, + 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x5b, 0x0a, 0x1b, + 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0x79, 0x48, 0x65, + 0x69, 0x67, 0x68, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 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, 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, 0x22, 0x96, 0x01, 0x0a, 0x1c, 0x54, 0x72, + 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0x79, 0x48, 0x65, 0x69, 0x67, + 0x68, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x53, 0x0a, 0x0c, 0x74, 0x72, + 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x2f, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, + 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x61, + 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x0c, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 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, 0x22, 0xd9, 0x05, 0x0a, 0x0d, 0x41, 0x70, 0x70, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, + 0x74, 0x65, 0x72, 0x73, 0x12, 0x5a, 0x0a, 0x0c, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x70, 0x61, + 0x72, 0x61, 0x6d, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x70, 0x65, 0x6e, + 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, + 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, + 0x68, 0x61, 0x31, 0x2e, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, + 0x65, 0x72, 0x73, 0x52, 0x0b, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, + 0x12, 0x7c, 0x0a, 0x15, 0x63, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x74, 0x79, 0x5f, 0x70, 0x6f, + 0x6f, 0x6c, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x48, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, + 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, + 0x69, 0x74, 0x79, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, + 0x31, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x74, 0x79, 0x50, 0x6f, 0x6f, 0x6c, 0x50, + 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x52, 0x13, 0x63, 0x6f, 0x6d, 0x6d, 0x75, + 0x6e, 0x69, 0x74, 0x79, 0x50, 0x6f, 0x6f, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x6e, 0x0a, 0x11, 0x67, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x41, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, @@ -652,7 +656,7 @@ var file_penumbra_core_app_v1alpha1_app_proto_rawDesc = []byte{ 0x69, 0x73, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, 0x11, 0x67, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x42, 0x13, 0x0a, 0x11, 0x67, 0x65, 0x6e, 0x65, - 0x73, 0x69, 0x73, 0x5f, 0x61, 0x70, 0x70, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, 0xa4, 0x06, + 0x73, 0x69, 0x73, 0x5f, 0x61, 0x70, 0x70, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, 0xc4, 0x06, 0x0a, 0x0e, 0x47, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x5b, 0x0a, 0x0d, 0x73, 0x74, 0x61, 0x6b, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, @@ -685,12 +689,14 @@ var file_penumbra_core_app_v1alpha1_app_proto_rawDesc = []byte{ 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x52, 0x0c, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, - 0x74, 0x12, 0x55, 0x0a, 0x0b, 0x64, 0x61, 0x6f, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, - 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, - 0x2e, 0x64, 0x61, 0x6f, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x47, 0x65, - 0x6e, 0x65, 0x73, 0x69, 0x73, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x52, 0x0a, 0x64, 0x61, - 0x6f, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x55, 0x0a, 0x0b, 0x66, 0x65, 0x65, 0x5f, + 0x74, 0x12, 0x75, 0x0a, 0x16, 0x63, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x74, 0x79, 0x5f, 0x70, + 0x6f, 0x6f, 0x6c, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x3f, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, + 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, + 0x75, 0x6e, 0x69, 0x74, 0x79, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, + 0x68, 0x61, 0x31, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x43, 0x6f, 0x6e, 0x74, 0x65, + 0x6e, 0x74, 0x52, 0x14, 0x63, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x74, 0x79, 0x50, 0x6f, 0x6f, + 0x6c, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x55, 0x0a, 0x0b, 0x66, 0x65, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x66, 0x65, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, @@ -763,7 +769,7 @@ var file_penumbra_core_app_v1alpha1_app_proto_goTypes = []interface{}{ (*GenesisContent)(nil), // 6: penumbra.core.app.v1alpha1.GenesisContent (*v1alpha1.Transaction)(nil), // 7: penumbra.core.transaction.v1alpha1.Transaction (*v1alpha11.ChainParameters)(nil), // 8: penumbra.core.component.chain.v1alpha1.ChainParameters - (*v1alpha12.DaoParameters)(nil), // 9: penumbra.core.component.dao.v1alpha1.DaoParameters + (*v1alpha12.CommunityPoolParameters)(nil), // 9: penumbra.core.component.community_pool.v1alpha1.CommunityPoolParameters (*v1alpha13.GovernanceParameters)(nil), // 10: penumbra.core.component.governance.v1alpha1.GovernanceParameters (*v1alpha14.IbcParameters)(nil), // 11: penumbra.core.component.ibc.v1alpha1.IbcParameters (*v1alpha15.StakeParameters)(nil), // 12: penumbra.core.component.stake.v1alpha1.StakeParameters @@ -774,14 +780,14 @@ var file_penumbra_core_app_v1alpha1_app_proto_goTypes = []interface{}{ (*v1alpha13.GenesisContent)(nil), // 17: penumbra.core.component.governance.v1alpha1.GenesisContent (*v1alpha14.GenesisContent)(nil), // 18: penumbra.core.component.ibc.v1alpha1.GenesisContent (*v1alpha11.GenesisContent)(nil), // 19: penumbra.core.component.chain.v1alpha1.GenesisContent - (*v1alpha12.GenesisContent)(nil), // 20: penumbra.core.component.dao.v1alpha1.GenesisContent + (*v1alpha12.GenesisContent)(nil), // 20: penumbra.core.component.community_pool.v1alpha1.GenesisContent (*v1alpha16.GenesisContent)(nil), // 21: penumbra.core.component.fee.v1alpha1.GenesisContent (*v1alpha17.GenesisContent)(nil), // 22: penumbra.core.component.distributions.v1alpha1.GenesisContent } var file_penumbra_core_app_v1alpha1_app_proto_depIdxs = []int32{ 7, // 0: penumbra.core.app.v1alpha1.TransactionsByHeightResponse.transactions:type_name -> penumbra.core.transaction.v1alpha1.Transaction 8, // 1: penumbra.core.app.v1alpha1.AppParameters.chain_params:type_name -> penumbra.core.component.chain.v1alpha1.ChainParameters - 9, // 2: penumbra.core.app.v1alpha1.AppParameters.dao_params:type_name -> penumbra.core.component.dao.v1alpha1.DaoParameters + 9, // 2: penumbra.core.app.v1alpha1.AppParameters.community_pool_params:type_name -> penumbra.core.component.community_pool.v1alpha1.CommunityPoolParameters 10, // 3: penumbra.core.app.v1alpha1.AppParameters.governance_params:type_name -> penumbra.core.component.governance.v1alpha1.GovernanceParameters 11, // 4: penumbra.core.app.v1alpha1.AppParameters.ibc_params:type_name -> penumbra.core.component.ibc.v1alpha1.IbcParameters 12, // 5: penumbra.core.app.v1alpha1.AppParameters.stake_params:type_name -> penumbra.core.component.stake.v1alpha1.StakeParameters @@ -794,7 +800,7 @@ var file_penumbra_core_app_v1alpha1_app_proto_depIdxs = []int32{ 17, // 12: penumbra.core.app.v1alpha1.GenesisContent.governance_content:type_name -> penumbra.core.component.governance.v1alpha1.GenesisContent 18, // 13: penumbra.core.app.v1alpha1.GenesisContent.ibc_content:type_name -> penumbra.core.component.ibc.v1alpha1.GenesisContent 19, // 14: penumbra.core.app.v1alpha1.GenesisContent.chain_content:type_name -> penumbra.core.component.chain.v1alpha1.GenesisContent - 20, // 15: penumbra.core.app.v1alpha1.GenesisContent.dao_content:type_name -> penumbra.core.component.dao.v1alpha1.GenesisContent + 20, // 15: penumbra.core.app.v1alpha1.GenesisContent.community_pool_content:type_name -> penumbra.core.component.community_pool.v1alpha1.GenesisContent 21, // 16: penumbra.core.app.v1alpha1.GenesisContent.fee_content:type_name -> penumbra.core.component.fee.v1alpha1.GenesisContent 22, // 17: penumbra.core.app.v1alpha1.GenesisContent.distributions_content:type_name -> penumbra.core.component.distributions.v1alpha1.GenesisContent 3, // 18: penumbra.core.app.v1alpha1.QueryService.AppParameters:input_type -> penumbra.core.app.v1alpha1.AppParametersRequest diff --git a/proto/go/gen/penumbra/core/asset/v1alpha1/asset.pb.go b/proto/go/gen/penumbra/core/asset/v1alpha1/asset.pb.go index f42fa117c8..2c8407e352 100644 --- a/proto/go/gen/penumbra/core/asset/v1alpha1/asset.pb.go +++ b/proto/go/gen/penumbra/core/asset/v1alpha1/asset.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.31.0 +// protoc-gen-go v1.32.0 // protoc (unknown) // source: penumbra/core/asset/v1alpha1/asset.proto diff --git a/proto/go/gen/penumbra/core/component/chain/v1alpha1/chain.pb.go b/proto/go/gen/penumbra/core/component/chain/v1alpha1/chain.pb.go index 5e7e80954d..885a003812 100644 --- a/proto/go/gen/penumbra/core/component/chain/v1alpha1/chain.pb.go +++ b/proto/go/gen/penumbra/core/component/chain/v1alpha1/chain.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.31.0 +// protoc-gen-go v1.32.0 // protoc (unknown) // source: penumbra/core/component/chain/v1alpha1/chain.proto diff --git a/proto/go/gen/penumbra/core/component/community_pool/v1alpha1/community_pool.pb.go b/proto/go/gen/penumbra/core/component/community_pool/v1alpha1/community_pool.pb.go new file mode 100644 index 0000000000..a6403397c5 --- /dev/null +++ b/proto/go/gen/penumbra/core/component/community_pool/v1alpha1/community_pool.pb.go @@ -0,0 +1,422 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.32.0 +// protoc (unknown) +// source: penumbra/core/component/community_pool/v1alpha1/community_pool.proto + +package community_poolv1alpha1 + +import ( + v1alpha1 "github.com/penumbra-zone/penumbra/proto/go/gen/penumbra/core/asset/v1alpha1" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +// CommunityPool parameter data. +type CommunityPoolParameters struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Whether Community Pool spend proposals are enabled. + CommunityPoolSpendProposalsEnabled bool `protobuf:"varint,1,opt,name=community_pool_spend_proposals_enabled,json=communityPoolSpendProposalsEnabled,proto3" json:"community_pool_spend_proposals_enabled,omitempty"` +} + +func (x *CommunityPoolParameters) Reset() { + *x = CommunityPoolParameters{} + if protoimpl.UnsafeEnabled { + mi := &file_penumbra_core_component_community_pool_v1alpha1_community_pool_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CommunityPoolParameters) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CommunityPoolParameters) ProtoMessage() {} + +func (x *CommunityPoolParameters) ProtoReflect() protoreflect.Message { + mi := &file_penumbra_core_component_community_pool_v1alpha1_community_pool_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CommunityPoolParameters.ProtoReflect.Descriptor instead. +func (*CommunityPoolParameters) Descriptor() ([]byte, []int) { + return file_penumbra_core_component_community_pool_v1alpha1_community_pool_proto_rawDescGZIP(), []int{0} +} + +func (x *CommunityPoolParameters) GetCommunityPoolSpendProposalsEnabled() bool { + if x != nil { + return x.CommunityPoolSpendProposalsEnabled + } + return false +} + +// CommunityPool genesis state. +type GenesisContent struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // CommunityPool parameters. + CommunityPoolParams *CommunityPoolParameters `protobuf:"bytes,1,opt,name=community_pool_params,json=communityPoolParams,proto3" json:"community_pool_params,omitempty"` +} + +func (x *GenesisContent) Reset() { + *x = GenesisContent{} + if protoimpl.UnsafeEnabled { + mi := &file_penumbra_core_component_community_pool_v1alpha1_community_pool_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GenesisContent) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GenesisContent) ProtoMessage() {} + +func (x *GenesisContent) ProtoReflect() protoreflect.Message { + mi := &file_penumbra_core_component_community_pool_v1alpha1_community_pool_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GenesisContent.ProtoReflect.Descriptor instead. +func (*GenesisContent) Descriptor() ([]byte, []int) { + return file_penumbra_core_component_community_pool_v1alpha1_community_pool_proto_rawDescGZIP(), []int{1} +} + +func (x *GenesisContent) GetCommunityPoolParams() *CommunityPoolParameters { + if x != nil { + return x.CommunityPoolParams + } + return nil +} + +// Requests the list of all asset balances associated with the Community Pool. +type CommunityPoolAssetBalancesRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The expected chain id (empty string if no expectation). + ChainId string `protobuf:"bytes,1,opt,name=chain_id,json=chainId,proto3" json:"chain_id,omitempty"` + // (Optional): The specific asset balances to retrieve, if excluded all will be returned. + AssetIds []*v1alpha1.AssetId `protobuf:"bytes,2,rep,name=asset_ids,json=assetIds,proto3" json:"asset_ids,omitempty"` +} + +func (x *CommunityPoolAssetBalancesRequest) Reset() { + *x = CommunityPoolAssetBalancesRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_penumbra_core_component_community_pool_v1alpha1_community_pool_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CommunityPoolAssetBalancesRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CommunityPoolAssetBalancesRequest) ProtoMessage() {} + +func (x *CommunityPoolAssetBalancesRequest) ProtoReflect() protoreflect.Message { + mi := &file_penumbra_core_component_community_pool_v1alpha1_community_pool_proto_msgTypes[2] + 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 CommunityPoolAssetBalancesRequest.ProtoReflect.Descriptor instead. +func (*CommunityPoolAssetBalancesRequest) Descriptor() ([]byte, []int) { + return file_penumbra_core_component_community_pool_v1alpha1_community_pool_proto_rawDescGZIP(), []int{2} +} + +func (x *CommunityPoolAssetBalancesRequest) GetChainId() string { + if x != nil { + return x.ChainId + } + return "" +} + +func (x *CommunityPoolAssetBalancesRequest) GetAssetIds() []*v1alpha1.AssetId { + if x != nil { + return x.AssetIds + } + return nil +} + +// The Community Pool's balance of a single asset. +type CommunityPoolAssetBalancesResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The balance for a single asset. + Balance *v1alpha1.Value `protobuf:"bytes,1,opt,name=balance,proto3" json:"balance,omitempty"` +} + +func (x *CommunityPoolAssetBalancesResponse) Reset() { + *x = CommunityPoolAssetBalancesResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_penumbra_core_component_community_pool_v1alpha1_community_pool_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CommunityPoolAssetBalancesResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CommunityPoolAssetBalancesResponse) ProtoMessage() {} + +func (x *CommunityPoolAssetBalancesResponse) ProtoReflect() protoreflect.Message { + mi := &file_penumbra_core_component_community_pool_v1alpha1_community_pool_proto_msgTypes[3] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CommunityPoolAssetBalancesResponse.ProtoReflect.Descriptor instead. +func (*CommunityPoolAssetBalancesResponse) Descriptor() ([]byte, []int) { + return file_penumbra_core_component_community_pool_v1alpha1_community_pool_proto_rawDescGZIP(), []int{3} +} + +func (x *CommunityPoolAssetBalancesResponse) GetBalance() *v1alpha1.Value { + if x != nil { + return x.Balance + } + return nil +} + +var File_penumbra_core_component_community_pool_v1alpha1_community_pool_proto protoreflect.FileDescriptor + +var file_penumbra_core_component_community_pool_v1alpha1_community_pool_proto_rawDesc = []byte{ + 0x0a, 0x44, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, + 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, + 0x69, 0x74, 0x79, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, + 0x31, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x74, 0x79, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x2f, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, + 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, + 0x63, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x74, 0x79, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x2e, 0x76, + 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x1a, 0x28, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, + 0x61, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x61, 0x73, 0x73, 0x65, 0x74, 0x2f, 0x76, 0x31, 0x61, + 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x61, 0x73, 0x73, 0x65, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x22, 0x6d, 0x0a, 0x17, 0x43, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x74, 0x79, 0x50, 0x6f, + 0x6f, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x12, 0x52, 0x0a, 0x26, + 0x63, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x74, 0x79, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x73, + 0x70, 0x65, 0x6e, 0x64, 0x5f, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x73, 0x5f, 0x65, + 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x22, 0x63, 0x6f, + 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x74, 0x79, 0x50, 0x6f, 0x6f, 0x6c, 0x53, 0x70, 0x65, 0x6e, 0x64, + 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x73, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, + 0x22, 0x8e, 0x01, 0x0a, 0x0e, 0x47, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x43, 0x6f, 0x6e, 0x74, + 0x65, 0x6e, 0x74, 0x12, 0x7c, 0x0a, 0x15, 0x63, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x74, 0x79, + 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x48, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, + 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x63, 0x6f, 0x6d, + 0x6d, 0x75, 0x6e, 0x69, 0x74, 0x79, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x2e, 0x76, 0x31, 0x61, 0x6c, + 0x70, 0x68, 0x61, 0x31, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x74, 0x79, 0x50, 0x6f, + 0x6f, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x52, 0x13, 0x63, 0x6f, + 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x74, 0x79, 0x50, 0x6f, 0x6f, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, + 0x73, 0x22, 0x82, 0x01, 0x0a, 0x21, 0x43, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x74, 0x79, 0x50, + 0x6f, 0x6f, 0x6c, 0x41, 0x73, 0x73, 0x65, 0x74, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 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, 0x12, 0x42, 0x0a, 0x09, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x73, 0x18, + 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, + 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, + 0x70, 0x68, 0x61, 0x31, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x49, 0x64, 0x52, 0x08, 0x61, 0x73, + 0x73, 0x65, 0x74, 0x49, 0x64, 0x73, 0x22, 0x63, 0x0a, 0x22, 0x43, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, + 0x69, 0x74, 0x79, 0x50, 0x6f, 0x6f, 0x6c, 0x41, 0x73, 0x73, 0x65, 0x74, 0x42, 0x61, 0x6c, 0x61, + 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3d, 0x0a, 0x07, + 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, + 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x73, + 0x73, 0x65, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x56, 0x61, 0x6c, + 0x75, 0x65, 0x52, 0x07, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x32, 0xd8, 0x01, 0x0a, 0x0c, + 0x51, 0x75, 0x65, 0x72, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0xc7, 0x01, 0x0a, + 0x1a, 0x43, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x74, 0x79, 0x50, 0x6f, 0x6f, 0x6c, 0x41, 0x73, + 0x73, 0x65, 0x74, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x12, 0x52, 0x2e, 0x70, 0x65, + 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, + 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x74, 0x79, 0x5f, + 0x70, 0x6f, 0x6f, 0x6c, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x43, 0x6f, + 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x74, 0x79, 0x50, 0x6f, 0x6f, 0x6c, 0x41, 0x73, 0x73, 0x65, 0x74, + 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x53, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, + 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, + 0x69, 0x74, 0x79, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, + 0x31, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x74, 0x79, 0x50, 0x6f, 0x6f, 0x6c, 0x41, + 0x73, 0x73, 0x65, 0x74, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x30, 0x01, 0x42, 0x9d, 0x03, 0x0a, 0x33, 0x63, 0x6f, 0x6d, 0x2e, 0x70, + 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, + 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x74, 0x79, + 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x42, 0x12, + 0x43, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x74, 0x79, 0x50, 0x6f, 0x6f, 0x6c, 0x50, 0x72, 0x6f, + 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x75, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, + 0x2f, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2d, 0x7a, 0x6f, 0x6e, 0x65, 0x2f, 0x70, + 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x6f, + 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2f, 0x63, 0x6f, + 0x72, 0x65, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2f, 0x63, 0x6f, 0x6d, + 0x6d, 0x75, 0x6e, 0x69, 0x74, 0x79, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x2f, 0x76, 0x31, 0x61, 0x6c, + 0x70, 0x68, 0x61, 0x31, 0x3b, 0x63, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x74, 0x79, 0x5f, 0x70, + 0x6f, 0x6f, 0x6c, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0xa2, 0x02, 0x04, 0x50, 0x43, + 0x43, 0x43, 0xaa, 0x02, 0x2e, 0x50, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x43, 0x6f, + 0x72, 0x65, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x6f, 0x6d, + 0x6d, 0x75, 0x6e, 0x69, 0x74, 0x79, 0x50, 0x6f, 0x6f, 0x6c, 0x2e, 0x56, 0x31, 0x61, 0x6c, 0x70, + 0x68, 0x61, 0x31, 0xca, 0x02, 0x2e, 0x50, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x5c, 0x43, + 0x6f, 0x72, 0x65, 0x5c, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x5c, 0x43, 0x6f, + 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x74, 0x79, 0x50, 0x6f, 0x6f, 0x6c, 0x5c, 0x56, 0x31, 0x61, 0x6c, + 0x70, 0x68, 0x61, 0x31, 0xe2, 0x02, 0x3a, 0x50, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x5c, + 0x43, 0x6f, 0x72, 0x65, 0x5c, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x5c, 0x43, + 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x74, 0x79, 0x50, 0x6f, 0x6f, 0x6c, 0x5c, 0x56, 0x31, 0x61, + 0x6c, 0x70, 0x68, 0x61, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, + 0x61, 0xea, 0x02, 0x32, 0x50, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x3a, 0x3a, 0x43, 0x6f, + 0x72, 0x65, 0x3a, 0x3a, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x3a, 0x3a, 0x43, + 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x74, 0x79, 0x50, 0x6f, 0x6f, 0x6c, 0x3a, 0x3a, 0x56, 0x31, + 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_penumbra_core_component_community_pool_v1alpha1_community_pool_proto_rawDescOnce sync.Once + file_penumbra_core_component_community_pool_v1alpha1_community_pool_proto_rawDescData = file_penumbra_core_component_community_pool_v1alpha1_community_pool_proto_rawDesc +) + +func file_penumbra_core_component_community_pool_v1alpha1_community_pool_proto_rawDescGZIP() []byte { + file_penumbra_core_component_community_pool_v1alpha1_community_pool_proto_rawDescOnce.Do(func() { + file_penumbra_core_component_community_pool_v1alpha1_community_pool_proto_rawDescData = protoimpl.X.CompressGZIP(file_penumbra_core_component_community_pool_v1alpha1_community_pool_proto_rawDescData) + }) + return file_penumbra_core_component_community_pool_v1alpha1_community_pool_proto_rawDescData +} + +var file_penumbra_core_component_community_pool_v1alpha1_community_pool_proto_msgTypes = make([]protoimpl.MessageInfo, 4) +var file_penumbra_core_component_community_pool_v1alpha1_community_pool_proto_goTypes = []interface{}{ + (*CommunityPoolParameters)(nil), // 0: penumbra.core.component.community_pool.v1alpha1.CommunityPoolParameters + (*GenesisContent)(nil), // 1: penumbra.core.component.community_pool.v1alpha1.GenesisContent + (*CommunityPoolAssetBalancesRequest)(nil), // 2: penumbra.core.component.community_pool.v1alpha1.CommunityPoolAssetBalancesRequest + (*CommunityPoolAssetBalancesResponse)(nil), // 3: penumbra.core.component.community_pool.v1alpha1.CommunityPoolAssetBalancesResponse + (*v1alpha1.AssetId)(nil), // 4: penumbra.core.asset.v1alpha1.AssetId + (*v1alpha1.Value)(nil), // 5: penumbra.core.asset.v1alpha1.Value +} +var file_penumbra_core_component_community_pool_v1alpha1_community_pool_proto_depIdxs = []int32{ + 0, // 0: penumbra.core.component.community_pool.v1alpha1.GenesisContent.community_pool_params:type_name -> penumbra.core.component.community_pool.v1alpha1.CommunityPoolParameters + 4, // 1: penumbra.core.component.community_pool.v1alpha1.CommunityPoolAssetBalancesRequest.asset_ids:type_name -> penumbra.core.asset.v1alpha1.AssetId + 5, // 2: penumbra.core.component.community_pool.v1alpha1.CommunityPoolAssetBalancesResponse.balance:type_name -> penumbra.core.asset.v1alpha1.Value + 2, // 3: penumbra.core.component.community_pool.v1alpha1.QueryService.CommunityPoolAssetBalances:input_type -> penumbra.core.component.community_pool.v1alpha1.CommunityPoolAssetBalancesRequest + 3, // 4: penumbra.core.component.community_pool.v1alpha1.QueryService.CommunityPoolAssetBalances:output_type -> penumbra.core.component.community_pool.v1alpha1.CommunityPoolAssetBalancesResponse + 4, // [4:5] is the sub-list for method output_type + 3, // [3:4] is the sub-list for method input_type + 3, // [3:3] is the sub-list for extension type_name + 3, // [3:3] is the sub-list for extension extendee + 0, // [0:3] is the sub-list for field type_name +} + +func init() { file_penumbra_core_component_community_pool_v1alpha1_community_pool_proto_init() } +func file_penumbra_core_component_community_pool_v1alpha1_community_pool_proto_init() { + if File_penumbra_core_component_community_pool_v1alpha1_community_pool_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_penumbra_core_component_community_pool_v1alpha1_community_pool_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CommunityPoolParameters); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_penumbra_core_component_community_pool_v1alpha1_community_pool_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GenesisContent); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_penumbra_core_component_community_pool_v1alpha1_community_pool_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CommunityPoolAssetBalancesRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_penumbra_core_component_community_pool_v1alpha1_community_pool_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CommunityPoolAssetBalancesResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_penumbra_core_component_community_pool_v1alpha1_community_pool_proto_rawDesc, + NumEnums: 0, + NumMessages: 4, + NumExtensions: 0, + NumServices: 1, + }, + GoTypes: file_penumbra_core_component_community_pool_v1alpha1_community_pool_proto_goTypes, + DependencyIndexes: file_penumbra_core_component_community_pool_v1alpha1_community_pool_proto_depIdxs, + MessageInfos: file_penumbra_core_component_community_pool_v1alpha1_community_pool_proto_msgTypes, + }.Build() + File_penumbra_core_component_community_pool_v1alpha1_community_pool_proto = out.File + file_penumbra_core_component_community_pool_v1alpha1_community_pool_proto_rawDesc = nil + file_penumbra_core_component_community_pool_v1alpha1_community_pool_proto_goTypes = nil + file_penumbra_core_component_community_pool_v1alpha1_community_pool_proto_depIdxs = nil +} diff --git a/proto/go/gen/penumbra/core/component/compact_block/v1alpha1/compact_block.pb.go b/proto/go/gen/penumbra/core/component/compact_block/v1alpha1/compact_block.pb.go index 986f115279..f10f73e391 100644 --- a/proto/go/gen/penumbra/core/component/compact_block/v1alpha1/compact_block.pb.go +++ b/proto/go/gen/penumbra/core/component/compact_block/v1alpha1/compact_block.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.31.0 +// protoc-gen-go v1.32.0 // protoc (unknown) // source: penumbra/core/component/compact_block/v1alpha1/compact_block.proto @@ -12,7 +12,6 @@ import ( v1alpha14 "github.com/penumbra-zone/penumbra/proto/go/gen/penumbra/core/component/fee/v1alpha1" v1alpha1 "github.com/penumbra-zone/penumbra/proto/go/gen/penumbra/core/component/sct/v1alpha1" v1alpha15 "github.com/penumbra-zone/penumbra/proto/go/gen/penumbra/core/component/shielded_pool/v1alpha1" - _ "github.com/penumbra-zone/penumbra/proto/go/gen/penumbra/core/transaction/v1alpha1" v1alpha11 "github.com/penumbra-zone/penumbra/proto/go/gen/penumbra/crypto/tct/v1alpha1" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" @@ -557,152 +556,149 @@ var file_penumbra_core_component_compact_block_v1alpha1_compact_block_proto_rawD 0x64, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x26, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2f, 0x63, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x2f, 0x74, 0x63, 0x74, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x74, 0x63, 0x74, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x34, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2f, 0x63, - 0x6f, 0x72, 0x65, 0x2f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2f, - 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xdb, 0x05, 0x0a, 0x0c, 0x43, - 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x16, 0x0a, 0x06, 0x68, - 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x68, 0x65, 0x69, - 0x67, 0x68, 0x74, 0x12, 0x63, 0x0a, 0x0e, 0x73, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x70, 0x61, 0x79, - 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3c, 0x2e, 0x70, 0x65, - 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, - 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x5f, 0x62, 0x6c, - 0x6f, 0x63, 0x6b, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x74, 0x61, - 0x74, 0x65, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x0d, 0x73, 0x74, 0x61, 0x74, 0x65, - 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x12, 0x4f, 0x0a, 0x0a, 0x6e, 0x75, 0x6c, 0x6c, - 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x70, - 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, - 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x63, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, - 0x68, 0x61, 0x31, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x69, 0x66, 0x69, 0x65, 0x72, 0x52, 0x0a, 0x6e, - 0x75, 0x6c, 0x6c, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x12, 0x47, 0x0a, 0x0a, 0x62, 0x6c, 0x6f, - 0x63, 0x6b, 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, - 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x2e, - 0x74, 0x63, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4d, 0x65, 0x72, - 0x6b, 0x6c, 0x65, 0x52, 0x6f, 0x6f, 0x74, 0x52, 0x09, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x6f, - 0x6f, 0x74, 0x12, 0x47, 0x0a, 0x0a, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x72, 0x6f, 0x6f, 0x74, - 0x18, 0x11, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, - 0x61, 0x2e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x2e, 0x74, 0x63, 0x74, 0x2e, 0x76, 0x31, 0x61, - 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4d, 0x65, 0x72, 0x6b, 0x6c, 0x65, 0x52, 0x6f, 0x6f, 0x74, - 0x52, 0x09, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x52, 0x6f, 0x6f, 0x74, 0x12, 0x29, 0x0a, 0x10, 0x70, - 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x18, - 0x14, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x53, - 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x12, 0x5c, 0x0a, 0x0e, 0x66, 0x6d, 0x64, 0x5f, 0x70, 0x61, - 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, 0x64, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x35, - 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, - 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x2e, 0x76, - 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x46, 0x6d, 0x64, 0x50, 0x61, 0x72, 0x61, 0x6d, - 0x65, 0x74, 0x65, 0x72, 0x73, 0x52, 0x0d, 0x66, 0x6d, 0x64, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, - 0x74, 0x65, 0x72, 0x73, 0x12, 0x5c, 0x0a, 0x0c, 0x73, 0x77, 0x61, 0x70, 0x5f, 0x6f, 0x75, 0x74, - 0x70, 0x75, 0x74, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x70, 0x65, 0x6e, - 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, - 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x64, 0x65, 0x78, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, - 0x31, 0x2e, 0x42, 0x61, 0x74, 0x63, 0x68, 0x53, 0x77, 0x61, 0x70, 0x4f, 0x75, 0x74, 0x70, 0x75, - 0x74, 0x44, 0x61, 0x74, 0x61, 0x52, 0x0b, 0x73, 0x77, 0x61, 0x70, 0x4f, 0x75, 0x74, 0x70, 0x75, - 0x74, 0x73, 0x12, 0x34, 0x0a, 0x16, 0x61, 0x70, 0x70, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, - 0x74, 0x65, 0x72, 0x73, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x14, 0x61, 0x70, 0x70, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, - 0x73, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x12, 0x4e, 0x0a, 0x0a, 0x67, 0x61, 0x73, 0x5f, - 0x70, 0x72, 0x69, 0x63, 0x65, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x70, - 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, - 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x66, 0x65, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, - 0x68, 0x61, 0x31, 0x2e, 0x47, 0x61, 0x73, 0x50, 0x72, 0x69, 0x63, 0x65, 0x73, 0x52, 0x09, 0x67, - 0x61, 0x73, 0x50, 0x72, 0x69, 0x63, 0x65, 0x73, 0x22, 0x8a, 0x05, 0x0a, 0x0c, 0x53, 0x74, 0x61, - 0x74, 0x65, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x4e, 0x0a, 0x06, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x70, 0x65, 0x6e, 0x75, - 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, - 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x63, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, - 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x52, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x64, 0x0a, 0x09, 0x72, 0x6f, 0x6c, - 0x6c, 0x65, 0x64, 0x5f, 0x75, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x45, 0x2e, 0x70, - 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, - 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x5f, 0x62, - 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x74, - 0x61, 0x74, 0x65, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x2e, 0x52, 0x6f, 0x6c, 0x6c, 0x65, - 0x64, 0x55, 0x70, 0x48, 0x00, 0x52, 0x08, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x64, 0x55, 0x70, 0x12, - 0x57, 0x0a, 0x04, 0x6e, 0x6f, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x41, 0x2e, - 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, - 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x5f, - 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, - 0x74, 0x61, 0x74, 0x65, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x2e, 0x4e, 0x6f, 0x74, 0x65, - 0x48, 0x00, 0x52, 0x04, 0x6e, 0x6f, 0x74, 0x65, 0x12, 0x57, 0x0a, 0x04, 0x73, 0x77, 0x61, 0x70, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x41, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, + 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xdb, 0x05, 0x0a, 0x0c, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, + 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x16, 0x0a, 0x06, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x63, 0x0a, + 0x0e, 0x73, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x18, + 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3c, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, + 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, + 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x76, 0x31, + 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x50, 0x61, 0x79, 0x6c, + 0x6f, 0x61, 0x64, 0x52, 0x0d, 0x73, 0x74, 0x61, 0x74, 0x65, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, + 0x64, 0x73, 0x12, 0x4f, 0x0a, 0x0a, 0x6e, 0x75, 0x6c, 0x6c, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, + 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, + 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, + 0x2e, 0x73, 0x63, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4e, 0x75, + 0x6c, 0x6c, 0x69, 0x66, 0x69, 0x65, 0x72, 0x52, 0x0a, 0x6e, 0x75, 0x6c, 0x6c, 0x69, 0x66, 0x69, + 0x65, 0x72, 0x73, 0x12, 0x47, 0x0a, 0x0a, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x72, 0x6f, 0x6f, + 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, + 0x72, 0x61, 0x2e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x2e, 0x74, 0x63, 0x74, 0x2e, 0x76, 0x31, + 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4d, 0x65, 0x72, 0x6b, 0x6c, 0x65, 0x52, 0x6f, 0x6f, + 0x74, 0x52, 0x09, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x6f, 0x6f, 0x74, 0x12, 0x47, 0x0a, 0x0a, + 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x28, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x72, 0x79, 0x70, + 0x74, 0x6f, 0x2e, 0x74, 0x63, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, + 0x4d, 0x65, 0x72, 0x6b, 0x6c, 0x65, 0x52, 0x6f, 0x6f, 0x74, 0x52, 0x09, 0x65, 0x70, 0x6f, 0x63, + 0x68, 0x52, 0x6f, 0x6f, 0x74, 0x12, 0x29, 0x0a, 0x10, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, + 0x6c, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x18, 0x14, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x0f, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x53, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, + 0x12, 0x5c, 0x0a, 0x0e, 0x66, 0x6d, 0x64, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, + 0x72, 0x73, 0x18, 0x64, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, + 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, + 0x6e, 0x74, 0x2e, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, + 0x31, 0x2e, 0x46, 0x6d, 0x64, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x52, + 0x0d, 0x66, 0x6d, 0x64, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x12, 0x5c, + 0x0a, 0x0c, 0x73, 0x77, 0x61, 0x70, 0x5f, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x73, 0x18, 0x05, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, + 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x64, + 0x65, 0x78, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x42, 0x61, 0x74, 0x63, + 0x68, 0x53, 0x77, 0x61, 0x70, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x44, 0x61, 0x74, 0x61, 0x52, + 0x0b, 0x73, 0x77, 0x61, 0x70, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x73, 0x12, 0x34, 0x0a, 0x16, + 0x61, 0x70, 0x70, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x5f, 0x75, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x61, 0x70, + 0x70, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x55, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x64, 0x12, 0x4e, 0x0a, 0x0a, 0x67, 0x61, 0x73, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x73, + 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, + 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, + 0x2e, 0x66, 0x65, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x47, 0x61, + 0x73, 0x50, 0x72, 0x69, 0x63, 0x65, 0x73, 0x52, 0x09, 0x67, 0x61, 0x73, 0x50, 0x72, 0x69, 0x63, + 0x65, 0x73, 0x22, 0x8a, 0x05, 0x0a, 0x0c, 0x53, 0x74, 0x61, 0x74, 0x65, 0x50, 0x61, 0x79, 0x6c, + 0x6f, 0x61, 0x64, 0x12, 0x4e, 0x0a, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, + 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x63, + 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, + 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x06, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x12, 0x64, 0x0a, 0x09, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x64, 0x5f, 0x75, 0x70, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x45, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x50, 0x61, 0x79, - 0x6c, 0x6f, 0x61, 0x64, 0x2e, 0x53, 0x77, 0x61, 0x70, 0x48, 0x00, 0x52, 0x04, 0x73, 0x77, 0x61, - 0x70, 0x1a, 0x59, 0x0a, 0x08, 0x52, 0x6f, 0x6c, 0x6c, 0x65, 0x64, 0x55, 0x70, 0x12, 0x4d, 0x0a, - 0x0a, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x2d, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x72, 0x79, - 0x70, 0x74, 0x6f, 0x2e, 0x74, 0x63, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, - 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, - 0x52, 0x0a, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x1a, 0x57, 0x0a, 0x04, - 0x4e, 0x6f, 0x74, 0x65, 0x12, 0x4f, 0x0a, 0x04, 0x6e, 0x6f, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x3b, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, - 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x68, 0x69, - 0x65, 0x6c, 0x64, 0x65, 0x64, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, - 0x68, 0x61, 0x31, 0x2e, 0x4e, 0x6f, 0x74, 0x65, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x52, - 0x04, 0x6e, 0x6f, 0x74, 0x65, 0x1a, 0x4d, 0x0a, 0x04, 0x53, 0x77, 0x61, 0x70, 0x12, 0x45, 0x0a, - 0x04, 0x73, 0x77, 0x61, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x70, 0x65, - 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, - 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x64, 0x65, 0x78, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, - 0x61, 0x31, 0x2e, 0x53, 0x77, 0x61, 0x70, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x04, - 0x73, 0x77, 0x61, 0x70, 0x42, 0x0f, 0x0a, 0x0d, 0x73, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x70, 0x61, - 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x22, 0x96, 0x01, 0x0a, 0x18, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x63, - 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 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, 0x12, 0x21, 0x0a, - 0x0c, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x04, 0x52, 0x0b, 0x73, 0x74, 0x61, 0x72, 0x74, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, - 0x12, 0x1d, 0x0a, 0x0a, 0x65, 0x6e, 0x64, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x65, 0x6e, 0x64, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, - 0x1d, 0x0a, 0x0a, 0x6b, 0x65, 0x65, 0x70, 0x5f, 0x61, 0x6c, 0x69, 0x76, 0x65, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x09, 0x6b, 0x65, 0x65, 0x70, 0x41, 0x6c, 0x69, 0x76, 0x65, 0x22, 0x7e, - 0x0a, 0x19, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x61, - 0x6e, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x61, 0x0a, 0x0d, 0x63, - 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x3c, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, - 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x63, 0x6f, 0x6d, - 0x70, 0x61, 0x63, 0x74, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, - 0x68, 0x61, 0x31, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, - 0x52, 0x0c, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x32, 0xbb, - 0x01, 0x0a, 0x0c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, - 0xaa, 0x01, 0x0a, 0x11, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, - 0x52, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x48, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, + 0x6c, 0x6f, 0x61, 0x64, 0x2e, 0x52, 0x6f, 0x6c, 0x6c, 0x65, 0x64, 0x55, 0x70, 0x48, 0x00, 0x52, + 0x08, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x64, 0x55, 0x70, 0x12, 0x57, 0x0a, 0x04, 0x6e, 0x6f, 0x74, + 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x41, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, + 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, + 0x74, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, + 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x50, 0x61, + 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x2e, 0x4e, 0x6f, 0x74, 0x65, 0x48, 0x00, 0x52, 0x04, 0x6e, 0x6f, + 0x74, 0x65, 0x12, 0x57, 0x0a, 0x04, 0x73, 0x77, 0x61, 0x70, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x41, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, + 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x61, + 0x63, 0x74, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, + 0x31, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x2e, 0x53, + 0x77, 0x61, 0x70, 0x48, 0x00, 0x52, 0x04, 0x73, 0x77, 0x61, 0x70, 0x1a, 0x59, 0x0a, 0x08, 0x52, + 0x6f, 0x6c, 0x6c, 0x65, 0x64, 0x55, 0x70, 0x12, 0x4d, 0x0a, 0x0a, 0x63, 0x6f, 0x6d, 0x6d, 0x69, + 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x70, 0x65, + 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x2e, 0x74, 0x63, + 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, + 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0a, 0x63, 0x6f, 0x6d, 0x6d, + 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x1a, 0x57, 0x0a, 0x04, 0x4e, 0x6f, 0x74, 0x65, 0x12, 0x4f, + 0x0a, 0x04, 0x6e, 0x6f, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3b, 0x2e, 0x70, + 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, + 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x68, 0x69, 0x65, 0x6c, 0x64, 0x65, 0x64, 0x5f, + 0x70, 0x6f, 0x6f, 0x6c, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4e, 0x6f, + 0x74, 0x65, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x04, 0x6e, 0x6f, 0x74, 0x65, 0x1a, + 0x4d, 0x0a, 0x04, 0x53, 0x77, 0x61, 0x70, 0x12, 0x45, 0x0a, 0x04, 0x73, 0x77, 0x61, 0x70, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, - 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x76, 0x31, - 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x42, 0x6c, - 0x6f, 0x63, 0x6b, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x49, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, + 0x64, 0x65, 0x78, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x77, 0x61, + 0x70, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x04, 0x73, 0x77, 0x61, 0x70, 0x42, 0x0f, + 0x0a, 0x0d, 0x73, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x22, + 0x96, 0x01, 0x0a, 0x18, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, + 0x52, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 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, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x74, 0x61, 0x72, 0x74, + 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x73, + 0x74, 0x61, 0x72, 0x74, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x65, 0x6e, + 0x64, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, + 0x65, 0x6e, 0x64, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x6b, 0x65, 0x65, + 0x70, 0x5f, 0x61, 0x6c, 0x69, 0x76, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x6b, + 0x65, 0x65, 0x70, 0x41, 0x6c, 0x69, 0x76, 0x65, 0x22, 0x7e, 0x0a, 0x19, 0x43, 0x6f, 0x6d, 0x70, + 0x61, 0x63, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x61, 0x0a, 0x0d, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, + 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3c, 0x2e, 0x70, + 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, + 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x5f, 0x62, + 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x43, 0x6f, + 0x6d, 0x70, 0x61, 0x63, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x0c, 0x63, 0x6f, 0x6d, 0x70, + 0x61, 0x63, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x32, 0xbb, 0x01, 0x0a, 0x0c, 0x51, 0x75, 0x65, + 0x72, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0xaa, 0x01, 0x0a, 0x11, 0x43, 0x6f, + 0x6d, 0x70, 0x61, 0x63, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x12, + 0x48, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x61, 0x6e, - 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x30, 0x01, 0x42, 0x95, 0x03, 0x0a, - 0x32, 0x63, 0x6f, 0x6d, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, - 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x63, 0x6f, 0x6d, - 0x70, 0x61, 0x63, 0x74, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, - 0x68, 0x61, 0x31, 0x42, 0x11, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x42, 0x6c, 0x6f, 0x63, - 0x6b, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x73, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, - 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2d, 0x7a, 0x6f, - 0x6e, 0x65, 0x2f, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2f, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x2f, 0x67, 0x6f, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, - 0x61, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, - 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2f, 0x76, - 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x3b, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x5f, - 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0xa2, 0x02, 0x04, - 0x50, 0x43, 0x43, 0x43, 0xaa, 0x02, 0x2d, 0x50, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, - 0x43, 0x6f, 0x72, 0x65, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x43, - 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x56, 0x31, 0x61, 0x6c, - 0x70, 0x68, 0x61, 0x31, 0xca, 0x02, 0x2d, 0x50, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x5c, - 0x43, 0x6f, 0x72, 0x65, 0x5c, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x5c, 0x43, - 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x5c, 0x56, 0x31, 0x61, 0x6c, - 0x70, 0x68, 0x61, 0x31, 0xe2, 0x02, 0x39, 0x50, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x5c, - 0x43, 0x6f, 0x72, 0x65, 0x5c, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x5c, 0x43, - 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x5c, 0x56, 0x31, 0x61, 0x6c, - 0x70, 0x68, 0x61, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, - 0xea, 0x02, 0x31, 0x50, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x3a, 0x3a, 0x43, 0x6f, 0x72, - 0x65, 0x3a, 0x3a, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x3a, 0x3a, 0x43, 0x6f, - 0x6d, 0x70, 0x61, 0x63, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x3a, 0x3a, 0x56, 0x31, 0x61, 0x6c, - 0x70, 0x68, 0x61, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x49, 0x2e, 0x70, 0x65, 0x6e, 0x75, + 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, + 0x65, 0x6e, 0x74, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x5f, 0x62, 0x6c, 0x6f, 0x63, + 0x6b, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x61, + 0x63, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x30, 0x01, 0x42, 0x95, 0x03, 0x0a, 0x32, 0x63, 0x6f, 0x6d, 0x2e, 0x70, + 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, + 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x5f, 0x62, + 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x42, 0x11, 0x43, + 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x50, 0x72, 0x6f, 0x74, 0x6f, + 0x50, 0x01, 0x5a, 0x73, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, + 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2d, 0x7a, 0x6f, 0x6e, 0x65, 0x2f, 0x70, 0x65, 0x6e, + 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x6f, 0x2f, 0x67, + 0x65, 0x6e, 0x2f, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2f, 0x63, 0x6f, 0x72, 0x65, + 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x61, + 0x63, 0x74, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, + 0x31, 0x3b, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x76, + 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0xa2, 0x02, 0x04, 0x50, 0x43, 0x43, 0x43, 0xaa, 0x02, + 0x2d, 0x50, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x43, 0x6f, 0x72, 0x65, 0x2e, 0x43, + 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, + 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x56, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0xca, 0x02, + 0x2d, 0x50, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x5c, 0x43, 0x6f, 0x72, 0x65, 0x5c, 0x43, + 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x5c, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, + 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x5c, 0x56, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0xe2, 0x02, + 0x39, 0x50, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x5c, 0x43, 0x6f, 0x72, 0x65, 0x5c, 0x43, + 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x5c, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, + 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x5c, 0x56, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x5c, 0x47, + 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x31, 0x50, 0x65, 0x6e, + 0x75, 0x6d, 0x62, 0x72, 0x61, 0x3a, 0x3a, 0x43, 0x6f, 0x72, 0x65, 0x3a, 0x3a, 0x43, 0x6f, 0x6d, + 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x3a, 0x3a, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x42, + 0x6c, 0x6f, 0x63, 0x6b, 0x3a, 0x3a, 0x56, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x62, 0x06, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/proto/go/gen/penumbra/core/component/dao/v1alpha1/dao.pb.go b/proto/go/gen/penumbra/core/component/dao/v1alpha1/dao.pb.go deleted file mode 100644 index 95b04ba89b..0000000000 --- a/proto/go/gen/penumbra/core/component/dao/v1alpha1/dao.pb.go +++ /dev/null @@ -1,406 +0,0 @@ -// Code generated by protoc-gen-go. DO NOT EDIT. -// versions: -// protoc-gen-go v1.31.0 -// protoc (unknown) -// source: penumbra/core/component/dao/v1alpha1/dao.proto - -package daov1alpha1 - -import ( - v1alpha1 "github.com/penumbra-zone/penumbra/proto/go/gen/penumbra/core/asset/v1alpha1" - protoreflect "google.golang.org/protobuf/reflect/protoreflect" - protoimpl "google.golang.org/protobuf/runtime/protoimpl" - reflect "reflect" - sync "sync" -) - -const ( - // Verify that this generated code is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) - // Verify that runtime/protoimpl is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) -) - -// Dao parameter data. -type DaoParameters struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // Whether DAO spend proposals are enabled. - DaoSpendProposalsEnabled bool `protobuf:"varint,1,opt,name=dao_spend_proposals_enabled,json=daoSpendProposalsEnabled,proto3" json:"dao_spend_proposals_enabled,omitempty"` -} - -func (x *DaoParameters) Reset() { - *x = DaoParameters{} - if protoimpl.UnsafeEnabled { - mi := &file_penumbra_core_component_dao_v1alpha1_dao_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *DaoParameters) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*DaoParameters) ProtoMessage() {} - -func (x *DaoParameters) ProtoReflect() protoreflect.Message { - mi := &file_penumbra_core_component_dao_v1alpha1_dao_proto_msgTypes[0] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use DaoParameters.ProtoReflect.Descriptor instead. -func (*DaoParameters) Descriptor() ([]byte, []int) { - return file_penumbra_core_component_dao_v1alpha1_dao_proto_rawDescGZIP(), []int{0} -} - -func (x *DaoParameters) GetDaoSpendProposalsEnabled() bool { - if x != nil { - return x.DaoSpendProposalsEnabled - } - return false -} - -// Dao genesis state. -type GenesisContent struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // Dao parameters. - DaoParams *DaoParameters `protobuf:"bytes,1,opt,name=dao_params,json=daoParams,proto3" json:"dao_params,omitempty"` -} - -func (x *GenesisContent) Reset() { - *x = GenesisContent{} - if protoimpl.UnsafeEnabled { - mi := &file_penumbra_core_component_dao_v1alpha1_dao_proto_msgTypes[1] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *GenesisContent) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*GenesisContent) ProtoMessage() {} - -func (x *GenesisContent) ProtoReflect() protoreflect.Message { - mi := &file_penumbra_core_component_dao_v1alpha1_dao_proto_msgTypes[1] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use GenesisContent.ProtoReflect.Descriptor instead. -func (*GenesisContent) Descriptor() ([]byte, []int) { - return file_penumbra_core_component_dao_v1alpha1_dao_proto_rawDescGZIP(), []int{1} -} - -func (x *GenesisContent) GetDaoParams() *DaoParameters { - if x != nil { - return x.DaoParams - } - return nil -} - -// Requests the list of all asset balances associated with the DAO. -type DaoAssetBalancesRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // The expected chain id (empty string if no expectation). - ChainId string `protobuf:"bytes,1,opt,name=chain_id,json=chainId,proto3" json:"chain_id,omitempty"` - // (Optional): The specific asset balances to retrieve, if excluded all will be returned. - AssetIds []*v1alpha1.AssetId `protobuf:"bytes,2,rep,name=asset_ids,json=assetIds,proto3" json:"asset_ids,omitempty"` -} - -func (x *DaoAssetBalancesRequest) Reset() { - *x = DaoAssetBalancesRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_penumbra_core_component_dao_v1alpha1_dao_proto_msgTypes[2] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *DaoAssetBalancesRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*DaoAssetBalancesRequest) ProtoMessage() {} - -func (x *DaoAssetBalancesRequest) ProtoReflect() protoreflect.Message { - mi := &file_penumbra_core_component_dao_v1alpha1_dao_proto_msgTypes[2] - 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 DaoAssetBalancesRequest.ProtoReflect.Descriptor instead. -func (*DaoAssetBalancesRequest) Descriptor() ([]byte, []int) { - return file_penumbra_core_component_dao_v1alpha1_dao_proto_rawDescGZIP(), []int{2} -} - -func (x *DaoAssetBalancesRequest) GetChainId() string { - if x != nil { - return x.ChainId - } - return "" -} - -func (x *DaoAssetBalancesRequest) GetAssetIds() []*v1alpha1.AssetId { - if x != nil { - return x.AssetIds - } - return nil -} - -// The DAO's balance of a single asset. -type DaoAssetBalancesResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // The balance for a single asset. - Balance *v1alpha1.Value `protobuf:"bytes,1,opt,name=balance,proto3" json:"balance,omitempty"` -} - -func (x *DaoAssetBalancesResponse) Reset() { - *x = DaoAssetBalancesResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_penumbra_core_component_dao_v1alpha1_dao_proto_msgTypes[3] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *DaoAssetBalancesResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*DaoAssetBalancesResponse) ProtoMessage() {} - -func (x *DaoAssetBalancesResponse) ProtoReflect() protoreflect.Message { - mi := &file_penumbra_core_component_dao_v1alpha1_dao_proto_msgTypes[3] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use DaoAssetBalancesResponse.ProtoReflect.Descriptor instead. -func (*DaoAssetBalancesResponse) Descriptor() ([]byte, []int) { - return file_penumbra_core_component_dao_v1alpha1_dao_proto_rawDescGZIP(), []int{3} -} - -func (x *DaoAssetBalancesResponse) GetBalance() *v1alpha1.Value { - if x != nil { - return x.Balance - } - return nil -} - -var File_penumbra_core_component_dao_v1alpha1_dao_proto protoreflect.FileDescriptor - -var file_penumbra_core_component_dao_v1alpha1_dao_proto_rawDesc = []byte{ - 0x0a, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, - 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2f, 0x64, 0x61, 0x6f, 0x2f, 0x76, 0x31, - 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x64, 0x61, 0x6f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x12, 0x24, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, - 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x64, 0x61, 0x6f, 0x2e, 0x76, 0x31, - 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x1a, 0x28, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, - 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x61, 0x73, 0x73, 0x65, 0x74, 0x2f, 0x76, 0x31, 0x61, 0x6c, - 0x70, 0x68, 0x61, 0x31, 0x2f, 0x61, 0x73, 0x73, 0x65, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x22, 0x4e, 0x0a, 0x0d, 0x44, 0x61, 0x6f, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, - 0x73, 0x12, 0x3d, 0x0a, 0x1b, 0x64, 0x61, 0x6f, 0x5f, 0x73, 0x70, 0x65, 0x6e, 0x64, 0x5f, 0x70, - 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x73, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x18, 0x64, 0x61, 0x6f, 0x53, 0x70, 0x65, 0x6e, 0x64, - 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x73, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, - 0x22, 0x64, 0x0a, 0x0e, 0x47, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x43, 0x6f, 0x6e, 0x74, 0x65, - 0x6e, 0x74, 0x12, 0x52, 0x0a, 0x0a, 0x64, 0x61, 0x6f, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, - 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, - 0x2e, 0x64, 0x61, 0x6f, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, 0x61, - 0x6f, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x52, 0x09, 0x64, 0x61, 0x6f, - 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x22, 0x78, 0x0a, 0x17, 0x44, 0x61, 0x6f, 0x41, 0x73, 0x73, - 0x65, 0x74, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 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, 0x12, 0x42, 0x0a, 0x09, - 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x25, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, - 0x61, 0x73, 0x73, 0x65, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x41, - 0x73, 0x73, 0x65, 0x74, 0x49, 0x64, 0x52, 0x08, 0x61, 0x73, 0x73, 0x65, 0x74, 0x49, 0x64, 0x73, - 0x22, 0x59, 0x0a, 0x18, 0x44, 0x61, 0x6f, 0x41, 0x73, 0x73, 0x65, 0x74, 0x42, 0x61, 0x6c, 0x61, - 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3d, 0x0a, 0x07, - 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, - 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x73, - 0x73, 0x65, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x56, 0x61, 0x6c, - 0x75, 0x65, 0x52, 0x07, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x32, 0xa4, 0x01, 0x0a, 0x0c, - 0x51, 0x75, 0x65, 0x72, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x93, 0x01, 0x0a, - 0x10, 0x44, 0x61, 0x6f, 0x41, 0x73, 0x73, 0x65, 0x74, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, - 0x73, 0x12, 0x3d, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, - 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x64, 0x61, 0x6f, 0x2e, - 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, 0x61, 0x6f, 0x41, 0x73, 0x73, 0x65, - 0x74, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x3e, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, - 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x64, 0x61, 0x6f, 0x2e, 0x76, - 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, 0x61, 0x6f, 0x41, 0x73, 0x73, 0x65, 0x74, - 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x30, 0x01, 0x42, 0xca, 0x02, 0x0a, 0x28, 0x63, 0x6f, 0x6d, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, - 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, - 0x6e, 0x74, 0x2e, 0x64, 0x61, 0x6f, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x42, - 0x08, 0x44, 0x61, 0x6f, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x5f, 0x67, 0x69, 0x74, - 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, - 0x2d, 0x7a, 0x6f, 0x6e, 0x65, 0x2f, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2f, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x6f, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x70, 0x65, 0x6e, 0x75, - 0x6d, 0x62, 0x72, 0x61, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, - 0x65, 0x6e, 0x74, 0x2f, 0x64, 0x61, 0x6f, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, - 0x3b, 0x64, 0x61, 0x6f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0xa2, 0x02, 0x04, 0x50, - 0x43, 0x43, 0x44, 0xaa, 0x02, 0x24, 0x50, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x43, - 0x6f, 0x72, 0x65, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x44, 0x61, - 0x6f, 0x2e, 0x56, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0xca, 0x02, 0x24, 0x50, 0x65, 0x6e, - 0x75, 0x6d, 0x62, 0x72, 0x61, 0x5c, 0x43, 0x6f, 0x72, 0x65, 0x5c, 0x43, 0x6f, 0x6d, 0x70, 0x6f, - 0x6e, 0x65, 0x6e, 0x74, 0x5c, 0x44, 0x61, 0x6f, 0x5c, 0x56, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, - 0x31, 0xe2, 0x02, 0x30, 0x50, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x5c, 0x43, 0x6f, 0x72, - 0x65, 0x5c, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x5c, 0x44, 0x61, 0x6f, 0x5c, - 0x56, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, - 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x28, 0x50, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x3a, - 0x3a, 0x43, 0x6f, 0x72, 0x65, 0x3a, 0x3a, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, - 0x3a, 0x3a, 0x44, 0x61, 0x6f, 0x3a, 0x3a, 0x56, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x62, - 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, -} - -var ( - file_penumbra_core_component_dao_v1alpha1_dao_proto_rawDescOnce sync.Once - file_penumbra_core_component_dao_v1alpha1_dao_proto_rawDescData = file_penumbra_core_component_dao_v1alpha1_dao_proto_rawDesc -) - -func file_penumbra_core_component_dao_v1alpha1_dao_proto_rawDescGZIP() []byte { - file_penumbra_core_component_dao_v1alpha1_dao_proto_rawDescOnce.Do(func() { - file_penumbra_core_component_dao_v1alpha1_dao_proto_rawDescData = protoimpl.X.CompressGZIP(file_penumbra_core_component_dao_v1alpha1_dao_proto_rawDescData) - }) - return file_penumbra_core_component_dao_v1alpha1_dao_proto_rawDescData -} - -var file_penumbra_core_component_dao_v1alpha1_dao_proto_msgTypes = make([]protoimpl.MessageInfo, 4) -var file_penumbra_core_component_dao_v1alpha1_dao_proto_goTypes = []interface{}{ - (*DaoParameters)(nil), // 0: penumbra.core.component.dao.v1alpha1.DaoParameters - (*GenesisContent)(nil), // 1: penumbra.core.component.dao.v1alpha1.GenesisContent - (*DaoAssetBalancesRequest)(nil), // 2: penumbra.core.component.dao.v1alpha1.DaoAssetBalancesRequest - (*DaoAssetBalancesResponse)(nil), // 3: penumbra.core.component.dao.v1alpha1.DaoAssetBalancesResponse - (*v1alpha1.AssetId)(nil), // 4: penumbra.core.asset.v1alpha1.AssetId - (*v1alpha1.Value)(nil), // 5: penumbra.core.asset.v1alpha1.Value -} -var file_penumbra_core_component_dao_v1alpha1_dao_proto_depIdxs = []int32{ - 0, // 0: penumbra.core.component.dao.v1alpha1.GenesisContent.dao_params:type_name -> penumbra.core.component.dao.v1alpha1.DaoParameters - 4, // 1: penumbra.core.component.dao.v1alpha1.DaoAssetBalancesRequest.asset_ids:type_name -> penumbra.core.asset.v1alpha1.AssetId - 5, // 2: penumbra.core.component.dao.v1alpha1.DaoAssetBalancesResponse.balance:type_name -> penumbra.core.asset.v1alpha1.Value - 2, // 3: penumbra.core.component.dao.v1alpha1.QueryService.DaoAssetBalances:input_type -> penumbra.core.component.dao.v1alpha1.DaoAssetBalancesRequest - 3, // 4: penumbra.core.component.dao.v1alpha1.QueryService.DaoAssetBalances:output_type -> penumbra.core.component.dao.v1alpha1.DaoAssetBalancesResponse - 4, // [4:5] is the sub-list for method output_type - 3, // [3:4] is the sub-list for method input_type - 3, // [3:3] is the sub-list for extension type_name - 3, // [3:3] is the sub-list for extension extendee - 0, // [0:3] is the sub-list for field type_name -} - -func init() { file_penumbra_core_component_dao_v1alpha1_dao_proto_init() } -func file_penumbra_core_component_dao_v1alpha1_dao_proto_init() { - if File_penumbra_core_component_dao_v1alpha1_dao_proto != nil { - return - } - if !protoimpl.UnsafeEnabled { - file_penumbra_core_component_dao_v1alpha1_dao_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DaoParameters); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_penumbra_core_component_dao_v1alpha1_dao_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GenesisContent); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_penumbra_core_component_dao_v1alpha1_dao_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DaoAssetBalancesRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_penumbra_core_component_dao_v1alpha1_dao_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DaoAssetBalancesResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - } - type x struct{} - out := protoimpl.TypeBuilder{ - File: protoimpl.DescBuilder{ - GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_penumbra_core_component_dao_v1alpha1_dao_proto_rawDesc, - NumEnums: 0, - NumMessages: 4, - NumExtensions: 0, - NumServices: 1, - }, - GoTypes: file_penumbra_core_component_dao_v1alpha1_dao_proto_goTypes, - DependencyIndexes: file_penumbra_core_component_dao_v1alpha1_dao_proto_depIdxs, - MessageInfos: file_penumbra_core_component_dao_v1alpha1_dao_proto_msgTypes, - }.Build() - File_penumbra_core_component_dao_v1alpha1_dao_proto = out.File - file_penumbra_core_component_dao_v1alpha1_dao_proto_rawDesc = nil - file_penumbra_core_component_dao_v1alpha1_dao_proto_goTypes = nil - file_penumbra_core_component_dao_v1alpha1_dao_proto_depIdxs = nil -} diff --git a/proto/go/gen/penumbra/core/component/dex/v1alpha1/dex.pb.go b/proto/go/gen/penumbra/core/component/dex/v1alpha1/dex.pb.go index 301036bbcb..f8d2e0c20d 100644 --- a/proto/go/gen/penumbra/core/component/dex/v1alpha1/dex.pb.go +++ b/proto/go/gen/penumbra/core/component/dex/v1alpha1/dex.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.31.0 +// protoc-gen-go v1.32.0 // protoc (unknown) // source: penumbra/core/component/dex/v1alpha1/dex.proto diff --git a/proto/go/gen/penumbra/core/component/distributions/v1alpha1/distributions.pb.go b/proto/go/gen/penumbra/core/component/distributions/v1alpha1/distributions.pb.go index 07dac232c5..a3a8170413 100644 --- a/proto/go/gen/penumbra/core/component/distributions/v1alpha1/distributions.pb.go +++ b/proto/go/gen/penumbra/core/component/distributions/v1alpha1/distributions.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.31.0 +// protoc-gen-go v1.32.0 // protoc (unknown) // source: penumbra/core/component/distributions/v1alpha1/distributions.proto diff --git a/proto/go/gen/penumbra/core/component/fee/v1alpha1/fee.pb.go b/proto/go/gen/penumbra/core/component/fee/v1alpha1/fee.pb.go index 9e86de8b13..54a03a6eff 100644 --- a/proto/go/gen/penumbra/core/component/fee/v1alpha1/fee.pb.go +++ b/proto/go/gen/penumbra/core/component/fee/v1alpha1/fee.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.31.0 +// protoc-gen-go v1.32.0 // protoc (unknown) // source: penumbra/core/component/fee/v1alpha1/fee.proto diff --git a/proto/go/gen/penumbra/core/component/governance/v1alpha1/governance.pb.go b/proto/go/gen/penumbra/core/component/governance/v1alpha1/governance.pb.go index 69048709f1..eb493be881 100644 --- a/proto/go/gen/penumbra/core/component/governance/v1alpha1/governance.pb.go +++ b/proto/go/gen/penumbra/core/component/governance/v1alpha1/governance.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.31.0 +// protoc-gen-go v1.32.0 // protoc (unknown) // source: penumbra/core/component/governance/v1alpha1/governance.proto @@ -8,13 +8,14 @@ package governancev1alpha1 import ( v1alpha13 "github.com/penumbra-zone/penumbra/proto/go/gen/penumbra/core/asset/v1alpha1" - v1alpha16 "github.com/penumbra-zone/penumbra/proto/go/gen/penumbra/core/component/chain/v1alpha1" - v1alpha17 "github.com/penumbra-zone/penumbra/proto/go/gen/penumbra/core/component/dao/v1alpha1" - v1alpha110 "github.com/penumbra-zone/penumbra/proto/go/gen/penumbra/core/component/distributions/v1alpha1" - v1alpha19 "github.com/penumbra-zone/penumbra/proto/go/gen/penumbra/core/component/fee/v1alpha1" - v1alpha18 "github.com/penumbra-zone/penumbra/proto/go/gen/penumbra/core/component/ibc/v1alpha1" - v1alpha14 "github.com/penumbra-zone/penumbra/proto/go/gen/penumbra/core/component/shielded_pool/v1alpha1" - v1alpha15 "github.com/penumbra-zone/penumbra/proto/go/gen/penumbra/core/component/stake/v1alpha1" + v1alpha17 "github.com/penumbra-zone/penumbra/proto/go/gen/penumbra/core/component/chain/v1alpha1" + v1alpha18 "github.com/penumbra-zone/penumbra/proto/go/gen/penumbra/core/component/community_pool/v1alpha1" + v1alpha111 "github.com/penumbra-zone/penumbra/proto/go/gen/penumbra/core/component/distributions/v1alpha1" + v1alpha110 "github.com/penumbra-zone/penumbra/proto/go/gen/penumbra/core/component/fee/v1alpha1" + v1alpha19 "github.com/penumbra-zone/penumbra/proto/go/gen/penumbra/core/component/ibc/v1alpha1" + v1alpha14 "github.com/penumbra-zone/penumbra/proto/go/gen/penumbra/core/component/sct/v1alpha1" + v1alpha15 "github.com/penumbra-zone/penumbra/proto/go/gen/penumbra/core/component/shielded_pool/v1alpha1" + v1alpha16 "github.com/penumbra-zone/penumbra/proto/go/gen/penumbra/core/component/stake/v1alpha1" v1alpha12 "github.com/penumbra-zone/penumbra/proto/go/gen/penumbra/core/keys/v1alpha1" v1alpha1 "github.com/penumbra-zone/penumbra/proto/go/gen/penumbra/core/num/v1alpha1" v1alpha11 "github.com/penumbra-zone/penumbra/proto/go/gen/penumbra/crypto/decaf377_rdsa/v1alpha1" @@ -583,9 +584,9 @@ type DelegatorVoteBody struct { // The amount of the delegation note, in unbonded penumbra. UnbondedAmount *v1alpha1.Amount `protobuf:"bytes,5,opt,name=unbonded_amount,json=unbondedAmount,proto3" json:"unbonded_amount,omitempty"` // The nullifier of the input note. - Nullifier []byte `protobuf:"bytes,6,opt,name=nullifier,proto3" json:"nullifier,omitempty"` + Nullifier *v1alpha14.Nullifier `protobuf:"bytes,6,opt,name=nullifier,proto3" json:"nullifier,omitempty"` // The randomized validating key for the spend authorization signature. - Rk []byte `protobuf:"bytes,7,opt,name=rk,proto3" json:"rk,omitempty"` + Rk *v1alpha11.SpendVerificationKey `protobuf:"bytes,7,opt,name=rk,proto3" json:"rk,omitempty"` } func (x *DelegatorVoteBody) Reset() { @@ -655,14 +656,14 @@ func (x *DelegatorVoteBody) GetUnbondedAmount() *v1alpha1.Amount { return nil } -func (x *DelegatorVoteBody) GetNullifier() []byte { +func (x *DelegatorVoteBody) GetNullifier() *v1alpha14.Nullifier { if x != nil { return x.Nullifier } return nil } -func (x *DelegatorVoteBody) GetRk() []byte { +func (x *DelegatorVoteBody) GetRk() *v1alpha11.SpendVerificationKey { if x != nil { return x.Rk } @@ -762,7 +763,7 @@ type DelegatorVotePlan struct { // The vote to cast. Vote *Vote `protobuf:"bytes,3,opt,name=vote,proto3" json:"vote,omitempty"` // The delegation note to prove that we can vote. - StakedNote *v1alpha14.Note `protobuf:"bytes,4,opt,name=staked_note,json=stakedNote,proto3" json:"staked_note,omitempty"` + StakedNote *v1alpha15.Note `protobuf:"bytes,4,opt,name=staked_note,json=stakedNote,proto3" json:"staked_note,omitempty"` // The position of that delegation note. StakedNotePosition uint64 `protobuf:"varint,5,opt,name=staked_note_position,json=stakedNotePosition,proto3" json:"staked_note_position,omitempty"` // The unbonded amount equivalent to the delegation note. @@ -828,7 +829,7 @@ func (x *DelegatorVotePlan) GetVote() *Vote { return nil } -func (x *DelegatorVotePlan) GetStakedNote() *v1alpha14.Note { +func (x *DelegatorVotePlan) GetStakedNote() *v1alpha15.Note { if x != nil { return x.StakedNote } @@ -870,17 +871,17 @@ func (x *DelegatorVotePlan) GetProofBlindingS() []byte { return nil } -type DaoDeposit struct { +type CommunityPoolDeposit struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - // The value to deposit into the DAO. + // The value to deposit into the Community Pool. Value *v1alpha13.Value `protobuf:"bytes,1,opt,name=value,proto3" json:"value,omitempty"` } -func (x *DaoDeposit) Reset() { - *x = DaoDeposit{} +func (x *CommunityPoolDeposit) Reset() { + *x = CommunityPoolDeposit{} if protoimpl.UnsafeEnabled { mi := &file_penumbra_core_component_governance_v1alpha1_governance_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -888,13 +889,13 @@ func (x *DaoDeposit) Reset() { } } -func (x *DaoDeposit) String() string { +func (x *CommunityPoolDeposit) String() string { return protoimpl.X.MessageStringOf(x) } -func (*DaoDeposit) ProtoMessage() {} +func (*CommunityPoolDeposit) ProtoMessage() {} -func (x *DaoDeposit) ProtoReflect() protoreflect.Message { +func (x *CommunityPoolDeposit) ProtoReflect() protoreflect.Message { mi := &file_penumbra_core_component_governance_v1alpha1_governance_proto_msgTypes[11] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -906,29 +907,29 @@ func (x *DaoDeposit) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use DaoDeposit.ProtoReflect.Descriptor instead. -func (*DaoDeposit) Descriptor() ([]byte, []int) { +// Deprecated: Use CommunityPoolDeposit.ProtoReflect.Descriptor instead. +func (*CommunityPoolDeposit) Descriptor() ([]byte, []int) { return file_penumbra_core_component_governance_v1alpha1_governance_proto_rawDescGZIP(), []int{11} } -func (x *DaoDeposit) GetValue() *v1alpha13.Value { +func (x *CommunityPoolDeposit) GetValue() *v1alpha13.Value { if x != nil { return x.Value } return nil } -type DaoSpend struct { +type CommunityPoolSpend struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - // The value to spend from the DAO. + // The value to spend from the Community Pool. Value *v1alpha13.Value `protobuf:"bytes,1,opt,name=value,proto3" json:"value,omitempty"` } -func (x *DaoSpend) Reset() { - *x = DaoSpend{} +func (x *CommunityPoolSpend) Reset() { + *x = CommunityPoolSpend{} if protoimpl.UnsafeEnabled { mi := &file_penumbra_core_component_governance_v1alpha1_governance_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -936,13 +937,13 @@ func (x *DaoSpend) Reset() { } } -func (x *DaoSpend) String() string { +func (x *CommunityPoolSpend) String() string { return protoimpl.X.MessageStringOf(x) } -func (*DaoSpend) ProtoMessage() {} +func (*CommunityPoolSpend) ProtoMessage() {} -func (x *DaoSpend) ProtoReflect() protoreflect.Message { +func (x *CommunityPoolSpend) ProtoReflect() protoreflect.Message { mi := &file_penumbra_core_component_governance_v1alpha1_governance_proto_msgTypes[12] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -954,31 +955,31 @@ func (x *DaoSpend) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use DaoSpend.ProtoReflect.Descriptor instead. -func (*DaoSpend) Descriptor() ([]byte, []int) { +// Deprecated: Use CommunityPoolSpend.ProtoReflect.Descriptor instead. +func (*CommunityPoolSpend) Descriptor() ([]byte, []int) { return file_penumbra_core_component_governance_v1alpha1_governance_proto_rawDescGZIP(), []int{12} } -func (x *DaoSpend) GetValue() *v1alpha13.Value { +func (x *CommunityPoolSpend) GetValue() *v1alpha13.Value { if x != nil { return x.Value } return nil } -type DaoOutput struct { +type CommunityPoolOutput struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - // The value to output from the DAO. + // The value to output from the Community Pool. Value *v1alpha13.Value `protobuf:"bytes,1,opt,name=value,proto3" json:"value,omitempty"` // The address to send the output to. Address *v1alpha12.Address `protobuf:"bytes,2,opt,name=address,proto3" json:"address,omitempty"` } -func (x *DaoOutput) Reset() { - *x = DaoOutput{} +func (x *CommunityPoolOutput) Reset() { + *x = CommunityPoolOutput{} if protoimpl.UnsafeEnabled { mi := &file_penumbra_core_component_governance_v1alpha1_governance_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -986,13 +987,13 @@ func (x *DaoOutput) Reset() { } } -func (x *DaoOutput) String() string { +func (x *CommunityPoolOutput) String() string { return protoimpl.X.MessageStringOf(x) } -func (*DaoOutput) ProtoMessage() {} +func (*CommunityPoolOutput) ProtoMessage() {} -func (x *DaoOutput) ProtoReflect() protoreflect.Message { +func (x *CommunityPoolOutput) ProtoReflect() protoreflect.Message { mi := &file_penumbra_core_component_governance_v1alpha1_governance_proto_msgTypes[13] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1004,19 +1005,19 @@ func (x *DaoOutput) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use DaoOutput.ProtoReflect.Descriptor instead. -func (*DaoOutput) Descriptor() ([]byte, []int) { +// Deprecated: Use CommunityPoolOutput.ProtoReflect.Descriptor instead. +func (*CommunityPoolOutput) Descriptor() ([]byte, []int) { return file_penumbra_core_component_governance_v1alpha1_governance_proto_rawDescGZIP(), []int{13} } -func (x *DaoOutput) GetValue() *v1alpha13.Value { +func (x *CommunityPoolOutput) GetValue() *v1alpha13.Value { if x != nil { return x.Value } return nil } -func (x *DaoOutput) GetAddress() *v1alpha12.Address { +func (x *CommunityPoolOutput) GetAddress() *v1alpha12.Address { if x != nil { return x.Address } @@ -1360,11 +1361,13 @@ type Proposal struct { // A natural-language description of the effect of the proposal and its justification. Description string `protobuf:"bytes,2,opt,name=description,proto3" json:"description,omitempty"` // The different kinds of proposal. Only one of these should be set. - Signaling *Proposal_Signaling `protobuf:"bytes,5,opt,name=signaling,proto3" json:"signaling,omitempty"` - Emergency *Proposal_Emergency `protobuf:"bytes,6,opt,name=emergency,proto3" json:"emergency,omitempty"` - ParameterChange *Proposal_ParameterChange `protobuf:"bytes,7,opt,name=parameter_change,json=parameterChange,proto3" json:"parameter_change,omitempty"` - DaoSpend *Proposal_DaoSpend `protobuf:"bytes,8,opt,name=dao_spend,json=daoSpend,proto3" json:"dao_spend,omitempty"` - UpgradePlan *Proposal_UpgradePlan `protobuf:"bytes,9,opt,name=upgrade_plan,json=upgradePlan,proto3" json:"upgrade_plan,omitempty"` + Signaling *Proposal_Signaling `protobuf:"bytes,5,opt,name=signaling,proto3" json:"signaling,omitempty"` + Emergency *Proposal_Emergency `protobuf:"bytes,6,opt,name=emergency,proto3" json:"emergency,omitempty"` + ParameterChange *Proposal_ParameterChange `protobuf:"bytes,7,opt,name=parameter_change,json=parameterChange,proto3" json:"parameter_change,omitempty"` + CommunityPoolSpend *Proposal_CommunityPoolSpend `protobuf:"bytes,8,opt,name=community_pool_spend,json=communityPoolSpend,proto3" json:"community_pool_spend,omitempty"` + UpgradePlan *Proposal_UpgradePlan `protobuf:"bytes,9,opt,name=upgrade_plan,json=upgradePlan,proto3" json:"upgrade_plan,omitempty"` + FreezeIbcClient *Proposal_FreezeIbcClient `protobuf:"bytes,10,opt,name=freeze_ibc_client,json=freezeIbcClient,proto3" json:"freeze_ibc_client,omitempty"` + UnfreezeIbcClient *Proposal_UnfreezeIbcClient `protobuf:"bytes,11,opt,name=unfreeze_ibc_client,json=unfreezeIbcClient,proto3" json:"unfreeze_ibc_client,omitempty"` } func (x *Proposal) Reset() { @@ -1441,9 +1444,9 @@ func (x *Proposal) GetParameterChange() *Proposal_ParameterChange { return nil } -func (x *Proposal) GetDaoSpend() *Proposal_DaoSpend { +func (x *Proposal) GetCommunityPoolSpend() *Proposal_CommunityPoolSpend { if x != nil { - return x.DaoSpend + return x.CommunityPoolSpend } return nil } @@ -1455,6 +1458,20 @@ func (x *Proposal) GetUpgradePlan() *Proposal_UpgradePlan { return nil } +func (x *Proposal) GetFreezeIbcClient() *Proposal_FreezeIbcClient { + if x != nil { + return x.FreezeIbcClient + } + return nil +} + +func (x *Proposal) GetUnfreezeIbcClient() *Proposal_UnfreezeIbcClient { + if x != nil { + return x.UnfreezeIbcClient + } + return nil +} + type ProposalInfoRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1783,7 +1800,7 @@ type ProposalRateDataResponse struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - RateData *v1alpha15.RateData `protobuf:"bytes,1,opt,name=rate_data,json=rateData,proto3" json:"rate_data,omitempty"` + RateData *v1alpha16.RateData `protobuf:"bytes,1,opt,name=rate_data,json=rateData,proto3" json:"rate_data,omitempty"` } func (x *ProposalRateDataResponse) Reset() { @@ -1818,7 +1835,7 @@ func (*ProposalRateDataResponse) Descriptor() ([]byte, []int) { return file_penumbra_core_component_governance_v1alpha1_governance_proto_rawDescGZIP(), []int{24} } -func (x *ProposalRateDataResponse) GetRateData() *v1alpha15.RateData { +func (x *ProposalRateDataResponse) GetRateData() *v1alpha16.RateData { if x != nil { return x.RateData } @@ -2228,19 +2245,19 @@ type ChangedAppParameters struct { unknownFields protoimpl.UnknownFields // Chain module parameters. - ChainParams *v1alpha16.ChainParameters `protobuf:"bytes,1,opt,name=chain_params,json=chainParams,proto3" json:"chain_params,omitempty"` - // DAO module parameters. - DaoParams *v1alpha17.DaoParameters `protobuf:"bytes,2,opt,name=dao_params,json=daoParams,proto3" json:"dao_params,omitempty"` + ChainParams *v1alpha17.ChainParameters `protobuf:"bytes,1,opt,name=chain_params,json=chainParams,proto3" json:"chain_params,omitempty"` + // Community Pool module parameters. + CommunityPoolParams *v1alpha18.CommunityPoolParameters `protobuf:"bytes,2,opt,name=community_pool_params,json=communityPoolParams,proto3" json:"community_pool_params,omitempty"` // Governance module parameters. GovernanceParams *GovernanceParameters `protobuf:"bytes,3,opt,name=governance_params,json=governanceParams,proto3" json:"governance_params,omitempty"` // IBC module parameters. - IbcParams *v1alpha18.IbcParameters `protobuf:"bytes,4,opt,name=ibc_params,json=ibcParams,proto3" json:"ibc_params,omitempty"` + IbcParams *v1alpha19.IbcParameters `protobuf:"bytes,4,opt,name=ibc_params,json=ibcParams,proto3" json:"ibc_params,omitempty"` // Stake module parameters. - StakeParams *v1alpha15.StakeParameters `protobuf:"bytes,5,opt,name=stake_params,json=stakeParams,proto3" json:"stake_params,omitempty"` + StakeParams *v1alpha16.StakeParameters `protobuf:"bytes,5,opt,name=stake_params,json=stakeParams,proto3" json:"stake_params,omitempty"` // Fee module parameters. - FeeParams *v1alpha19.FeeParameters `protobuf:"bytes,6,opt,name=fee_params,json=feeParams,proto3" json:"fee_params,omitempty"` + FeeParams *v1alpha110.FeeParameters `protobuf:"bytes,6,opt,name=fee_params,json=feeParams,proto3" json:"fee_params,omitempty"` // Distributions module parameters. - DistributionsParams *v1alpha110.DistributionsParameters `protobuf:"bytes,7,opt,name=distributions_params,json=distributionsParams,proto3" json:"distributions_params,omitempty"` + DistributionsParams *v1alpha111.DistributionsParameters `protobuf:"bytes,7,opt,name=distributions_params,json=distributionsParams,proto3" json:"distributions_params,omitempty"` } func (x *ChangedAppParameters) Reset() { @@ -2275,16 +2292,16 @@ func (*ChangedAppParameters) Descriptor() ([]byte, []int) { return file_penumbra_core_component_governance_v1alpha1_governance_proto_rawDescGZIP(), []int{31} } -func (x *ChangedAppParameters) GetChainParams() *v1alpha16.ChainParameters { +func (x *ChangedAppParameters) GetChainParams() *v1alpha17.ChainParameters { if x != nil { return x.ChainParams } return nil } -func (x *ChangedAppParameters) GetDaoParams() *v1alpha17.DaoParameters { +func (x *ChangedAppParameters) GetCommunityPoolParams() *v1alpha18.CommunityPoolParameters { if x != nil { - return x.DaoParams + return x.CommunityPoolParams } return nil } @@ -2296,28 +2313,28 @@ func (x *ChangedAppParameters) GetGovernanceParams() *GovernanceParameters { return nil } -func (x *ChangedAppParameters) GetIbcParams() *v1alpha18.IbcParameters { +func (x *ChangedAppParameters) GetIbcParams() *v1alpha19.IbcParameters { if x != nil { return x.IbcParams } return nil } -func (x *ChangedAppParameters) GetStakeParams() *v1alpha15.StakeParameters { +func (x *ChangedAppParameters) GetStakeParams() *v1alpha16.StakeParameters { if x != nil { return x.StakeParams } return nil } -func (x *ChangedAppParameters) GetFeeParams() *v1alpha19.FeeParameters { +func (x *ChangedAppParameters) GetFeeParams() *v1alpha110.FeeParameters { if x != nil { return x.FeeParams } return nil } -func (x *ChangedAppParameters) GetDistributionsParams() *v1alpha110.DistributionsParameters { +func (x *ChangedAppParameters) GetDistributionsParams() *v1alpha111.DistributionsParameters { if x != nil { return x.DistributionsParams } @@ -2714,7 +2731,7 @@ type DelegatorVoteView_Visible struct { unknownFields protoimpl.UnknownFields DelegatorVote *DelegatorVote `protobuf:"bytes,1,opt,name=delegator_vote,json=delegatorVote,proto3" json:"delegator_vote,omitempty"` - Note *v1alpha14.NoteView `protobuf:"bytes,2,opt,name=note,proto3" json:"note,omitempty"` + Note *v1alpha15.NoteView `protobuf:"bytes,2,opt,name=note,proto3" json:"note,omitempty"` } func (x *DelegatorVoteView_Visible) Reset() { @@ -2756,7 +2773,7 @@ func (x *DelegatorVoteView_Visible) GetDelegatorVote() *DelegatorVote { return nil } -func (x *DelegatorVoteView_Visible) GetNote() *v1alpha14.NoteView { +func (x *DelegatorVoteView_Visible) GetNote() *v1alpha15.NoteView { if x != nil { return x.Note } @@ -3348,22 +3365,22 @@ func (x *Proposal_ParameterChange) GetNewParameters() *ChangedAppParameters { return nil } -// A DAO spend proposal describes zero or more transactions to execute on behalf of the DAO, with +// A Community Pool spend proposal describes zero or more transactions to execute on behalf of the Community Pool, with // access to its funds, and zero or more scheduled transactions from previous passed proposals to // cancel. -type Proposal_DaoSpend struct { +type Proposal_CommunityPoolSpend struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // The transaction plan to be executed at the time the proposal is passed. This must be a - // transaction plan which can be executed by the DAO, which means it can't require any witness - // data or authorization signatures, but it may use the `DaoSpend` action. + // transaction plan which can be executed by the Community Pool, which means it can't require any witness + // data or authorization signatures, but it may use the `CommunityPoolSpend` action. TransactionPlan *anypb.Any `protobuf:"bytes,2,opt,name=transaction_plan,json=transactionPlan,proto3" json:"transaction_plan,omitempty"` } -func (x *Proposal_DaoSpend) Reset() { - *x = Proposal_DaoSpend{} +func (x *Proposal_CommunityPoolSpend) Reset() { + *x = Proposal_CommunityPoolSpend{} if protoimpl.UnsafeEnabled { mi := &file_penumbra_core_component_governance_v1alpha1_governance_proto_msgTypes[52] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -3371,13 +3388,13 @@ func (x *Proposal_DaoSpend) Reset() { } } -func (x *Proposal_DaoSpend) String() string { +func (x *Proposal_CommunityPoolSpend) String() string { return protoimpl.X.MessageStringOf(x) } -func (*Proposal_DaoSpend) ProtoMessage() {} +func (*Proposal_CommunityPoolSpend) ProtoMessage() {} -func (x *Proposal_DaoSpend) ProtoReflect() protoreflect.Message { +func (x *Proposal_CommunityPoolSpend) ProtoReflect() protoreflect.Message { mi := &file_penumbra_core_component_governance_v1alpha1_governance_proto_msgTypes[52] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -3389,12 +3406,12 @@ func (x *Proposal_DaoSpend) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use Proposal_DaoSpend.ProtoReflect.Descriptor instead. -func (*Proposal_DaoSpend) Descriptor() ([]byte, []int) { +// Deprecated: Use Proposal_CommunityPoolSpend.ProtoReflect.Descriptor instead. +func (*Proposal_CommunityPoolSpend) Descriptor() ([]byte, []int) { return file_penumbra_core_component_governance_v1alpha1_governance_proto_rawDescGZIP(), []int{18, 3} } -func (x *Proposal_DaoSpend) GetTransactionPlan() *anypb.Any { +func (x *Proposal_CommunityPoolSpend) GetTransactionPlan() *anypb.Any { if x != nil { return x.TransactionPlan } @@ -3450,6 +3467,102 @@ func (x *Proposal_UpgradePlan) GetHeight() uint64 { return 0 } +// Freeze an existing IBC client. +type Proposal_FreezeIbcClient struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ClientId string `protobuf:"bytes,1,opt,name=client_id,json=clientId,proto3" json:"client_id,omitempty"` +} + +func (x *Proposal_FreezeIbcClient) Reset() { + *x = Proposal_FreezeIbcClient{} + if protoimpl.UnsafeEnabled { + mi := &file_penumbra_core_component_governance_v1alpha1_governance_proto_msgTypes[54] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Proposal_FreezeIbcClient) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Proposal_FreezeIbcClient) ProtoMessage() {} + +func (x *Proposal_FreezeIbcClient) ProtoReflect() protoreflect.Message { + mi := &file_penumbra_core_component_governance_v1alpha1_governance_proto_msgTypes[54] + 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 Proposal_FreezeIbcClient.ProtoReflect.Descriptor instead. +func (*Proposal_FreezeIbcClient) Descriptor() ([]byte, []int) { + return file_penumbra_core_component_governance_v1alpha1_governance_proto_rawDescGZIP(), []int{18, 5} +} + +func (x *Proposal_FreezeIbcClient) GetClientId() string { + if x != nil { + return x.ClientId + } + return "" +} + +// Unfreeze an existing IBC client. +type Proposal_UnfreezeIbcClient struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ClientId string `protobuf:"bytes,1,opt,name=client_id,json=clientId,proto3" json:"client_id,omitempty"` +} + +func (x *Proposal_UnfreezeIbcClient) Reset() { + *x = Proposal_UnfreezeIbcClient{} + if protoimpl.UnsafeEnabled { + mi := &file_penumbra_core_component_governance_v1alpha1_governance_proto_msgTypes[55] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Proposal_UnfreezeIbcClient) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Proposal_UnfreezeIbcClient) ProtoMessage() {} + +func (x *Proposal_UnfreezeIbcClient) ProtoReflect() protoreflect.Message { + mi := &file_penumbra_core_component_governance_v1alpha1_governance_proto_msgTypes[55] + 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 Proposal_UnfreezeIbcClient.ProtoReflect.Descriptor instead. +func (*Proposal_UnfreezeIbcClient) Descriptor() ([]byte, []int) { + return file_penumbra_core_component_governance_v1alpha1_governance_proto_rawDescGZIP(), []int{18, 6} +} + +func (x *Proposal_UnfreezeIbcClient) GetClientId() string { + if x != nil { + return x.ClientId + } + return "" +} + var File_penumbra_core_component_governance_v1alpha1_governance_proto protoreflect.FileDescriptor var file_penumbra_core_component_governance_v1alpha1_governance_proto_rawDesc = []byte{ @@ -3467,715 +3580,754 @@ var file_penumbra_core_component_governance_v1alpha1_governance_proto_rawDesc = 0x1a, 0x32, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2f, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2f, 0x63, - 0x6f, 0x72, 0x65, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2f, 0x64, 0x61, - 0x6f, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x64, 0x61, 0x6f, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x42, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2f, 0x63, - 0x6f, 0x72, 0x65, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2f, 0x64, 0x69, - 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x76, 0x31, 0x61, 0x6c, - 0x70, 0x68, 0x61, 0x31, 0x2f, 0x64, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, - 0x72, 0x61, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, - 0x74, 0x2f, 0x66, 0x65, 0x65, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x66, - 0x65, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, - 0x72, 0x61, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, - 0x74, 0x2f, 0x69, 0x62, 0x63, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x69, - 0x62, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x42, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, - 0x72, 0x61, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, - 0x74, 0x2f, 0x73, 0x68, 0x69, 0x65, 0x6c, 0x64, 0x65, 0x64, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x2f, - 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x73, 0x68, 0x69, 0x65, 0x6c, 0x64, 0x65, - 0x64, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x32, 0x70, 0x65, - 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x63, 0x6f, 0x6d, 0x70, - 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2f, 0x73, 0x74, 0x61, 0x6b, 0x65, 0x2f, 0x76, 0x31, 0x61, 0x6c, - 0x70, 0x68, 0x61, 0x31, 0x2f, 0x73, 0x74, 0x61, 0x6b, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x1a, 0x26, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, - 0x6b, 0x65, 0x79, 0x73, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x6b, 0x65, - 0x79, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x24, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, - 0x72, 0x61, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x6e, 0x75, 0x6d, 0x2f, 0x76, 0x31, 0x61, 0x6c, - 0x70, 0x68, 0x61, 0x31, 0x2f, 0x6e, 0x75, 0x6d, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x3a, - 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2f, 0x63, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x2f, - 0x64, 0x65, 0x63, 0x61, 0x66, 0x33, 0x37, 0x37, 0x5f, 0x72, 0x64, 0x73, 0x61, 0x2f, 0x76, 0x31, - 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x64, 0x65, 0x63, 0x61, 0x66, 0x33, 0x37, 0x37, 0x5f, - 0x72, 0x64, 0x73, 0x61, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x2c, 0x0a, 0x14, 0x5a, 0x4b, - 0x44, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x56, 0x6f, 0x74, 0x65, 0x50, 0x72, 0x6f, - 0x6f, 0x66, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0c, 0x52, 0x05, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x22, 0xae, 0x01, 0x0a, 0x0e, 0x50, 0x72, 0x6f, - 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x12, 0x51, 0x0a, 0x08, 0x70, - 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x35, 0x2e, - 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, - 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, - 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x70, - 0x6f, 0x73, 0x61, 0x6c, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x12, 0x49, - 0x0a, 0x0e, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x5f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, - 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6e, 0x75, 0x6d, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, - 0x68, 0x61, 0x31, 0x2e, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x0d, 0x64, 0x65, 0x70, 0x6f, - 0x73, 0x69, 0x74, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x46, 0x0a, 0x10, 0x50, 0x72, 0x6f, - 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x12, 0x1a, 0x0a, - 0x08, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, - 0x08, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x61, - 0x73, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, - 0x6e, 0x22, 0xd5, 0x01, 0x0a, 0x14, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x44, 0x65, - 0x70, 0x6f, 0x73, 0x69, 0x74, 0x43, 0x6c, 0x61, 0x69, 0x6d, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, - 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x70, 0x72, - 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x12, 0x49, 0x0a, 0x0e, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, - 0x74, 0x5f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, - 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6e, - 0x75, 0x6d, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x41, 0x6d, 0x6f, 0x75, - 0x6e, 0x74, 0x52, 0x0d, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x41, 0x6d, 0x6f, 0x75, 0x6e, - 0x74, 0x12, 0x56, 0x0a, 0x07, 0x6f, 0x75, 0x74, 0x63, 0x6f, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x3c, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, - 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x6f, 0x76, - 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, - 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x4f, 0x75, 0x74, 0x63, 0x6f, 0x6d, 0x65, - 0x52, 0x07, 0x6f, 0x75, 0x74, 0x63, 0x6f, 0x6d, 0x65, 0x22, 0xba, 0x01, 0x0a, 0x0d, 0x56, 0x61, - 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x56, 0x6f, 0x74, 0x65, 0x12, 0x52, 0x0a, 0x04, 0x62, - 0x6f, 0x64, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3e, 0x2e, 0x70, 0x65, 0x6e, 0x75, - 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, - 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x76, - 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, - 0x72, 0x56, 0x6f, 0x74, 0x65, 0x42, 0x6f, 0x64, 0x79, 0x52, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x12, - 0x55, 0x0a, 0x08, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x73, 0x69, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x3a, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x72, 0x79, - 0x70, 0x74, 0x6f, 0x2e, 0x64, 0x65, 0x63, 0x61, 0x66, 0x33, 0x37, 0x37, 0x5f, 0x72, 0x64, 0x73, - 0x61, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x70, 0x65, 0x6e, 0x64, - 0x41, 0x75, 0x74, 0x68, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x52, 0x07, 0x61, - 0x75, 0x74, 0x68, 0x53, 0x69, 0x67, 0x22, 0x2d, 0x0a, 0x13, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, - 0x74, 0x6f, 0x72, 0x56, 0x6f, 0x74, 0x65, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x12, 0x16, 0x0a, - 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, - 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x22, 0xf0, 0x02, 0x0a, 0x11, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, - 0x74, 0x6f, 0x72, 0x56, 0x6f, 0x74, 0x65, 0x42, 0x6f, 0x64, 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x70, - 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x70, - 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x12, 0x45, 0x0a, 0x04, 0x76, 0x6f, 0x74, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, - 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, - 0x67, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, - 0x68, 0x61, 0x31, 0x2e, 0x56, 0x6f, 0x74, 0x65, 0x52, 0x04, 0x76, 0x6f, 0x74, 0x65, 0x12, 0x4b, - 0x0a, 0x0c, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, - 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6b, 0x65, 0x79, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, - 0x61, 0x31, 0x2e, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x4b, 0x65, 0x79, 0x52, 0x0b, - 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x4b, 0x65, 0x79, 0x12, 0x51, 0x0a, 0x0e, 0x67, - 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, - 0x6f, 0x72, 0x65, 0x2e, 0x6b, 0x65, 0x79, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, - 0x31, 0x2e, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x4b, 0x65, 0x79, 0x52, - 0x0d, 0x67, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x4b, 0x65, 0x79, 0x12, 0x58, - 0x0a, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x40, - 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, - 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, - 0x6e, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x56, 0x61, 0x6c, - 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x56, 0x6f, 0x74, 0x65, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, - 0x52, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x22, 0x93, 0x02, 0x0a, 0x0d, 0x44, 0x65, 0x6c, - 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x56, 0x6f, 0x74, 0x65, 0x12, 0x52, 0x0a, 0x04, 0x62, 0x6f, - 0x64, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3e, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, + 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x44, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2f, 0x63, + 0x6f, 0x72, 0x65, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2f, 0x63, 0x6f, + 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x74, 0x79, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x2f, 0x76, 0x31, 0x61, + 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x74, 0x79, 0x5f, + 0x70, 0x6f, 0x6f, 0x6c, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x42, 0x70, 0x65, 0x6e, 0x75, + 0x6d, 0x62, 0x72, 0x61, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, + 0x65, 0x6e, 0x74, 0x2f, 0x64, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x64, 0x69, 0x73, 0x74, 0x72, + 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x2e, + 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x63, 0x6f, + 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2f, 0x66, 0x65, 0x65, 0x2f, 0x76, 0x31, 0x61, 0x6c, + 0x70, 0x68, 0x61, 0x31, 0x2f, 0x66, 0x65, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x2e, + 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x63, 0x6f, + 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2f, 0x69, 0x62, 0x63, 0x2f, 0x76, 0x31, 0x61, 0x6c, + 0x70, 0x68, 0x61, 0x31, 0x2f, 0x69, 0x62, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x2e, + 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x63, 0x6f, + 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2f, 0x73, 0x63, 0x74, 0x2f, 0x76, 0x31, 0x61, 0x6c, + 0x70, 0x68, 0x61, 0x31, 0x2f, 0x73, 0x63, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x42, + 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x63, 0x6f, + 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2f, 0x73, 0x68, 0x69, 0x65, 0x6c, 0x64, 0x65, 0x64, + 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x73, + 0x68, 0x69, 0x65, 0x6c, 0x64, 0x65, 0x64, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x1a, 0x32, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2f, 0x63, 0x6f, 0x72, + 0x65, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2f, 0x73, 0x74, 0x61, 0x6b, + 0x65, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x73, 0x74, 0x61, 0x6b, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x26, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, + 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x6b, 0x65, 0x79, 0x73, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, + 0x68, 0x61, 0x31, 0x2f, 0x6b, 0x65, 0x79, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x24, + 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x6e, 0x75, + 0x6d, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x6e, 0x75, 0x6d, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x3a, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2f, 0x63, + 0x72, 0x79, 0x70, 0x74, 0x6f, 0x2f, 0x64, 0x65, 0x63, 0x61, 0x66, 0x33, 0x37, 0x37, 0x5f, 0x72, + 0x64, 0x73, 0x61, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x64, 0x65, 0x63, + 0x61, 0x66, 0x33, 0x37, 0x37, 0x5f, 0x72, 0x64, 0x73, 0x61, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x22, 0x2c, 0x0a, 0x14, 0x5a, 0x4b, 0x44, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x56, + 0x6f, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x6e, 0x65, + 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x22, 0xae, + 0x01, 0x0a, 0x0e, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x53, 0x75, 0x62, 0x6d, 0x69, + 0x74, 0x12, 0x51, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, + 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x6f, + 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, + 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x70, + 0x6f, 0x73, 0x61, 0x6c, 0x12, 0x49, 0x0a, 0x0e, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x5f, + 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x70, + 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6e, 0x75, 0x6d, + 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, + 0x52, 0x0d, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x22, + 0x46, 0x0a, 0x10, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x57, 0x69, 0x74, 0x68, 0x64, + 0x72, 0x61, 0x77, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x12, + 0x16, 0x0a, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x22, 0xd5, 0x01, 0x0a, 0x14, 0x50, 0x72, 0x6f, 0x70, + 0x6f, 0x73, 0x61, 0x6c, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x43, 0x6c, 0x61, 0x69, 0x6d, + 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x04, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x12, 0x49, 0x0a, 0x0e, + 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x5f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, + 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6e, 0x75, 0x6d, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, + 0x31, 0x2e, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x0d, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, + 0x74, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x56, 0x0a, 0x07, 0x6f, 0x75, 0x74, 0x63, 0x6f, + 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3c, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x76, 0x31, - 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, - 0x56, 0x6f, 0x74, 0x65, 0x42, 0x6f, 0x64, 0x79, 0x52, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x12, 0x55, - 0x0a, 0x08, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x73, 0x69, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x3a, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x72, 0x79, 0x70, - 0x74, 0x6f, 0x2e, 0x64, 0x65, 0x63, 0x61, 0x66, 0x33, 0x37, 0x37, 0x5f, 0x72, 0x64, 0x73, 0x61, - 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x70, 0x65, 0x6e, 0x64, 0x41, - 0x75, 0x74, 0x68, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x52, 0x07, 0x61, 0x75, - 0x74, 0x68, 0x53, 0x69, 0x67, 0x12, 0x57, 0x0a, 0x05, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x41, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, - 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x67, - 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, - 0x61, 0x31, 0x2e, 0x5a, 0x4b, 0x44, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x56, 0x6f, - 0x74, 0x65, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x05, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x22, 0xd3, - 0x02, 0x0a, 0x11, 0x44, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x56, 0x6f, 0x74, 0x65, - 0x42, 0x6f, 0x64, 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, - 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, - 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x73, 0x74, 0x61, 0x72, 0x74, 0x50, - 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x45, 0x0a, 0x04, 0x76, 0x6f, 0x74, 0x65, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, - 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, - 0x67, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, - 0x68, 0x61, 0x31, 0x2e, 0x56, 0x6f, 0x74, 0x65, 0x52, 0x04, 0x76, 0x6f, 0x74, 0x65, 0x12, 0x39, - 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, - 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x73, - 0x73, 0x65, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x56, 0x61, 0x6c, - 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x4b, 0x0a, 0x0f, 0x75, 0x6e, 0x62, - 0x6f, 0x6e, 0x64, 0x65, 0x64, 0x5f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, - 0x72, 0x65, 0x2e, 0x6e, 0x75, 0x6d, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, - 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x0e, 0x75, 0x6e, 0x62, 0x6f, 0x6e, 0x64, 0x65, 0x64, - 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x75, 0x6c, 0x6c, 0x69, 0x66, - 0x69, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x6e, 0x75, 0x6c, 0x6c, 0x69, - 0x66, 0x69, 0x65, 0x72, 0x12, 0x0e, 0x0a, 0x02, 0x72, 0x6b, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0c, - 0x52, 0x02, 0x72, 0x6b, 0x22, 0x94, 0x04, 0x0a, 0x11, 0x44, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, - 0x6f, 0x72, 0x56, 0x6f, 0x74, 0x65, 0x56, 0x69, 0x65, 0x77, 0x12, 0x62, 0x0a, 0x07, 0x76, 0x69, - 0x73, 0x69, 0x62, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x46, 0x2e, 0x70, 0x65, + 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x4f, + 0x75, 0x74, 0x63, 0x6f, 0x6d, 0x65, 0x52, 0x07, 0x6f, 0x75, 0x74, 0x63, 0x6f, 0x6d, 0x65, 0x22, + 0xba, 0x01, 0x0a, 0x0d, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x56, 0x6f, 0x74, + 0x65, 0x12, 0x52, 0x0a, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x3e, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, + 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x6f, 0x76, 0x65, 0x72, 0x6e, + 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x56, 0x61, + 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x56, 0x6f, 0x74, 0x65, 0x42, 0x6f, 0x64, 0x79, 0x52, + 0x04, 0x62, 0x6f, 0x64, 0x79, 0x12, 0x55, 0x0a, 0x08, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x73, 0x69, + 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, + 0x72, 0x61, 0x2e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x2e, 0x64, 0x65, 0x63, 0x61, 0x66, 0x33, + 0x37, 0x37, 0x5f, 0x72, 0x64, 0x73, 0x61, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, + 0x2e, 0x53, 0x70, 0x65, 0x6e, 0x64, 0x41, 0x75, 0x74, 0x68, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, + 0x75, 0x72, 0x65, 0x52, 0x07, 0x61, 0x75, 0x74, 0x68, 0x53, 0x69, 0x67, 0x22, 0x2d, 0x0a, 0x13, + 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x56, 0x6f, 0x74, 0x65, 0x52, 0x65, 0x61, + 0x73, 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x22, 0xf0, 0x02, 0x0a, 0x11, + 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x56, 0x6f, 0x74, 0x65, 0x42, 0x6f, 0x64, + 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x04, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x12, 0x45, 0x0a, + 0x04, 0x76, 0x6f, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, - 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x67, 0x61, - 0x74, 0x6f, 0x72, 0x56, 0x6f, 0x74, 0x65, 0x56, 0x69, 0x65, 0x77, 0x2e, 0x56, 0x69, 0x73, 0x69, - 0x62, 0x6c, 0x65, 0x48, 0x00, 0x52, 0x07, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x12, 0x5f, - 0x0a, 0x06, 0x6f, 0x70, 0x61, 0x71, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x45, + 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x56, 0x6f, 0x74, 0x65, 0x52, 0x04, + 0x76, 0x6f, 0x74, 0x65, 0x12, 0x4b, 0x0a, 0x0c, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, + 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x70, 0x65, 0x6e, + 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6b, 0x65, 0x79, 0x73, 0x2e, + 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, + 0x79, 0x4b, 0x65, 0x79, 0x52, 0x0b, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x4b, 0x65, + 0x79, 0x12, 0x51, 0x0a, 0x0e, 0x67, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x5f, + 0x6b, 0x65, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x70, 0x65, 0x6e, 0x75, + 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6b, 0x65, 0x79, 0x73, 0x2e, 0x76, + 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, + 0x63, 0x65, 0x4b, 0x65, 0x79, 0x52, 0x0d, 0x67, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, + 0x65, 0x4b, 0x65, 0x79, 0x12, 0x58, 0x0a, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x40, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, + 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x67, + 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, + 0x61, 0x31, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x56, 0x6f, 0x74, 0x65, + 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x52, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x22, 0x93, + 0x02, 0x0a, 0x0d, 0x44, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x56, 0x6f, 0x74, 0x65, + 0x12, 0x52, 0x0a, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3e, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, 0x65, 0x6c, - 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x56, 0x6f, 0x74, 0x65, 0x56, 0x69, 0x65, 0x77, 0x2e, 0x4f, - 0x70, 0x61, 0x71, 0x75, 0x65, 0x48, 0x00, 0x52, 0x06, 0x6f, 0x70, 0x61, 0x71, 0x75, 0x65, 0x1a, - 0xba, 0x01, 0x0a, 0x07, 0x56, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x12, 0x61, 0x0a, 0x0e, 0x64, + 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x56, 0x6f, 0x74, 0x65, 0x42, 0x6f, 0x64, 0x79, 0x52, 0x04, + 0x62, 0x6f, 0x64, 0x79, 0x12, 0x55, 0x0a, 0x08, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x73, 0x69, 0x67, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, + 0x61, 0x2e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x2e, 0x64, 0x65, 0x63, 0x61, 0x66, 0x33, 0x37, + 0x37, 0x5f, 0x72, 0x64, 0x73, 0x61, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, + 0x53, 0x70, 0x65, 0x6e, 0x64, 0x41, 0x75, 0x74, 0x68, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, + 0x72, 0x65, 0x52, 0x07, 0x61, 0x75, 0x74, 0x68, 0x53, 0x69, 0x67, 0x12, 0x57, 0x0a, 0x05, 0x70, + 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x41, 0x2e, 0x70, 0x65, 0x6e, + 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, + 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x2e, + 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x5a, 0x4b, 0x44, 0x65, 0x6c, 0x65, 0x67, + 0x61, 0x74, 0x6f, 0x72, 0x56, 0x6f, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x05, 0x70, + 0x72, 0x6f, 0x6f, 0x66, 0x22, 0xc2, 0x03, 0x0a, 0x11, 0x44, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, + 0x6f, 0x72, 0x56, 0x6f, 0x74, 0x65, 0x42, 0x6f, 0x64, 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, + 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x70, 0x72, + 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, + 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, + 0x73, 0x74, 0x61, 0x72, 0x74, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x45, 0x0a, + 0x04, 0x76, 0x6f, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x70, 0x65, + 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, + 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, + 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x56, 0x6f, 0x74, 0x65, 0x52, 0x04, + 0x76, 0x6f, 0x74, 0x65, 0x12, 0x39, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, + 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, + 0x61, 0x31, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, + 0x4b, 0x0a, 0x0f, 0x75, 0x6e, 0x62, 0x6f, 0x6e, 0x64, 0x65, 0x64, 0x5f, 0x61, 0x6d, 0x6f, 0x75, + 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, + 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6e, 0x75, 0x6d, 0x2e, 0x76, 0x31, 0x61, + 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x0e, 0x75, 0x6e, + 0x62, 0x6f, 0x6e, 0x64, 0x65, 0x64, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x4d, 0x0a, 0x09, + 0x6e, 0x75, 0x6c, 0x6c, 0x69, 0x66, 0x69, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x2f, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, + 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x63, 0x74, 0x2e, 0x76, 0x31, + 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x69, 0x66, 0x69, 0x65, 0x72, + 0x52, 0x09, 0x6e, 0x75, 0x6c, 0x6c, 0x69, 0x66, 0x69, 0x65, 0x72, 0x12, 0x4c, 0x0a, 0x02, 0x72, + 0x6b, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3c, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, + 0x72, 0x61, 0x2e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x2e, 0x64, 0x65, 0x63, 0x61, 0x66, 0x33, + 0x37, 0x37, 0x5f, 0x72, 0x64, 0x73, 0x61, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, + 0x2e, 0x53, 0x70, 0x65, 0x6e, 0x64, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x4b, 0x65, 0x79, 0x52, 0x02, 0x72, 0x6b, 0x22, 0x94, 0x04, 0x0a, 0x11, 0x44, 0x65, + 0x6c, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x56, 0x6f, 0x74, 0x65, 0x56, 0x69, 0x65, 0x77, 0x12, + 0x62, 0x0a, 0x07, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x46, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, + 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x6f, 0x76, 0x65, 0x72, + 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, + 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x56, 0x6f, 0x74, 0x65, 0x56, 0x69, 0x65, 0x77, + 0x2e, 0x56, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x48, 0x00, 0x52, 0x07, 0x76, 0x69, 0x73, 0x69, + 0x62, 0x6c, 0x65, 0x12, 0x5f, 0x0a, 0x06, 0x6f, 0x70, 0x61, 0x71, 0x75, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x45, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, + 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x6f, + 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, + 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x56, 0x6f, 0x74, 0x65, 0x56, + 0x69, 0x65, 0x77, 0x2e, 0x4f, 0x70, 0x61, 0x71, 0x75, 0x65, 0x48, 0x00, 0x52, 0x06, 0x6f, 0x70, + 0x61, 0x71, 0x75, 0x65, 0x1a, 0xba, 0x01, 0x0a, 0x07, 0x56, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, + 0x12, 0x61, 0x0a, 0x0e, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x76, 0x6f, + 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, + 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, + 0x6e, 0x74, 0x2e, 0x67, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x76, 0x31, + 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, + 0x56, 0x6f, 0x74, 0x65, 0x52, 0x0d, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x56, + 0x6f, 0x74, 0x65, 0x12, 0x4c, 0x0a, 0x04, 0x6e, 0x6f, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x38, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, + 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x68, 0x69, 0x65, + 0x6c, 0x64, 0x65, 0x64, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, + 0x61, 0x31, 0x2e, 0x4e, 0x6f, 0x74, 0x65, 0x56, 0x69, 0x65, 0x77, 0x52, 0x04, 0x6e, 0x6f, 0x74, + 0x65, 0x1a, 0x6b, 0x0a, 0x06, 0x4f, 0x70, 0x61, 0x71, 0x75, 0x65, 0x12, 0x61, 0x0a, 0x0e, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x76, 0x6f, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x56, 0x6f, 0x74, 0x65, 0x52, - 0x0d, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x56, 0x6f, 0x74, 0x65, 0x12, 0x4c, - 0x0a, 0x04, 0x6e, 0x6f, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x70, - 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, - 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x68, 0x69, 0x65, 0x6c, 0x64, 0x65, 0x64, 0x5f, - 0x70, 0x6f, 0x6f, 0x6c, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4e, 0x6f, - 0x74, 0x65, 0x56, 0x69, 0x65, 0x77, 0x52, 0x04, 0x6e, 0x6f, 0x74, 0x65, 0x1a, 0x6b, 0x0a, 0x06, - 0x4f, 0x70, 0x61, 0x71, 0x75, 0x65, 0x12, 0x61, 0x0a, 0x0e, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, - 0x74, 0x6f, 0x72, 0x5f, 0x76, 0x6f, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3a, - 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, - 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, - 0x6e, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, 0x65, 0x6c, - 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x56, 0x6f, 0x74, 0x65, 0x52, 0x0d, 0x64, 0x65, 0x6c, 0x65, - 0x67, 0x61, 0x74, 0x6f, 0x72, 0x56, 0x6f, 0x74, 0x65, 0x42, 0x10, 0x0a, 0x0e, 0x64, 0x65, 0x6c, - 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x76, 0x6f, 0x74, 0x65, 0x22, 0xe7, 0x03, 0x0a, 0x11, - 0x44, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x56, 0x6f, 0x74, 0x65, 0x50, 0x6c, 0x61, - 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x04, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x12, 0x25, 0x0a, - 0x0e, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x73, 0x74, 0x61, 0x72, 0x74, 0x50, 0x6f, 0x73, 0x69, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x45, 0x0a, 0x04, 0x76, 0x6f, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, - 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x6f, 0x76, - 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, - 0x2e, 0x56, 0x6f, 0x74, 0x65, 0x52, 0x04, 0x76, 0x6f, 0x74, 0x65, 0x12, 0x55, 0x0a, 0x0b, 0x73, - 0x74, 0x61, 0x6b, 0x65, 0x64, 0x5f, 0x6e, 0x6f, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x34, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, - 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x68, 0x69, 0x65, 0x6c, - 0x64, 0x65, 0x64, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, - 0x31, 0x2e, 0x4e, 0x6f, 0x74, 0x65, 0x52, 0x0a, 0x73, 0x74, 0x61, 0x6b, 0x65, 0x64, 0x4e, 0x6f, - 0x74, 0x65, 0x12, 0x30, 0x0a, 0x14, 0x73, 0x74, 0x61, 0x6b, 0x65, 0x64, 0x5f, 0x6e, 0x6f, 0x74, - 0x65, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, - 0x52, 0x12, 0x73, 0x74, 0x61, 0x6b, 0x65, 0x64, 0x4e, 0x6f, 0x74, 0x65, 0x50, 0x6f, 0x73, 0x69, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x4b, 0x0a, 0x0f, 0x75, 0x6e, 0x62, 0x6f, 0x6e, 0x64, 0x65, 0x64, - 0x5f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, - 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6e, 0x75, - 0x6d, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x41, 0x6d, 0x6f, 0x75, 0x6e, - 0x74, 0x52, 0x0e, 0x75, 0x6e, 0x62, 0x6f, 0x6e, 0x64, 0x65, 0x64, 0x41, 0x6d, 0x6f, 0x75, 0x6e, - 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x72, 0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x69, 0x7a, 0x65, 0x72, 0x18, - 0x07, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0a, 0x72, 0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x69, 0x7a, 0x65, - 0x72, 0x12, 0x28, 0x0a, 0x10, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x5f, 0x62, 0x6c, 0x69, 0x6e, 0x64, - 0x69, 0x6e, 0x67, 0x5f, 0x72, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0e, 0x70, 0x72, 0x6f, - 0x6f, 0x66, 0x42, 0x6c, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x12, 0x28, 0x0a, 0x10, 0x70, - 0x72, 0x6f, 0x6f, 0x66, 0x5f, 0x62, 0x6c, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x73, 0x18, - 0x09, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0e, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x42, 0x6c, 0x69, 0x6e, - 0x64, 0x69, 0x6e, 0x67, 0x53, 0x22, 0x47, 0x0a, 0x0a, 0x44, 0x61, 0x6f, 0x44, 0x65, 0x70, 0x6f, - 0x73, 0x69, 0x74, 0x12, 0x39, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, - 0x72, 0x65, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, - 0x31, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x45, - 0x0a, 0x08, 0x44, 0x61, 0x6f, 0x53, 0x70, 0x65, 0x6e, 0x64, 0x12, 0x39, 0x0a, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x70, 0x65, 0x6e, 0x75, - 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x74, 0x2e, - 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x86, 0x01, 0x0a, 0x09, 0x44, 0x61, 0x6f, 0x4f, 0x75, 0x74, - 0x70, 0x75, 0x74, 0x12, 0x39, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, - 0x72, 0x65, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, - 0x31, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x3e, - 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x24, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, - 0x6b, 0x65, 0x79, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x41, 0x64, - 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x22, 0x9d, - 0x01, 0x0a, 0x04, 0x56, 0x6f, 0x74, 0x65, 0x12, 0x4a, 0x0a, 0x04, 0x76, 0x6f, 0x74, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x36, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, - 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, - 0x67, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, - 0x68, 0x61, 0x31, 0x2e, 0x56, 0x6f, 0x74, 0x65, 0x2e, 0x56, 0x6f, 0x74, 0x65, 0x52, 0x04, 0x76, - 0x6f, 0x74, 0x65, 0x22, 0x49, 0x0a, 0x04, 0x56, 0x6f, 0x74, 0x65, 0x12, 0x14, 0x0a, 0x10, 0x56, - 0x4f, 0x54, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, - 0x00, 0x12, 0x10, 0x0a, 0x0c, 0x56, 0x4f, 0x54, 0x45, 0x5f, 0x41, 0x42, 0x53, 0x54, 0x41, 0x49, - 0x4e, 0x10, 0x01, 0x12, 0x0c, 0x0a, 0x08, 0x56, 0x4f, 0x54, 0x45, 0x5f, 0x59, 0x45, 0x53, 0x10, - 0x02, 0x12, 0x0b, 0x0a, 0x07, 0x56, 0x4f, 0x54, 0x45, 0x5f, 0x4e, 0x4f, 0x10, 0x03, 0x22, 0x94, - 0x05, 0x0a, 0x0d, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x65, - 0x12, 0x5b, 0x0a, 0x06, 0x76, 0x6f, 0x74, 0x69, 0x6e, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x41, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, - 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x6f, 0x76, 0x65, 0x72, - 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, - 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x56, 0x6f, 0x74, - 0x69, 0x6e, 0x67, 0x48, 0x00, 0x52, 0x06, 0x76, 0x6f, 0x74, 0x69, 0x6e, 0x67, 0x12, 0x64, 0x0a, - 0x09, 0x77, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x44, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, - 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x6f, 0x76, 0x65, 0x72, - 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, - 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x57, 0x69, 0x74, - 0x68, 0x64, 0x72, 0x61, 0x77, 0x6e, 0x48, 0x00, 0x52, 0x09, 0x77, 0x69, 0x74, 0x68, 0x64, 0x72, - 0x61, 0x77, 0x6e, 0x12, 0x61, 0x0a, 0x08, 0x66, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x65, 0x64, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x43, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, - 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, - 0x67, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, - 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x53, 0x74, 0x61, 0x74, - 0x65, 0x2e, 0x46, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x65, 0x64, 0x48, 0x00, 0x52, 0x08, 0x66, 0x69, - 0x6e, 0x69, 0x73, 0x68, 0x65, 0x64, 0x12, 0x5e, 0x0a, 0x07, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x65, - 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x42, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, + 0x0d, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x56, 0x6f, 0x74, 0x65, 0x42, 0x10, + 0x0a, 0x0e, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x76, 0x6f, 0x74, 0x65, + 0x22, 0xe7, 0x03, 0x0a, 0x11, 0x44, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x56, 0x6f, + 0x74, 0x65, 0x50, 0x6c, 0x61, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, + 0x61, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, + 0x61, 0x6c, 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x70, 0x6f, 0x73, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x73, 0x74, 0x61, 0x72, + 0x74, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x45, 0x0a, 0x04, 0x76, 0x6f, 0x74, + 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, - 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x53, 0x74, - 0x61, 0x74, 0x65, 0x2e, 0x43, 0x6c, 0x61, 0x69, 0x6d, 0x65, 0x64, 0x48, 0x00, 0x52, 0x07, 0x63, - 0x6c, 0x61, 0x69, 0x6d, 0x65, 0x64, 0x1a, 0x08, 0x0a, 0x06, 0x56, 0x6f, 0x74, 0x69, 0x6e, 0x67, - 0x1a, 0x23, 0x0a, 0x09, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x6e, 0x12, 0x16, 0x0a, - 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, - 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x1a, 0x62, 0x0a, 0x08, 0x46, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x65, - 0x64, 0x12, 0x56, 0x0a, 0x07, 0x6f, 0x75, 0x74, 0x63, 0x6f, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x3c, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, - 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x6f, 0x76, - 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, - 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x4f, 0x75, 0x74, 0x63, 0x6f, 0x6d, 0x65, - 0x52, 0x07, 0x6f, 0x75, 0x74, 0x63, 0x6f, 0x6d, 0x65, 0x1a, 0x61, 0x0a, 0x07, 0x43, 0x6c, 0x61, - 0x69, 0x6d, 0x65, 0x64, 0x12, 0x56, 0x0a, 0x07, 0x6f, 0x75, 0x74, 0x63, 0x6f, 0x6d, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3c, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, + 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x56, 0x6f, 0x74, 0x65, 0x52, 0x04, 0x76, 0x6f, 0x74, 0x65, + 0x12, 0x55, 0x0a, 0x0b, 0x73, 0x74, 0x61, 0x6b, 0x65, 0x64, 0x5f, 0x6e, 0x6f, 0x74, 0x65, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, - 0x67, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, - 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x4f, 0x75, 0x74, 0x63, - 0x6f, 0x6d, 0x65, 0x52, 0x07, 0x6f, 0x75, 0x74, 0x63, 0x6f, 0x6d, 0x65, 0x42, 0x07, 0x0a, 0x05, - 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, 0xcc, 0x04, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, - 0x61, 0x6c, 0x4f, 0x75, 0x74, 0x63, 0x6f, 0x6d, 0x65, 0x12, 0x5d, 0x0a, 0x06, 0x70, 0x61, 0x73, - 0x73, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x43, 0x2e, 0x70, 0x65, 0x6e, 0x75, - 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, - 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x76, - 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, - 0x4f, 0x75, 0x74, 0x63, 0x6f, 0x6d, 0x65, 0x2e, 0x50, 0x61, 0x73, 0x73, 0x65, 0x64, 0x48, 0x00, - 0x52, 0x06, 0x70, 0x61, 0x73, 0x73, 0x65, 0x64, 0x12, 0x5d, 0x0a, 0x06, 0x66, 0x61, 0x69, 0x6c, - 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x43, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, + 0x73, 0x68, 0x69, 0x65, 0x6c, 0x64, 0x65, 0x64, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x2e, 0x76, 0x31, + 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4e, 0x6f, 0x74, 0x65, 0x52, 0x0a, 0x73, 0x74, 0x61, + 0x6b, 0x65, 0x64, 0x4e, 0x6f, 0x74, 0x65, 0x12, 0x30, 0x0a, 0x14, 0x73, 0x74, 0x61, 0x6b, 0x65, + 0x64, 0x5f, 0x6e, 0x6f, 0x74, 0x65, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x12, 0x73, 0x74, 0x61, 0x6b, 0x65, 0x64, 0x4e, 0x6f, 0x74, + 0x65, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x4b, 0x0a, 0x0f, 0x75, 0x6e, 0x62, + 0x6f, 0x6e, 0x64, 0x65, 0x64, 0x5f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, + 0x72, 0x65, 0x2e, 0x6e, 0x75, 0x6d, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, + 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x0e, 0x75, 0x6e, 0x62, 0x6f, 0x6e, 0x64, 0x65, 0x64, + 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x72, 0x61, 0x6e, 0x64, 0x6f, 0x6d, + 0x69, 0x7a, 0x65, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0a, 0x72, 0x61, 0x6e, 0x64, + 0x6f, 0x6d, 0x69, 0x7a, 0x65, 0x72, 0x12, 0x28, 0x0a, 0x10, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x5f, + 0x62, 0x6c, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x72, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0c, + 0x52, 0x0e, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x42, 0x6c, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x52, + 0x12, 0x28, 0x0a, 0x10, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x5f, 0x62, 0x6c, 0x69, 0x6e, 0x64, 0x69, + 0x6e, 0x67, 0x5f, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0e, 0x70, 0x72, 0x6f, 0x6f, + 0x66, 0x42, 0x6c, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x53, 0x22, 0x51, 0x0a, 0x14, 0x43, 0x6f, + 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x74, 0x79, 0x50, 0x6f, 0x6f, 0x6c, 0x44, 0x65, 0x70, 0x6f, 0x73, + 0x69, 0x74, 0x12, 0x39, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x23, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, + 0x65, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, + 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x4f, 0x0a, + 0x12, 0x43, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x74, 0x79, 0x50, 0x6f, 0x6f, 0x6c, 0x53, 0x70, + 0x65, 0x6e, 0x64, 0x12, 0x39, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, + 0x72, 0x65, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, + 0x31, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x90, + 0x01, 0x0a, 0x13, 0x43, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x74, 0x79, 0x50, 0x6f, 0x6f, 0x6c, + 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x39, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, + 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, + 0x70, 0x68, 0x61, 0x31, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x12, 0x3e, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, + 0x72, 0x65, 0x2e, 0x6b, 0x65, 0x79, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, + 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, + 0x73, 0x22, 0x9d, 0x01, 0x0a, 0x04, 0x56, 0x6f, 0x74, 0x65, 0x12, 0x4a, 0x0a, 0x04, 0x76, 0x6f, + 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x36, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x76, 0x31, - 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x4f, - 0x75, 0x74, 0x63, 0x6f, 0x6d, 0x65, 0x2e, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x48, 0x00, 0x52, - 0x06, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x12, 0x60, 0x0a, 0x07, 0x73, 0x6c, 0x61, 0x73, 0x68, - 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x44, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, + 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x56, 0x6f, 0x74, 0x65, 0x2e, 0x56, 0x6f, 0x74, 0x65, + 0x52, 0x04, 0x76, 0x6f, 0x74, 0x65, 0x22, 0x49, 0x0a, 0x04, 0x56, 0x6f, 0x74, 0x65, 0x12, 0x14, + 0x0a, 0x10, 0x56, 0x4f, 0x54, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, + 0x45, 0x44, 0x10, 0x00, 0x12, 0x10, 0x0a, 0x0c, 0x56, 0x4f, 0x54, 0x45, 0x5f, 0x41, 0x42, 0x53, + 0x54, 0x41, 0x49, 0x4e, 0x10, 0x01, 0x12, 0x0c, 0x0a, 0x08, 0x56, 0x4f, 0x54, 0x45, 0x5f, 0x59, + 0x45, 0x53, 0x10, 0x02, 0x12, 0x0b, 0x0a, 0x07, 0x56, 0x4f, 0x54, 0x45, 0x5f, 0x4e, 0x4f, 0x10, + 0x03, 0x22, 0x94, 0x05, 0x0a, 0x0d, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x53, 0x74, + 0x61, 0x74, 0x65, 0x12, 0x5b, 0x0a, 0x06, 0x76, 0x6f, 0x74, 0x69, 0x6e, 0x67, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x41, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, + 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x6f, + 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, + 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x65, 0x2e, + 0x56, 0x6f, 0x74, 0x69, 0x6e, 0x67, 0x48, 0x00, 0x52, 0x06, 0x76, 0x6f, 0x74, 0x69, 0x6e, 0x67, + 0x12, 0x64, 0x0a, 0x09, 0x77, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x6e, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x44, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, + 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x6f, + 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, + 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x65, 0x2e, + 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x6e, 0x48, 0x00, 0x52, 0x09, 0x77, 0x69, 0x74, + 0x68, 0x64, 0x72, 0x61, 0x77, 0x6e, 0x12, 0x61, 0x0a, 0x08, 0x66, 0x69, 0x6e, 0x69, 0x73, 0x68, + 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x43, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x76, 0x31, - 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x4f, - 0x75, 0x74, 0x63, 0x6f, 0x6d, 0x65, 0x2e, 0x53, 0x6c, 0x61, 0x73, 0x68, 0x65, 0x64, 0x48, 0x00, - 0x52, 0x07, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x65, 0x64, 0x1a, 0x23, 0x0a, 0x09, 0x57, 0x69, 0x74, - 0x68, 0x64, 0x72, 0x61, 0x77, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x1a, 0x08, - 0x0a, 0x06, 0x50, 0x61, 0x73, 0x73, 0x65, 0x64, 0x1a, 0x6e, 0x0a, 0x06, 0x46, 0x61, 0x69, 0x6c, - 0x65, 0x64, 0x12, 0x64, 0x0a, 0x09, 0x77, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x6e, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x46, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, + 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x53, + 0x74, 0x61, 0x74, 0x65, 0x2e, 0x46, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x65, 0x64, 0x48, 0x00, 0x52, + 0x08, 0x66, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x65, 0x64, 0x12, 0x5e, 0x0a, 0x07, 0x63, 0x6c, 0x61, + 0x69, 0x6d, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x42, 0x2e, 0x70, 0x65, 0x6e, + 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, + 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x2e, + 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, + 0x6c, 0x53, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x43, 0x6c, 0x61, 0x69, 0x6d, 0x65, 0x64, 0x48, 0x00, + 0x52, 0x07, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x65, 0x64, 0x1a, 0x08, 0x0a, 0x06, 0x56, 0x6f, 0x74, + 0x69, 0x6e, 0x67, 0x1a, 0x23, 0x0a, 0x09, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x6e, + 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x1a, 0x62, 0x0a, 0x08, 0x46, 0x69, 0x6e, 0x69, + 0x73, 0x68, 0x65, 0x64, 0x12, 0x56, 0x0a, 0x07, 0x6f, 0x75, 0x74, 0x63, 0x6f, 0x6d, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3c, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x4f, 0x75, 0x74, 0x63, - 0x6f, 0x6d, 0x65, 0x2e, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x6e, 0x52, 0x09, 0x77, - 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x6e, 0x1a, 0x6f, 0x0a, 0x07, 0x53, 0x6c, 0x61, 0x73, - 0x68, 0x65, 0x64, 0x12, 0x64, 0x0a, 0x09, 0x77, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x6e, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x46, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, - 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, - 0x2e, 0x67, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, - 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x4f, 0x75, 0x74, - 0x63, 0x6f, 0x6d, 0x65, 0x2e, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x6e, 0x52, 0x09, - 0x77, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x6e, 0x42, 0x09, 0x0a, 0x07, 0x6f, 0x75, 0x74, - 0x63, 0x6f, 0x6d, 0x65, 0x22, 0x43, 0x0a, 0x05, 0x54, 0x61, 0x6c, 0x6c, 0x79, 0x12, 0x10, 0x0a, - 0x03, 0x79, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x03, 0x79, 0x65, 0x73, 0x12, - 0x0e, 0x0a, 0x02, 0x6e, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, 0x6e, 0x6f, 0x12, - 0x18, 0x0a, 0x07, 0x61, 0x62, 0x73, 0x74, 0x61, 0x69, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, - 0x52, 0x07, 0x61, 0x62, 0x73, 0x74, 0x61, 0x69, 0x6e, 0x22, 0xf2, 0x07, 0x0a, 0x08, 0x50, 0x72, - 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x04, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x12, 0x20, 0x0a, 0x0b, - 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x5d, - 0x0a, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x3f, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, - 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x6f, 0x76, 0x65, - 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, - 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x69, - 0x6e, 0x67, 0x52, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x12, 0x5d, 0x0a, - 0x09, 0x65, 0x6d, 0x65, 0x72, 0x67, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x3f, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, - 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x6f, 0x76, 0x65, 0x72, - 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, - 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x2e, 0x45, 0x6d, 0x65, 0x72, 0x67, 0x65, 0x6e, 0x63, - 0x79, 0x52, 0x09, 0x65, 0x6d, 0x65, 0x72, 0x67, 0x65, 0x6e, 0x63, 0x79, 0x12, 0x70, 0x0a, 0x10, - 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, - 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x45, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, - 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, - 0x2e, 0x67, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, - 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x2e, 0x50, 0x61, - 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x0f, 0x70, - 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x5b, - 0x0a, 0x09, 0x64, 0x61, 0x6f, 0x5f, 0x73, 0x70, 0x65, 0x6e, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x3e, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, - 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x6f, 0x76, 0x65, - 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, - 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x2e, 0x44, 0x61, 0x6f, 0x53, 0x70, 0x65, 0x6e, - 0x64, 0x52, 0x08, 0x64, 0x61, 0x6f, 0x53, 0x70, 0x65, 0x6e, 0x64, 0x12, 0x64, 0x0a, 0x0c, 0x75, - 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x5f, 0x70, 0x6c, 0x61, 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x41, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, - 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x6f, 0x76, 0x65, - 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, - 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x2e, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, - 0x50, 0x6c, 0x61, 0x6e, 0x52, 0x0b, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x50, 0x6c, 0x61, - 0x6e, 0x1a, 0x23, 0x0a, 0x09, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x12, 0x16, - 0x0a, 0x06, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, - 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x1a, 0x2a, 0x0a, 0x09, 0x45, 0x6d, 0x65, 0x72, 0x67, 0x65, - 0x6e, 0x63, 0x79, 0x12, 0x1d, 0x0a, 0x0a, 0x68, 0x61, 0x6c, 0x74, 0x5f, 0x63, 0x68, 0x61, 0x69, - 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x68, 0x61, 0x6c, 0x74, 0x43, 0x68, 0x61, - 0x69, 0x6e, 0x1a, 0xe5, 0x01, 0x0a, 0x0f, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, - 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x68, 0x0a, 0x0e, 0x6f, 0x6c, 0x64, 0x5f, 0x70, 0x61, - 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x41, - 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, - 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, - 0x6e, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x43, 0x68, 0x61, - 0x6e, 0x67, 0x65, 0x64, 0x41, 0x70, 0x70, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, - 0x73, 0x52, 0x0d, 0x6f, 0x6c, 0x64, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, - 0x12, 0x68, 0x0a, 0x0e, 0x6e, 0x65, 0x77, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, - 0x72, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x41, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, + 0x6f, 0x6d, 0x65, 0x52, 0x07, 0x6f, 0x75, 0x74, 0x63, 0x6f, 0x6d, 0x65, 0x1a, 0x61, 0x0a, 0x07, + 0x43, 0x6c, 0x61, 0x69, 0x6d, 0x65, 0x64, 0x12, 0x56, 0x0a, 0x07, 0x6f, 0x75, 0x74, 0x63, 0x6f, + 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3c, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x76, 0x31, - 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x41, 0x70, - 0x70, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x52, 0x0d, 0x6e, 0x65, 0x77, - 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x1a, 0x4b, 0x0a, 0x08, 0x44, 0x61, - 0x6f, 0x53, 0x70, 0x65, 0x6e, 0x64, 0x12, 0x3f, 0x0a, 0x10, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x6c, 0x61, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x14, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x41, 0x6e, 0x79, 0x52, 0x0f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x50, 0x6c, 0x61, 0x6e, 0x1a, 0x25, 0x0a, 0x0b, 0x55, 0x70, 0x67, 0x72, 0x61, - 0x64, 0x65, 0x50, 0x6c, 0x61, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x22, 0x51, - 0x0a, 0x13, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 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, - 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x5f, 0x69, 0x64, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x49, - 0x64, 0x22, 0x6b, 0x0a, 0x14, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x49, 0x6e, 0x66, - 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2c, 0x0a, 0x12, 0x73, 0x74, 0x61, - 0x72, 0x74, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x10, 0x73, 0x74, 0x61, 0x72, 0x74, 0x42, 0x6c, 0x6f, 0x63, - 0x6b, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x74, 0x61, 0x72, 0x74, - 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, - 0x0d, 0x73, 0x74, 0x61, 0x72, 0x74, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x51, - 0x0a, 0x13, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 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, - 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x5f, 0x69, 0x64, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x49, - 0x64, 0x22, 0x96, 0x03, 0x0a, 0x14, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x44, 0x61, - 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x51, 0x0a, 0x08, 0x70, 0x72, - 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x70, + 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x4f, + 0x75, 0x74, 0x63, 0x6f, 0x6d, 0x65, 0x52, 0x07, 0x6f, 0x75, 0x74, 0x63, 0x6f, 0x6d, 0x65, 0x42, + 0x07, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, 0xcc, 0x04, 0x0a, 0x0f, 0x50, 0x72, 0x6f, + 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x4f, 0x75, 0x74, 0x63, 0x6f, 0x6d, 0x65, 0x12, 0x5d, 0x0a, 0x06, + 0x70, 0x61, 0x73, 0x73, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x43, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x6f, - 0x73, 0x61, 0x6c, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x12, 0x2c, 0x0a, - 0x12, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x68, 0x65, 0x69, - 0x67, 0x68, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x10, 0x73, 0x74, 0x61, 0x72, 0x74, - 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x28, 0x0a, 0x10, 0x65, - 0x6e, 0x64, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0e, 0x65, 0x6e, 0x64, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, - 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x70, - 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x73, - 0x74, 0x61, 0x72, 0x74, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x50, 0x0a, 0x05, - 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x70, 0x65, + 0x73, 0x61, 0x6c, 0x4f, 0x75, 0x74, 0x63, 0x6f, 0x6d, 0x65, 0x2e, 0x50, 0x61, 0x73, 0x73, 0x65, + 0x64, 0x48, 0x00, 0x52, 0x06, 0x70, 0x61, 0x73, 0x73, 0x65, 0x64, 0x12, 0x5d, 0x0a, 0x06, 0x66, + 0x61, 0x69, 0x6c, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x43, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, - 0x61, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x5a, - 0x0a, 0x17, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x5f, 0x64, 0x65, 0x70, 0x6f, 0x73, - 0x69, 0x74, 0x5f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x22, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, - 0x6e, 0x75, 0x6d, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x41, 0x6d, 0x6f, - 0x75, 0x6e, 0x74, 0x52, 0x15, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x44, 0x65, 0x70, - 0x6f, 0x73, 0x69, 0x74, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x55, 0x0a, 0x17, 0x50, 0x72, - 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x52, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 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, - 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x5f, 0x69, 0x64, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x49, - 0x64, 0x22, 0x69, 0x0a, 0x18, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x52, 0x61, 0x74, - 0x65, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4d, 0x0a, - 0x09, 0x72, 0x61, 0x74, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x30, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, - 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x74, 0x61, 0x6b, 0x65, - 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x52, 0x61, 0x74, 0x65, 0x44, 0x61, - 0x74, 0x61, 0x52, 0x08, 0x72, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x22, 0x4c, 0x0a, 0x13, - 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 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, 0x12, 0x1a, - 0x0a, 0x08, 0x69, 0x6e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x08, 0x69, 0x6e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x22, 0xba, 0x02, 0x0a, 0x14, 0x50, - 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x51, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, - 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, - 0x67, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, - 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x52, 0x08, 0x70, 0x72, - 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x12, 0x2c, 0x0a, 0x12, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, - 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x04, 0x52, 0x10, 0x73, 0x74, 0x61, 0x72, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, - 0x69, 0x67, 0x68, 0x74, 0x12, 0x28, 0x0a, 0x10, 0x65, 0x6e, 0x64, 0x5f, 0x62, 0x6c, 0x6f, 0x63, - 0x6b, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0e, - 0x65, 0x6e, 0x64, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x25, - 0x0a, 0x0e, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x73, 0x74, 0x61, 0x72, 0x74, 0x50, 0x6f, 0x73, - 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x50, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, + 0x61, 0x6c, 0x4f, 0x75, 0x74, 0x63, 0x6f, 0x6d, 0x65, 0x2e, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, + 0x48, 0x00, 0x52, 0x06, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x12, 0x60, 0x0a, 0x07, 0x73, 0x6c, + 0x61, 0x73, 0x68, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x44, 0x2e, 0x70, 0x65, + 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, + 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, + 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, + 0x61, 0x6c, 0x4f, 0x75, 0x74, 0x63, 0x6f, 0x6d, 0x65, 0x2e, 0x53, 0x6c, 0x61, 0x73, 0x68, 0x65, + 0x64, 0x48, 0x00, 0x52, 0x07, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x65, 0x64, 0x1a, 0x23, 0x0a, 0x09, + 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x61, + 0x73, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, + 0x6e, 0x1a, 0x08, 0x0a, 0x06, 0x50, 0x61, 0x73, 0x73, 0x65, 0x64, 0x1a, 0x6e, 0x0a, 0x06, 0x46, + 0x61, 0x69, 0x6c, 0x65, 0x64, 0x12, 0x64, 0x0a, 0x09, 0x77, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, + 0x77, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x46, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, + 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, + 0x6e, 0x74, 0x2e, 0x67, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x76, 0x31, + 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x4f, + 0x75, 0x74, 0x63, 0x6f, 0x6d, 0x65, 0x2e, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x6e, + 0x52, 0x09, 0x77, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x6e, 0x1a, 0x6f, 0x0a, 0x07, 0x53, + 0x6c, 0x61, 0x73, 0x68, 0x65, 0x64, 0x12, 0x64, 0x0a, 0x09, 0x77, 0x69, 0x74, 0x68, 0x64, 0x72, + 0x61, 0x77, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x46, 0x2e, 0x70, 0x65, 0x6e, 0x75, + 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, + 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x76, + 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, + 0x4f, 0x75, 0x74, 0x63, 0x6f, 0x6d, 0x65, 0x2e, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, + 0x6e, 0x52, 0x09, 0x77, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x6e, 0x42, 0x09, 0x0a, 0x07, + 0x6f, 0x75, 0x74, 0x63, 0x6f, 0x6d, 0x65, 0x22, 0x43, 0x0a, 0x05, 0x54, 0x61, 0x6c, 0x6c, 0x79, + 0x12, 0x10, 0x0a, 0x03, 0x79, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x03, 0x79, + 0x65, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x6e, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, + 0x6e, 0x6f, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x62, 0x73, 0x74, 0x61, 0x69, 0x6e, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x04, 0x52, 0x07, 0x61, 0x62, 0x73, 0x74, 0x61, 0x69, 0x6e, 0x22, 0xe9, 0x0a, 0x0a, + 0x08, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x69, 0x74, + 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x12, + 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x12, 0x5d, 0x0a, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3f, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, - 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x65, - 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, 0x53, 0x0a, 0x15, 0x56, 0x61, 0x6c, 0x69, 0x64, - 0x61, 0x74, 0x6f, 0x72, 0x56, 0x6f, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 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, 0x12, 0x1f, 0x0a, 0x0b, 0x70, - 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, - 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x49, 0x64, 0x22, 0xac, 0x01, 0x0a, - 0x16, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x56, 0x6f, 0x74, 0x65, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x45, 0x0a, 0x04, 0x76, 0x6f, 0x74, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, - 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, - 0x67, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, - 0x68, 0x61, 0x31, 0x2e, 0x56, 0x6f, 0x74, 0x65, 0x52, 0x04, 0x76, 0x6f, 0x74, 0x65, 0x12, 0x4b, - 0x0a, 0x0c, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, - 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6b, 0x65, 0x79, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, - 0x61, 0x31, 0x2e, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x4b, 0x65, 0x79, 0x52, 0x0b, - 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x4b, 0x65, 0x79, 0x22, 0xce, 0x02, 0x0a, 0x14, - 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, - 0x74, 0x65, 0x72, 0x73, 0x12, 0x34, 0x0a, 0x16, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, - 0x5f, 0x76, 0x6f, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x04, 0x52, 0x14, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x56, 0x6f, - 0x74, 0x69, 0x6e, 0x67, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x12, 0x5a, 0x0a, 0x17, 0x70, 0x72, - 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x5f, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x5f, 0x61, - 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x70, 0x65, - 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6e, 0x75, 0x6d, 0x2e, - 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x52, - 0x15, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, - 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x32, 0x0a, 0x15, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, - 0x61, 0x6c, 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x5f, 0x71, 0x75, 0x6f, 0x72, 0x75, 0x6d, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x56, - 0x61, 0x6c, 0x69, 0x64, 0x51, 0x75, 0x6f, 0x72, 0x75, 0x6d, 0x12, 0x36, 0x0a, 0x17, 0x70, 0x72, - 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x5f, 0x70, 0x61, 0x73, 0x73, 0x5f, 0x74, 0x68, 0x72, 0x65, - 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x70, 0x72, 0x6f, - 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x50, 0x61, 0x73, 0x73, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, - 0x6c, 0x64, 0x12, 0x38, 0x0a, 0x18, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x5f, 0x73, - 0x6c, 0x61, 0x73, 0x68, 0x5f, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x16, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x53, 0x6c, - 0x61, 0x73, 0x68, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x22, 0x80, 0x01, 0x0a, - 0x0e, 0x47, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, - 0x6e, 0x0a, 0x11, 0x67, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x70, 0x61, - 0x72, 0x61, 0x6d, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x41, 0x2e, 0x70, 0x65, 0x6e, - 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, - 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x2e, - 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, - 0x6e, 0x63, 0x65, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x52, 0x10, 0x67, - 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x22, - 0xb6, 0x05, 0x0a, 0x14, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x41, 0x70, 0x70, 0x50, 0x61, - 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x12, 0x5a, 0x0a, 0x0c, 0x63, 0x68, 0x61, 0x69, - 0x6e, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x37, - 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, - 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x2e, 0x76, - 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x50, 0x61, 0x72, - 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x52, 0x0b, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x50, 0x61, - 0x72, 0x61, 0x6d, 0x73, 0x12, 0x52, 0x0a, 0x0a, 0x64, 0x61, 0x6f, 0x5f, 0x70, 0x61, 0x72, 0x61, - 0x6d, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, - 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, - 0x6e, 0x74, 0x2e, 0x64, 0x61, 0x6f, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, - 0x44, 0x61, 0x6f, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x52, 0x09, 0x64, - 0x61, 0x6f, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x6e, 0x0a, 0x11, 0x67, 0x6f, 0x76, 0x65, - 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x03, 0x20, + 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x2e, 0x53, 0x69, 0x67, 0x6e, + 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x52, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x69, 0x6e, 0x67, + 0x12, 0x5d, 0x0a, 0x09, 0x65, 0x6d, 0x65, 0x72, 0x67, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x3f, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, + 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x6f, + 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, + 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x2e, 0x45, 0x6d, 0x65, 0x72, 0x67, + 0x65, 0x6e, 0x63, 0x79, 0x52, 0x09, 0x65, 0x6d, 0x65, 0x72, 0x67, 0x65, 0x6e, 0x63, 0x79, 0x12, + 0x70, 0x0a, 0x10, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x5f, 0x63, 0x68, 0x61, + 0x6e, 0x67, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x45, 0x2e, 0x70, 0x65, 0x6e, 0x75, + 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, + 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x76, + 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, + 0x2e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, + 0x52, 0x0f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x43, 0x68, 0x61, 0x6e, 0x67, + 0x65, 0x12, 0x7a, 0x0a, 0x14, 0x63, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x74, 0x79, 0x5f, 0x70, + 0x6f, 0x6f, 0x6c, 0x5f, 0x73, 0x70, 0x65, 0x6e, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x48, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, + 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x6f, 0x76, 0x65, 0x72, 0x6e, + 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, + 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x74, 0x79, + 0x50, 0x6f, 0x6f, 0x6c, 0x53, 0x70, 0x65, 0x6e, 0x64, 0x52, 0x12, 0x63, 0x6f, 0x6d, 0x6d, 0x75, + 0x6e, 0x69, 0x74, 0x79, 0x50, 0x6f, 0x6f, 0x6c, 0x53, 0x70, 0x65, 0x6e, 0x64, 0x12, 0x64, 0x0a, + 0x0c, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x5f, 0x70, 0x6c, 0x61, 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x41, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, - 0x31, 0x2e, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x50, 0x61, 0x72, 0x61, - 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x52, 0x10, 0x67, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, - 0x63, 0x65, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x52, 0x0a, 0x0a, 0x69, 0x62, 0x63, 0x5f, - 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x70, - 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, - 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x69, 0x62, 0x63, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, - 0x68, 0x61, 0x31, 0x2e, 0x49, 0x62, 0x63, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, - 0x73, 0x52, 0x09, 0x69, 0x62, 0x63, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x5a, 0x0a, 0x0c, - 0x73, 0x74, 0x61, 0x6b, 0x65, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, - 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x74, 0x61, - 0x6b, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x6b, - 0x65, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x52, 0x0b, 0x73, 0x74, 0x61, - 0x6b, 0x65, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x52, 0x0a, 0x0a, 0x66, 0x65, 0x65, 0x5f, - 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x70, + 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x2e, 0x55, 0x70, 0x67, 0x72, 0x61, + 0x64, 0x65, 0x50, 0x6c, 0x61, 0x6e, 0x52, 0x0b, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x50, + 0x6c, 0x61, 0x6e, 0x12, 0x71, 0x0a, 0x11, 0x66, 0x72, 0x65, 0x65, 0x7a, 0x65, 0x5f, 0x69, 0x62, + 0x63, 0x5f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x45, + 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, + 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, + 0x6e, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, + 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x2e, 0x46, 0x72, 0x65, 0x65, 0x7a, 0x65, 0x49, 0x62, 0x63, 0x43, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x52, 0x0f, 0x66, 0x72, 0x65, 0x65, 0x7a, 0x65, 0x49, 0x62, 0x63, + 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x12, 0x77, 0x0a, 0x13, 0x75, 0x6e, 0x66, 0x72, 0x65, 0x65, + 0x7a, 0x65, 0x5f, 0x69, 0x62, 0x63, 0x5f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x18, 0x0b, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x47, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, + 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x6f, + 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, + 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x2e, 0x55, 0x6e, 0x66, 0x72, 0x65, + 0x65, 0x7a, 0x65, 0x49, 0x62, 0x63, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x52, 0x11, 0x75, 0x6e, + 0x66, 0x72, 0x65, 0x65, 0x7a, 0x65, 0x49, 0x62, 0x63, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x1a, + 0x23, 0x0a, 0x09, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x12, 0x16, 0x0a, 0x06, + 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, 0x6f, + 0x6d, 0x6d, 0x69, 0x74, 0x1a, 0x2a, 0x0a, 0x09, 0x45, 0x6d, 0x65, 0x72, 0x67, 0x65, 0x6e, 0x63, + 0x79, 0x12, 0x1d, 0x0a, 0x0a, 0x68, 0x61, 0x6c, 0x74, 0x5f, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x68, 0x61, 0x6c, 0x74, 0x43, 0x68, 0x61, 0x69, 0x6e, + 0x1a, 0xe5, 0x01, 0x0a, 0x0f, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x43, 0x68, + 0x61, 0x6e, 0x67, 0x65, 0x12, 0x68, 0x0a, 0x0e, 0x6f, 0x6c, 0x64, 0x5f, 0x70, 0x61, 0x72, 0x61, + 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x41, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, - 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x66, 0x65, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, - 0x68, 0x61, 0x31, 0x2e, 0x46, 0x65, 0x65, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, - 0x73, 0x52, 0x09, 0x66, 0x65, 0x65, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x7a, 0x0a, 0x14, - 0x64, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5f, 0x70, 0x61, - 0x72, 0x61, 0x6d, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x47, 0x2e, 0x70, 0x65, 0x6e, - 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, - 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x64, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, 0x69, 0x73, 0x74, - 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, - 0x65, 0x72, 0x73, 0x52, 0x13, 0x64, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x22, 0xc3, 0x01, 0x0a, 0x17, 0x43, 0x68, 0x61, - 0x6e, 0x67, 0x65, 0x64, 0x41, 0x70, 0x70, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, - 0x73, 0x53, 0x65, 0x74, 0x12, 0x53, 0x0a, 0x03, 0x6f, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x41, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, - 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x6f, 0x76, 0x65, - 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, - 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x41, 0x70, 0x70, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, - 0x74, 0x65, 0x72, 0x73, 0x52, 0x03, 0x6f, 0x6c, 0x64, 0x12, 0x53, 0x0a, 0x03, 0x6e, 0x65, 0x77, + 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, + 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, + 0x65, 0x64, 0x41, 0x70, 0x70, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x52, + 0x0d, 0x6f, 0x6c, 0x64, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x12, 0x68, + 0x0a, 0x0e, 0x6e, 0x65, 0x77, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x41, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x41, 0x70, 0x70, 0x50, - 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x52, 0x03, 0x6e, 0x65, 0x77, 0x22, 0xac, - 0x01, 0x0a, 0x21, 0x56, 0x6f, 0x74, 0x69, 0x6e, 0x67, 0x50, 0x6f, 0x77, 0x65, 0x72, 0x41, 0x74, - 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 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, 0x12, - 0x1f, 0x0a, 0x0b, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x49, 0x64, - 0x12, 0x4b, 0x0a, 0x0c, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x5f, 0x6b, 0x65, 0x79, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, - 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6b, 0x65, 0x79, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, - 0x70, 0x68, 0x61, 0x31, 0x2e, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x4b, 0x65, 0x79, - 0x52, 0x0b, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x4b, 0x65, 0x79, 0x22, 0x47, 0x0a, - 0x22, 0x56, 0x6f, 0x74, 0x69, 0x6e, 0x67, 0x50, 0x6f, 0x77, 0x65, 0x72, 0x41, 0x74, 0x50, 0x72, - 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x76, 0x6f, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x6f, - 0x77, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x76, 0x6f, 0x74, 0x69, 0x6e, - 0x67, 0x50, 0x6f, 0x77, 0x65, 0x72, 0x22, 0x68, 0x0a, 0x2a, 0x41, 0x6c, 0x6c, 0x54, 0x61, 0x6c, - 0x6c, 0x69, 0x65, 0x64, 0x44, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x56, 0x6f, 0x74, - 0x65, 0x73, 0x46, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 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, 0x12, - 0x1f, 0x0a, 0x0b, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x49, 0x64, - 0x22, 0xc4, 0x01, 0x0a, 0x2b, 0x41, 0x6c, 0x6c, 0x54, 0x61, 0x6c, 0x6c, 0x69, 0x65, 0x64, 0x44, - 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x56, 0x6f, 0x74, 0x65, 0x73, 0x46, 0x6f, 0x72, - 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x48, 0x0a, 0x05, 0x74, 0x61, 0x6c, 0x6c, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x32, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, - 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x6f, 0x76, 0x65, 0x72, 0x6e, - 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x54, 0x61, - 0x6c, 0x6c, 0x79, 0x52, 0x05, 0x74, 0x61, 0x6c, 0x6c, 0x79, 0x12, 0x4b, 0x0a, 0x0c, 0x69, 0x64, - 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x28, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, - 0x2e, 0x6b, 0x65, 0x79, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x49, - 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x4b, 0x65, 0x79, 0x52, 0x0b, 0x69, 0x64, 0x65, 0x6e, - 0x74, 0x69, 0x74, 0x79, 0x4b, 0x65, 0x79, 0x22, 0x32, 0x0a, 0x15, 0x4e, 0x65, 0x78, 0x74, 0x50, - 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x49, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 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, 0x42, 0x0a, 0x16, 0x4e, - 0x65, 0x78, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x49, 0x64, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x28, 0x0a, 0x10, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x72, - 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, - 0x0e, 0x6e, 0x65, 0x78, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x49, 0x64, 0x32, - 0xcd, 0x0a, 0x0a, 0x0c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x12, 0x93, 0x01, 0x0a, 0x0c, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x49, 0x6e, 0x66, - 0x6f, 0x12, 0x40, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, - 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x6f, 0x76, 0x65, - 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, - 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x41, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, - 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x6f, - 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, - 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x95, 0x01, 0x0a, 0x0c, 0x50, 0x72, 0x6f, 0x70, 0x6f, - 0x73, 0x61, 0x6c, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x40, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, - 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, - 0x74, 0x2e, 0x67, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, - 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x4c, 0x69, - 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x41, 0x2e, 0x70, 0x65, 0x6e, 0x75, - 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, - 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x76, - 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, - 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x30, 0x01, 0x12, 0x93, - 0x01, 0x0a, 0x0c, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x44, 0x61, 0x74, 0x61, 0x12, - 0x40, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, + 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x52, 0x0d, 0x6e, 0x65, 0x77, 0x50, 0x61, + 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x1a, 0x55, 0x0a, 0x12, 0x43, 0x6f, 0x6d, 0x6d, + 0x75, 0x6e, 0x69, 0x74, 0x79, 0x50, 0x6f, 0x6f, 0x6c, 0x53, 0x70, 0x65, 0x6e, 0x64, 0x12, 0x3f, + 0x0a, 0x10, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x6c, + 0x61, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x41, 0x6e, 0x79, 0x52, 0x0f, + 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6c, 0x61, 0x6e, 0x1a, + 0x25, 0x0a, 0x0b, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x50, 0x6c, 0x61, 0x6e, 0x12, 0x16, + 0x0a, 0x06, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, + 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x1a, 0x2e, 0x0a, 0x0f, 0x46, 0x72, 0x65, 0x65, 0x7a, 0x65, + 0x49, 0x62, 0x63, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x63, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x1a, 0x30, 0x0a, 0x11, 0x55, 0x6e, 0x66, 0x72, 0x65, 0x65, + 0x7a, 0x65, 0x49, 0x62, 0x63, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x22, 0x51, 0x0a, 0x13, 0x50, 0x72, 0x6f, 0x70, + 0x6f, 0x73, 0x61, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 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, 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x72, + 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, + 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x49, 0x64, 0x22, 0x6b, 0x0a, 0x14, 0x50, + 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x2c, 0x0a, 0x12, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x62, 0x6c, 0x6f, + 0x63, 0x6b, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, + 0x10, 0x73, 0x74, 0x61, 0x72, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x69, 0x67, 0x68, + 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x73, 0x74, 0x61, 0x72, 0x74, + 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x51, 0x0a, 0x13, 0x50, 0x72, 0x6f, 0x70, + 0x6f, 0x73, 0x61, 0x6c, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 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, 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x72, + 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, + 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x49, 0x64, 0x22, 0x96, 0x03, 0x0a, 0x14, + 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x51, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, + 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, + 0x2e, 0x67, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, + 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x52, 0x08, 0x70, + 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x12, 0x2c, 0x0a, 0x12, 0x73, 0x74, 0x61, 0x72, 0x74, + 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x04, 0x52, 0x10, 0x73, 0x74, 0x61, 0x72, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, + 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x28, 0x0a, 0x10, 0x65, 0x6e, 0x64, 0x5f, 0x62, 0x6c, 0x6f, + 0x63, 0x6b, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, + 0x0e, 0x65, 0x6e, 0x64, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, + 0x25, 0x0a, 0x0e, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x73, 0x74, 0x61, 0x72, 0x74, 0x50, 0x6f, + 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x50, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, + 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, + 0x67, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, + 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x53, 0x74, 0x61, 0x74, + 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x5a, 0x0a, 0x17, 0x70, 0x72, 0x6f, 0x70, + 0x6f, 0x73, 0x61, 0x6c, 0x5f, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x5f, 0x61, 0x6d, 0x6f, + 0x75, 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x70, 0x65, 0x6e, 0x75, + 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6e, 0x75, 0x6d, 0x2e, 0x76, 0x31, + 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x15, 0x70, + 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x41, 0x6d, + 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x55, 0x0a, 0x17, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, + 0x52, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 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, 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x72, + 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, + 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x49, 0x64, 0x22, 0x69, 0x0a, 0x18, 0x50, + 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x52, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4d, 0x0a, 0x09, 0x72, 0x61, 0x74, 0x65, 0x5f, + 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x70, 0x65, 0x6e, + 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, + 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x74, 0x61, 0x6b, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, + 0x68, 0x61, 0x31, 0x2e, 0x52, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x52, 0x08, 0x72, 0x61, + 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x22, 0x4c, 0x0a, 0x13, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, + 0x61, 0x6c, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 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, 0x12, 0x1a, 0x0a, 0x08, 0x69, 0x6e, 0x61, 0x63, + 0x74, 0x69, 0x76, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x69, 0x6e, 0x61, 0x63, + 0x74, 0x69, 0x76, 0x65, 0x22, 0xba, 0x02, 0x0a, 0x14, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, + 0x6c, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x51, 0x0a, + 0x08, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x35, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, - 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x41, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, - 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x6f, 0x76, 0x65, - 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, - 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x99, 0x01, 0x0a, 0x0e, 0x4e, 0x65, 0x78, 0x74, 0x50, 0x72, 0x6f, - 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x49, 0x64, 0x12, 0x42, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, + 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, + 0x12, 0x2c, 0x0a, 0x12, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, + 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x10, 0x73, 0x74, + 0x61, 0x72, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x28, + 0x0a, 0x10, 0x65, 0x6e, 0x64, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x68, 0x65, 0x69, 0x67, + 0x68, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0e, 0x65, 0x6e, 0x64, 0x42, 0x6c, 0x6f, + 0x63, 0x6b, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x74, 0x61, 0x72, + 0x74, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, + 0x52, 0x0d, 0x73, 0x74, 0x61, 0x72, 0x74, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x50, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3a, + 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, + 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, + 0x6e, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, + 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, + 0x65, 0x22, 0x53, 0x0a, 0x15, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x56, 0x6f, + 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 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, 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, + 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, + 0x6f, 0x73, 0x61, 0x6c, 0x49, 0x64, 0x22, 0xac, 0x01, 0x0a, 0x16, 0x56, 0x61, 0x6c, 0x69, 0x64, + 0x61, 0x74, 0x6f, 0x72, 0x56, 0x6f, 0x74, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x45, 0x0a, 0x04, 0x76, 0x6f, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x31, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, + 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x6f, 0x76, 0x65, 0x72, 0x6e, + 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x56, 0x6f, + 0x74, 0x65, 0x52, 0x04, 0x76, 0x6f, 0x74, 0x65, 0x12, 0x4b, 0x0a, 0x0c, 0x69, 0x64, 0x65, 0x6e, + 0x74, 0x69, 0x74, 0x79, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, + 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6b, + 0x65, 0x79, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x49, 0x64, 0x65, + 0x6e, 0x74, 0x69, 0x74, 0x79, 0x4b, 0x65, 0x79, 0x52, 0x0b, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, + 0x74, 0x79, 0x4b, 0x65, 0x79, 0x22, 0xce, 0x02, 0x0a, 0x14, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, + 0x61, 0x6e, 0x63, 0x65, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x12, 0x34, + 0x0a, 0x16, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x5f, 0x76, 0x6f, 0x74, 0x69, 0x6e, + 0x67, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x14, + 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x56, 0x6f, 0x74, 0x69, 0x6e, 0x67, 0x42, 0x6c, + 0x6f, 0x63, 0x6b, 0x73, 0x12, 0x5a, 0x0a, 0x17, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, + 0x5f, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x5f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, + 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6e, 0x75, 0x6d, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, + 0x61, 0x31, 0x2e, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x15, 0x70, 0x72, 0x6f, 0x70, 0x6f, + 0x73, 0x61, 0x6c, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, + 0x12, 0x32, 0x0a, 0x15, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x5f, 0x76, 0x61, 0x6c, + 0x69, 0x64, 0x5f, 0x71, 0x75, 0x6f, 0x72, 0x75, 0x6d, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x13, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x51, 0x75, + 0x6f, 0x72, 0x75, 0x6d, 0x12, 0x36, 0x0a, 0x17, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, + 0x5f, 0x70, 0x61, 0x73, 0x73, 0x5f, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x50, + 0x61, 0x73, 0x73, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x38, 0x0a, 0x18, + 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x5f, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x5f, 0x74, + 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x16, + 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x53, 0x6c, 0x61, 0x73, 0x68, 0x54, 0x68, 0x72, + 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x22, 0x80, 0x01, 0x0a, 0x0e, 0x47, 0x65, 0x6e, 0x65, 0x73, + 0x69, 0x73, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x6e, 0x0a, 0x11, 0x67, 0x6f, 0x76, + 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x41, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, + 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x67, + 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, + 0x61, 0x31, 0x2e, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x50, 0x61, 0x72, + 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x52, 0x10, 0x67, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, + 0x6e, 0x63, 0x65, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x22, 0xe0, 0x05, 0x0a, 0x14, 0x43, 0x68, + 0x61, 0x6e, 0x67, 0x65, 0x64, 0x41, 0x70, 0x70, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, + 0x72, 0x73, 0x12, 0x5a, 0x0a, 0x0c, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x70, 0x61, 0x72, 0x61, + 0x6d, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, + 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, + 0x6e, 0x74, 0x2e, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, + 0x31, 0x2e, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, + 0x73, 0x52, 0x0b, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x7c, + 0x0a, 0x15, 0x63, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x74, 0x79, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, + 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x48, 0x2e, + 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, + 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x74, + 0x79, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, + 0x43, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x74, 0x79, 0x50, 0x6f, 0x6f, 0x6c, 0x50, 0x61, 0x72, + 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x52, 0x13, 0x63, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, + 0x74, 0x79, 0x50, 0x6f, 0x6f, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x6e, 0x0a, 0x11, + 0x67, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, + 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x41, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, - 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4e, 0x65, 0x78, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, - 0x61, 0x6c, 0x49, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x43, 0x2e, 0x70, 0x65, - 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, - 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, - 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4e, 0x65, 0x78, 0x74, 0x50, 0x72, - 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x49, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x9b, 0x01, 0x0a, 0x0e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x56, 0x6f, - 0x74, 0x65, 0x73, 0x12, 0x42, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, + 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, + 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x52, 0x10, 0x67, 0x6f, 0x76, 0x65, + 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x52, 0x0a, 0x0a, + 0x69, 0x62, 0x63, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x33, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, + 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x69, 0x62, 0x63, 0x2e, 0x76, + 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x49, 0x62, 0x63, 0x50, 0x61, 0x72, 0x61, 0x6d, + 0x65, 0x74, 0x65, 0x72, 0x73, 0x52, 0x09, 0x69, 0x62, 0x63, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, + 0x12, 0x5a, 0x0a, 0x0c, 0x73, 0x74, 0x61, 0x6b, 0x65, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, + 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, + 0x2e, 0x73, 0x74, 0x61, 0x6b, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, + 0x53, 0x74, 0x61, 0x6b, 0x65, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x52, + 0x0b, 0x73, 0x74, 0x61, 0x6b, 0x65, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x52, 0x0a, 0x0a, + 0x66, 0x65, 0x65, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x33, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, + 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x66, 0x65, 0x65, 0x2e, 0x76, + 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x46, 0x65, 0x65, 0x50, 0x61, 0x72, 0x61, 0x6d, + 0x65, 0x74, 0x65, 0x72, 0x73, 0x52, 0x09, 0x66, 0x65, 0x65, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, + 0x12, 0x7a, 0x0a, 0x14, 0x64, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x47, + 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, + 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x64, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, + 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, + 0x44, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x50, 0x61, 0x72, + 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x52, 0x13, 0x64, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, + 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x22, 0xc3, 0x01, 0x0a, + 0x17, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x41, 0x70, 0x70, 0x50, 0x61, 0x72, 0x61, 0x6d, + 0x65, 0x74, 0x65, 0x72, 0x73, 0x53, 0x65, 0x74, 0x12, 0x53, 0x0a, 0x03, 0x6f, 0x6c, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x41, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, + 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, + 0x67, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, + 0x68, 0x61, 0x31, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x41, 0x70, 0x70, 0x50, 0x61, + 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x52, 0x03, 0x6f, 0x6c, 0x64, 0x12, 0x53, 0x0a, + 0x03, 0x6e, 0x65, 0x77, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x41, 0x2e, 0x70, 0x65, 0x6e, + 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, + 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x2e, + 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, + 0x41, 0x70, 0x70, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x52, 0x03, 0x6e, + 0x65, 0x77, 0x22, 0xac, 0x01, 0x0a, 0x21, 0x56, 0x6f, 0x74, 0x69, 0x6e, 0x67, 0x50, 0x6f, 0x77, + 0x65, 0x72, 0x41, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x53, 0x74, 0x61, 0x72, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 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, 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x5f, + 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, + 0x61, 0x6c, 0x49, 0x64, 0x12, 0x4b, 0x0a, 0x0c, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, + 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x70, 0x65, 0x6e, + 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6b, 0x65, 0x79, 0x73, 0x2e, + 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, + 0x79, 0x4b, 0x65, 0x79, 0x52, 0x0b, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x4b, 0x65, + 0x79, 0x22, 0x47, 0x0a, 0x22, 0x56, 0x6f, 0x74, 0x69, 0x6e, 0x67, 0x50, 0x6f, 0x77, 0x65, 0x72, + 0x41, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x76, 0x6f, 0x74, 0x69, 0x6e, + 0x67, 0x5f, 0x70, 0x6f, 0x77, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x76, + 0x6f, 0x74, 0x69, 0x6e, 0x67, 0x50, 0x6f, 0x77, 0x65, 0x72, 0x22, 0x68, 0x0a, 0x2a, 0x41, 0x6c, + 0x6c, 0x54, 0x61, 0x6c, 0x6c, 0x69, 0x65, 0x64, 0x44, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x6f, + 0x72, 0x56, 0x6f, 0x74, 0x65, 0x73, 0x46, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, + 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 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, 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x5f, + 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, + 0x61, 0x6c, 0x49, 0x64, 0x22, 0xc4, 0x01, 0x0a, 0x2b, 0x41, 0x6c, 0x6c, 0x54, 0x61, 0x6c, 0x6c, + 0x69, 0x65, 0x64, 0x44, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x56, 0x6f, 0x74, 0x65, + 0x73, 0x46, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x48, 0x0a, 0x05, 0x74, 0x61, 0x6c, 0x6c, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, - 0x31, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x56, 0x6f, 0x74, 0x65, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x43, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, + 0x31, 0x2e, 0x54, 0x61, 0x6c, 0x6c, 0x79, 0x52, 0x05, 0x74, 0x61, 0x6c, 0x6c, 0x79, 0x12, 0x4b, + 0x0a, 0x0c, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, + 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6b, 0x65, 0x79, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, + 0x61, 0x31, 0x2e, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x4b, 0x65, 0x79, 0x52, 0x0b, + 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x4b, 0x65, 0x79, 0x22, 0x32, 0x0a, 0x15, 0x4e, + 0x65, 0x78, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x49, 0x64, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 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, + 0x42, 0x0a, 0x16, 0x4e, 0x65, 0x78, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x49, + 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x28, 0x0a, 0x10, 0x6e, 0x65, 0x78, + 0x74, 0x5f, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x04, 0x52, 0x0e, 0x6e, 0x65, 0x78, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, + 0x6c, 0x49, 0x64, 0x32, 0xcd, 0x0a, 0x0a, 0x0c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x53, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x12, 0x93, 0x01, 0x0a, 0x0c, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, + 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x40, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, + 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, + 0x67, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, + 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x49, 0x6e, 0x66, 0x6f, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x41, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, - 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x56, - 0x6f, 0x74, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x30, 0x01, 0x12, 0xbd, - 0x01, 0x0a, 0x1a, 0x56, 0x6f, 0x74, 0x69, 0x6e, 0x67, 0x50, 0x6f, 0x77, 0x65, 0x72, 0x41, 0x74, - 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x4e, 0x2e, - 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, - 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, - 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x56, 0x6f, 0x74, 0x69, - 0x6e, 0x67, 0x50, 0x6f, 0x77, 0x65, 0x72, 0x41, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, - 0x6c, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x4f, 0x2e, + 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x49, 0x6e, + 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x95, 0x01, 0x0a, 0x0c, 0x50, + 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x40, 0x2e, 0x70, 0x65, + 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, + 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, + 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, + 0x61, 0x6c, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x41, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, - 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x56, 0x6f, 0x74, 0x69, - 0x6e, 0x67, 0x50, 0x6f, 0x77, 0x65, 0x72, 0x41, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, - 0x6c, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0xda, - 0x01, 0x0a, 0x23, 0x41, 0x6c, 0x6c, 0x54, 0x61, 0x6c, 0x6c, 0x69, 0x65, 0x64, 0x44, 0x65, 0x6c, - 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x56, 0x6f, 0x74, 0x65, 0x73, 0x46, 0x6f, 0x72, 0x50, 0x72, - 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x12, 0x57, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, - 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, - 0x2e, 0x67, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, - 0x70, 0x68, 0x61, 0x31, 0x2e, 0x41, 0x6c, 0x6c, 0x54, 0x61, 0x6c, 0x6c, 0x69, 0x65, 0x64, 0x44, - 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x56, 0x6f, 0x74, 0x65, 0x73, 0x46, 0x6f, 0x72, - 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x58, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, - 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x6f, 0x76, 0x65, 0x72, 0x6e, - 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x41, 0x6c, - 0x6c, 0x54, 0x61, 0x6c, 0x6c, 0x69, 0x65, 0x64, 0x44, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x6f, - 0x72, 0x56, 0x6f, 0x74, 0x65, 0x73, 0x46, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, - 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x30, 0x01, 0x12, 0xa1, 0x01, 0x0a, 0x10, - 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x52, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, - 0x12, 0x44, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, - 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x6f, 0x76, 0x65, 0x72, - 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, - 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x52, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x45, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, - 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, - 0x2e, 0x67, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, - 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x52, 0x61, 0x74, - 0x65, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x30, 0x01, 0x42, - 0x82, 0x03, 0x0a, 0x2f, 0x63, 0x6f, 0x6d, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, + 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x70, + 0x6f, 0x73, 0x61, 0x6c, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x30, 0x01, 0x12, 0x93, 0x01, 0x0a, 0x0c, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x44, + 0x61, 0x74, 0x61, 0x12, 0x40, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, + 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x6f, + 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, + 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x41, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, - 0x68, 0x61, 0x31, 0x42, 0x0f, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x50, - 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x6d, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, - 0x6f, 0x6d, 0x2f, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2d, 0x7a, 0x6f, 0x6e, 0x65, - 0x2f, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, - 0x67, 0x6f, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2f, - 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2f, 0x67, - 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, - 0x61, 0x31, 0x3b, 0x67, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x76, 0x31, 0x61, - 0x6c, 0x70, 0x68, 0x61, 0x31, 0xa2, 0x02, 0x04, 0x50, 0x43, 0x43, 0x47, 0xaa, 0x02, 0x2b, 0x50, - 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x43, 0x6f, 0x72, 0x65, 0x2e, 0x43, 0x6f, 0x6d, - 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, - 0x65, 0x2e, 0x56, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0xca, 0x02, 0x2b, 0x50, 0x65, 0x6e, - 0x75, 0x6d, 0x62, 0x72, 0x61, 0x5c, 0x43, 0x6f, 0x72, 0x65, 0x5c, 0x43, 0x6f, 0x6d, 0x70, 0x6f, - 0x6e, 0x65, 0x6e, 0x74, 0x5c, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x5c, - 0x56, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0xe2, 0x02, 0x37, 0x50, 0x65, 0x6e, 0x75, 0x6d, - 0x62, 0x72, 0x61, 0x5c, 0x43, 0x6f, 0x72, 0x65, 0x5c, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, - 0x6e, 0x74, 0x5c, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x5c, 0x56, 0x31, - 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, - 0x74, 0x61, 0xea, 0x02, 0x2f, 0x50, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x3a, 0x3a, 0x43, - 0x6f, 0x72, 0x65, 0x3a, 0x3a, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x3a, 0x3a, - 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x3a, 0x3a, 0x56, 0x31, 0x61, 0x6c, - 0x70, 0x68, 0x61, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x44, 0x61, 0x74, 0x61, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x99, 0x01, 0x0a, 0x0e, 0x4e, 0x65, 0x78, + 0x74, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x49, 0x64, 0x12, 0x42, 0x2e, 0x70, 0x65, + 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, + 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, + 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4e, 0x65, 0x78, 0x74, 0x50, 0x72, + 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x49, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x43, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, + 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x6f, 0x76, 0x65, 0x72, 0x6e, + 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4e, 0x65, + 0x78, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x49, 0x64, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x9b, 0x01, 0x0a, 0x0e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, + 0x6f, 0x72, 0x56, 0x6f, 0x74, 0x65, 0x73, 0x12, 0x42, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, + 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, + 0x74, 0x2e, 0x67, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, + 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x56, + 0x6f, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x43, 0x2e, 0x70, 0x65, + 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, + 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, + 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, + 0x74, 0x6f, 0x72, 0x56, 0x6f, 0x74, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x30, 0x01, 0x12, 0xbd, 0x01, 0x0a, 0x1a, 0x56, 0x6f, 0x74, 0x69, 0x6e, 0x67, 0x50, 0x6f, 0x77, + 0x65, 0x72, 0x41, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x53, 0x74, 0x61, 0x72, + 0x74, 0x12, 0x4e, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, + 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x6f, 0x76, 0x65, + 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, + 0x56, 0x6f, 0x74, 0x69, 0x6e, 0x67, 0x50, 0x6f, 0x77, 0x65, 0x72, 0x41, 0x74, 0x50, 0x72, 0x6f, + 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x4f, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, + 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x6f, 0x76, 0x65, + 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, + 0x56, 0x6f, 0x74, 0x69, 0x6e, 0x67, 0x50, 0x6f, 0x77, 0x65, 0x72, 0x41, 0x74, 0x50, 0x72, 0x6f, + 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0xda, 0x01, 0x0a, 0x23, 0x41, 0x6c, 0x6c, 0x54, 0x61, 0x6c, 0x6c, 0x69, 0x65, + 0x64, 0x44, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x56, 0x6f, 0x74, 0x65, 0x73, 0x46, + 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x12, 0x57, 0x2e, 0x70, 0x65, 0x6e, + 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, + 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x2e, + 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x41, 0x6c, 0x6c, 0x54, 0x61, 0x6c, 0x6c, + 0x69, 0x65, 0x64, 0x44, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x56, 0x6f, 0x74, 0x65, + 0x73, 0x46, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x58, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, + 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x6f, + 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, + 0x31, 0x2e, 0x41, 0x6c, 0x6c, 0x54, 0x61, 0x6c, 0x6c, 0x69, 0x65, 0x64, 0x44, 0x65, 0x6c, 0x65, + 0x67, 0x61, 0x74, 0x6f, 0x72, 0x56, 0x6f, 0x74, 0x65, 0x73, 0x46, 0x6f, 0x72, 0x50, 0x72, 0x6f, + 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x30, 0x01, 0x12, + 0xa1, 0x01, 0x0a, 0x10, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x52, 0x61, 0x74, 0x65, + 0x44, 0x61, 0x74, 0x61, 0x12, 0x44, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, + 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x67, + 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, + 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x52, 0x61, 0x74, 0x65, 0x44, + 0x61, 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x45, 0x2e, 0x70, 0x65, 0x6e, + 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, + 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x2e, + 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, + 0x6c, 0x52, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x30, 0x01, 0x42, 0x82, 0x03, 0x0a, 0x2f, 0x63, 0x6f, 0x6d, 0x2e, 0x70, 0x65, 0x6e, 0x75, + 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, + 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x76, + 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x42, 0x0f, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, + 0x6e, 0x63, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x6d, 0x67, 0x69, 0x74, 0x68, + 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2d, + 0x7a, 0x6f, 0x6e, 0x65, 0x2f, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2f, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x6f, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x70, 0x65, 0x6e, 0x75, 0x6d, + 0x62, 0x72, 0x61, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, + 0x6e, 0x74, 0x2f, 0x67, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x2f, 0x76, 0x31, + 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x3b, 0x67, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, + 0x65, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0xa2, 0x02, 0x04, 0x50, 0x43, 0x43, 0x47, + 0xaa, 0x02, 0x2b, 0x50, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x43, 0x6f, 0x72, 0x65, + 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x47, 0x6f, 0x76, 0x65, 0x72, + 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x56, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0xca, 0x02, + 0x2b, 0x50, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x5c, 0x43, 0x6f, 0x72, 0x65, 0x5c, 0x43, + 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x5c, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, + 0x6e, 0x63, 0x65, 0x5c, 0x56, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0xe2, 0x02, 0x37, 0x50, + 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x5c, 0x43, 0x6f, 0x72, 0x65, 0x5c, 0x43, 0x6f, 0x6d, + 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x5c, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, + 0x65, 0x5c, 0x56, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, + 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x2f, 0x50, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, + 0x61, 0x3a, 0x3a, 0x43, 0x6f, 0x72, 0x65, 0x3a, 0x3a, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, + 0x6e, 0x74, 0x3a, 0x3a, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x3a, 0x3a, + 0x56, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -4191,7 +4343,7 @@ func file_penumbra_core_component_governance_v1alpha1_governance_proto_rawDescGZ } var file_penumbra_core_component_governance_v1alpha1_governance_proto_enumTypes = make([]protoimpl.EnumInfo, 1) -var file_penumbra_core_component_governance_v1alpha1_governance_proto_msgTypes = make([]protoimpl.MessageInfo, 54) +var file_penumbra_core_component_governance_v1alpha1_governance_proto_msgTypes = make([]protoimpl.MessageInfo, 56) var file_penumbra_core_component_governance_v1alpha1_governance_proto_goTypes = []interface{}{ (Vote_Vote)(0), // 0: penumbra.core.component.governance.v1alpha1.Vote.Vote (*ZKDelegatorVoteProof)(nil), // 1: penumbra.core.component.governance.v1alpha1.ZKDelegatorVoteProof @@ -4205,9 +4357,9 @@ var file_penumbra_core_component_governance_v1alpha1_governance_proto_goTypes = (*DelegatorVoteBody)(nil), // 9: penumbra.core.component.governance.v1alpha1.DelegatorVoteBody (*DelegatorVoteView)(nil), // 10: penumbra.core.component.governance.v1alpha1.DelegatorVoteView (*DelegatorVotePlan)(nil), // 11: penumbra.core.component.governance.v1alpha1.DelegatorVotePlan - (*DaoDeposit)(nil), // 12: penumbra.core.component.governance.v1alpha1.DaoDeposit - (*DaoSpend)(nil), // 13: penumbra.core.component.governance.v1alpha1.DaoSpend - (*DaoOutput)(nil), // 14: penumbra.core.component.governance.v1alpha1.DaoOutput + (*CommunityPoolDeposit)(nil), // 12: penumbra.core.component.governance.v1alpha1.CommunityPoolDeposit + (*CommunityPoolSpend)(nil), // 13: penumbra.core.component.governance.v1alpha1.CommunityPoolSpend + (*CommunityPoolOutput)(nil), // 14: penumbra.core.component.governance.v1alpha1.CommunityPoolOutput (*Vote)(nil), // 15: penumbra.core.component.governance.v1alpha1.Vote (*ProposalState)(nil), // 16: penumbra.core.component.governance.v1alpha1.ProposalState (*ProposalOutcome)(nil), // 17: penumbra.core.component.governance.v1alpha1.ProposalOutcome @@ -4246,117 +4398,125 @@ var file_penumbra_core_component_governance_v1alpha1_governance_proto_goTypes = (*Proposal_Signaling)(nil), // 50: penumbra.core.component.governance.v1alpha1.Proposal.Signaling (*Proposal_Emergency)(nil), // 51: penumbra.core.component.governance.v1alpha1.Proposal.Emergency (*Proposal_ParameterChange)(nil), // 52: penumbra.core.component.governance.v1alpha1.Proposal.ParameterChange - (*Proposal_DaoSpend)(nil), // 53: penumbra.core.component.governance.v1alpha1.Proposal.DaoSpend + (*Proposal_CommunityPoolSpend)(nil), // 53: penumbra.core.component.governance.v1alpha1.Proposal.CommunityPoolSpend (*Proposal_UpgradePlan)(nil), // 54: penumbra.core.component.governance.v1alpha1.Proposal.UpgradePlan - (*v1alpha1.Amount)(nil), // 55: penumbra.core.num.v1alpha1.Amount - (*v1alpha11.SpendAuthSignature)(nil), // 56: penumbra.crypto.decaf377_rdsa.v1alpha1.SpendAuthSignature - (*v1alpha12.IdentityKey)(nil), // 57: penumbra.core.keys.v1alpha1.IdentityKey - (*v1alpha12.GovernanceKey)(nil), // 58: penumbra.core.keys.v1alpha1.GovernanceKey - (*v1alpha13.Value)(nil), // 59: penumbra.core.asset.v1alpha1.Value - (*v1alpha14.Note)(nil), // 60: penumbra.core.component.shielded_pool.v1alpha1.Note - (*v1alpha12.Address)(nil), // 61: penumbra.core.keys.v1alpha1.Address - (*v1alpha15.RateData)(nil), // 62: penumbra.core.component.stake.v1alpha1.RateData - (*v1alpha16.ChainParameters)(nil), // 63: penumbra.core.component.chain.v1alpha1.ChainParameters - (*v1alpha17.DaoParameters)(nil), // 64: penumbra.core.component.dao.v1alpha1.DaoParameters - (*v1alpha18.IbcParameters)(nil), // 65: penumbra.core.component.ibc.v1alpha1.IbcParameters - (*v1alpha15.StakeParameters)(nil), // 66: penumbra.core.component.stake.v1alpha1.StakeParameters - (*v1alpha19.FeeParameters)(nil), // 67: penumbra.core.component.fee.v1alpha1.FeeParameters - (*v1alpha110.DistributionsParameters)(nil), // 68: penumbra.core.component.distributions.v1alpha1.DistributionsParameters - (*v1alpha14.NoteView)(nil), // 69: penumbra.core.component.shielded_pool.v1alpha1.NoteView - (*anypb.Any)(nil), // 70: google.protobuf.Any + (*Proposal_FreezeIbcClient)(nil), // 55: penumbra.core.component.governance.v1alpha1.Proposal.FreezeIbcClient + (*Proposal_UnfreezeIbcClient)(nil), // 56: penumbra.core.component.governance.v1alpha1.Proposal.UnfreezeIbcClient + (*v1alpha1.Amount)(nil), // 57: penumbra.core.num.v1alpha1.Amount + (*v1alpha11.SpendAuthSignature)(nil), // 58: penumbra.crypto.decaf377_rdsa.v1alpha1.SpendAuthSignature + (*v1alpha12.IdentityKey)(nil), // 59: penumbra.core.keys.v1alpha1.IdentityKey + (*v1alpha12.GovernanceKey)(nil), // 60: penumbra.core.keys.v1alpha1.GovernanceKey + (*v1alpha13.Value)(nil), // 61: penumbra.core.asset.v1alpha1.Value + (*v1alpha14.Nullifier)(nil), // 62: penumbra.core.component.sct.v1alpha1.Nullifier + (*v1alpha11.SpendVerificationKey)(nil), // 63: penumbra.crypto.decaf377_rdsa.v1alpha1.SpendVerificationKey + (*v1alpha15.Note)(nil), // 64: penumbra.core.component.shielded_pool.v1alpha1.Note + (*v1alpha12.Address)(nil), // 65: penumbra.core.keys.v1alpha1.Address + (*v1alpha16.RateData)(nil), // 66: penumbra.core.component.stake.v1alpha1.RateData + (*v1alpha17.ChainParameters)(nil), // 67: penumbra.core.component.chain.v1alpha1.ChainParameters + (*v1alpha18.CommunityPoolParameters)(nil), // 68: penumbra.core.component.community_pool.v1alpha1.CommunityPoolParameters + (*v1alpha19.IbcParameters)(nil), // 69: penumbra.core.component.ibc.v1alpha1.IbcParameters + (*v1alpha16.StakeParameters)(nil), // 70: penumbra.core.component.stake.v1alpha1.StakeParameters + (*v1alpha110.FeeParameters)(nil), // 71: penumbra.core.component.fee.v1alpha1.FeeParameters + (*v1alpha111.DistributionsParameters)(nil), // 72: penumbra.core.component.distributions.v1alpha1.DistributionsParameters + (*v1alpha15.NoteView)(nil), // 73: penumbra.core.component.shielded_pool.v1alpha1.NoteView + (*anypb.Any)(nil), // 74: google.protobuf.Any } var file_penumbra_core_component_governance_v1alpha1_governance_proto_depIdxs = []int32{ 19, // 0: penumbra.core.component.governance.v1alpha1.ProposalSubmit.proposal:type_name -> penumbra.core.component.governance.v1alpha1.Proposal - 55, // 1: penumbra.core.component.governance.v1alpha1.ProposalSubmit.deposit_amount:type_name -> penumbra.core.num.v1alpha1.Amount - 55, // 2: penumbra.core.component.governance.v1alpha1.ProposalDepositClaim.deposit_amount:type_name -> penumbra.core.num.v1alpha1.Amount + 57, // 1: penumbra.core.component.governance.v1alpha1.ProposalSubmit.deposit_amount:type_name -> penumbra.core.num.v1alpha1.Amount + 57, // 2: penumbra.core.component.governance.v1alpha1.ProposalDepositClaim.deposit_amount:type_name -> penumbra.core.num.v1alpha1.Amount 17, // 3: penumbra.core.component.governance.v1alpha1.ProposalDepositClaim.outcome:type_name -> penumbra.core.component.governance.v1alpha1.ProposalOutcome 7, // 4: penumbra.core.component.governance.v1alpha1.ValidatorVote.body:type_name -> penumbra.core.component.governance.v1alpha1.ValidatorVoteBody - 56, // 5: penumbra.core.component.governance.v1alpha1.ValidatorVote.auth_sig:type_name -> penumbra.crypto.decaf377_rdsa.v1alpha1.SpendAuthSignature + 58, // 5: penumbra.core.component.governance.v1alpha1.ValidatorVote.auth_sig:type_name -> penumbra.crypto.decaf377_rdsa.v1alpha1.SpendAuthSignature 15, // 6: penumbra.core.component.governance.v1alpha1.ValidatorVoteBody.vote:type_name -> penumbra.core.component.governance.v1alpha1.Vote - 57, // 7: penumbra.core.component.governance.v1alpha1.ValidatorVoteBody.identity_key:type_name -> penumbra.core.keys.v1alpha1.IdentityKey - 58, // 8: penumbra.core.component.governance.v1alpha1.ValidatorVoteBody.governance_key:type_name -> penumbra.core.keys.v1alpha1.GovernanceKey + 59, // 7: penumbra.core.component.governance.v1alpha1.ValidatorVoteBody.identity_key:type_name -> penumbra.core.keys.v1alpha1.IdentityKey + 60, // 8: penumbra.core.component.governance.v1alpha1.ValidatorVoteBody.governance_key:type_name -> penumbra.core.keys.v1alpha1.GovernanceKey 6, // 9: penumbra.core.component.governance.v1alpha1.ValidatorVoteBody.reason:type_name -> penumbra.core.component.governance.v1alpha1.ValidatorVoteReason 9, // 10: penumbra.core.component.governance.v1alpha1.DelegatorVote.body:type_name -> penumbra.core.component.governance.v1alpha1.DelegatorVoteBody - 56, // 11: penumbra.core.component.governance.v1alpha1.DelegatorVote.auth_sig:type_name -> penumbra.crypto.decaf377_rdsa.v1alpha1.SpendAuthSignature + 58, // 11: penumbra.core.component.governance.v1alpha1.DelegatorVote.auth_sig:type_name -> penumbra.crypto.decaf377_rdsa.v1alpha1.SpendAuthSignature 1, // 12: penumbra.core.component.governance.v1alpha1.DelegatorVote.proof:type_name -> penumbra.core.component.governance.v1alpha1.ZKDelegatorVoteProof 15, // 13: penumbra.core.component.governance.v1alpha1.DelegatorVoteBody.vote:type_name -> penumbra.core.component.governance.v1alpha1.Vote - 59, // 14: penumbra.core.component.governance.v1alpha1.DelegatorVoteBody.value:type_name -> penumbra.core.asset.v1alpha1.Value - 55, // 15: penumbra.core.component.governance.v1alpha1.DelegatorVoteBody.unbonded_amount:type_name -> penumbra.core.num.v1alpha1.Amount - 40, // 16: penumbra.core.component.governance.v1alpha1.DelegatorVoteView.visible:type_name -> penumbra.core.component.governance.v1alpha1.DelegatorVoteView.Visible - 41, // 17: penumbra.core.component.governance.v1alpha1.DelegatorVoteView.opaque:type_name -> penumbra.core.component.governance.v1alpha1.DelegatorVoteView.Opaque - 15, // 18: penumbra.core.component.governance.v1alpha1.DelegatorVotePlan.vote:type_name -> penumbra.core.component.governance.v1alpha1.Vote - 60, // 19: penumbra.core.component.governance.v1alpha1.DelegatorVotePlan.staked_note:type_name -> penumbra.core.component.shielded_pool.v1alpha1.Note - 55, // 20: penumbra.core.component.governance.v1alpha1.DelegatorVotePlan.unbonded_amount:type_name -> penumbra.core.num.v1alpha1.Amount - 59, // 21: penumbra.core.component.governance.v1alpha1.DaoDeposit.value:type_name -> penumbra.core.asset.v1alpha1.Value - 59, // 22: penumbra.core.component.governance.v1alpha1.DaoSpend.value:type_name -> penumbra.core.asset.v1alpha1.Value - 59, // 23: penumbra.core.component.governance.v1alpha1.DaoOutput.value:type_name -> penumbra.core.asset.v1alpha1.Value - 61, // 24: penumbra.core.component.governance.v1alpha1.DaoOutput.address:type_name -> penumbra.core.keys.v1alpha1.Address - 0, // 25: penumbra.core.component.governance.v1alpha1.Vote.vote:type_name -> penumbra.core.component.governance.v1alpha1.Vote.Vote - 42, // 26: penumbra.core.component.governance.v1alpha1.ProposalState.voting:type_name -> penumbra.core.component.governance.v1alpha1.ProposalState.Voting - 43, // 27: penumbra.core.component.governance.v1alpha1.ProposalState.withdrawn:type_name -> penumbra.core.component.governance.v1alpha1.ProposalState.Withdrawn - 44, // 28: penumbra.core.component.governance.v1alpha1.ProposalState.finished:type_name -> penumbra.core.component.governance.v1alpha1.ProposalState.Finished - 45, // 29: penumbra.core.component.governance.v1alpha1.ProposalState.claimed:type_name -> penumbra.core.component.governance.v1alpha1.ProposalState.Claimed - 47, // 30: penumbra.core.component.governance.v1alpha1.ProposalOutcome.passed:type_name -> penumbra.core.component.governance.v1alpha1.ProposalOutcome.Passed - 48, // 31: penumbra.core.component.governance.v1alpha1.ProposalOutcome.failed:type_name -> penumbra.core.component.governance.v1alpha1.ProposalOutcome.Failed - 49, // 32: penumbra.core.component.governance.v1alpha1.ProposalOutcome.slashed:type_name -> penumbra.core.component.governance.v1alpha1.ProposalOutcome.Slashed - 50, // 33: penumbra.core.component.governance.v1alpha1.Proposal.signaling:type_name -> penumbra.core.component.governance.v1alpha1.Proposal.Signaling - 51, // 34: penumbra.core.component.governance.v1alpha1.Proposal.emergency:type_name -> penumbra.core.component.governance.v1alpha1.Proposal.Emergency - 52, // 35: penumbra.core.component.governance.v1alpha1.Proposal.parameter_change:type_name -> penumbra.core.component.governance.v1alpha1.Proposal.ParameterChange - 53, // 36: penumbra.core.component.governance.v1alpha1.Proposal.dao_spend:type_name -> penumbra.core.component.governance.v1alpha1.Proposal.DaoSpend - 54, // 37: penumbra.core.component.governance.v1alpha1.Proposal.upgrade_plan:type_name -> penumbra.core.component.governance.v1alpha1.Proposal.UpgradePlan - 19, // 38: penumbra.core.component.governance.v1alpha1.ProposalDataResponse.proposal:type_name -> penumbra.core.component.governance.v1alpha1.Proposal - 16, // 39: penumbra.core.component.governance.v1alpha1.ProposalDataResponse.state:type_name -> penumbra.core.component.governance.v1alpha1.ProposalState - 55, // 40: penumbra.core.component.governance.v1alpha1.ProposalDataResponse.proposal_deposit_amount:type_name -> penumbra.core.num.v1alpha1.Amount - 62, // 41: penumbra.core.component.governance.v1alpha1.ProposalRateDataResponse.rate_data:type_name -> penumbra.core.component.stake.v1alpha1.RateData - 19, // 42: penumbra.core.component.governance.v1alpha1.ProposalListResponse.proposal:type_name -> penumbra.core.component.governance.v1alpha1.Proposal - 16, // 43: penumbra.core.component.governance.v1alpha1.ProposalListResponse.state:type_name -> penumbra.core.component.governance.v1alpha1.ProposalState - 15, // 44: penumbra.core.component.governance.v1alpha1.ValidatorVotesResponse.vote:type_name -> penumbra.core.component.governance.v1alpha1.Vote - 57, // 45: penumbra.core.component.governance.v1alpha1.ValidatorVotesResponse.identity_key:type_name -> penumbra.core.keys.v1alpha1.IdentityKey - 55, // 46: penumbra.core.component.governance.v1alpha1.GovernanceParameters.proposal_deposit_amount:type_name -> penumbra.core.num.v1alpha1.Amount - 30, // 47: penumbra.core.component.governance.v1alpha1.GenesisContent.governance_params:type_name -> penumbra.core.component.governance.v1alpha1.GovernanceParameters - 63, // 48: penumbra.core.component.governance.v1alpha1.ChangedAppParameters.chain_params:type_name -> penumbra.core.component.chain.v1alpha1.ChainParameters - 64, // 49: penumbra.core.component.governance.v1alpha1.ChangedAppParameters.dao_params:type_name -> penumbra.core.component.dao.v1alpha1.DaoParameters - 30, // 50: penumbra.core.component.governance.v1alpha1.ChangedAppParameters.governance_params:type_name -> penumbra.core.component.governance.v1alpha1.GovernanceParameters - 65, // 51: penumbra.core.component.governance.v1alpha1.ChangedAppParameters.ibc_params:type_name -> penumbra.core.component.ibc.v1alpha1.IbcParameters - 66, // 52: penumbra.core.component.governance.v1alpha1.ChangedAppParameters.stake_params:type_name -> penumbra.core.component.stake.v1alpha1.StakeParameters - 67, // 53: penumbra.core.component.governance.v1alpha1.ChangedAppParameters.fee_params:type_name -> penumbra.core.component.fee.v1alpha1.FeeParameters - 68, // 54: penumbra.core.component.governance.v1alpha1.ChangedAppParameters.distributions_params:type_name -> penumbra.core.component.distributions.v1alpha1.DistributionsParameters - 32, // 55: penumbra.core.component.governance.v1alpha1.ChangedAppParametersSet.old:type_name -> penumbra.core.component.governance.v1alpha1.ChangedAppParameters - 32, // 56: penumbra.core.component.governance.v1alpha1.ChangedAppParametersSet.new:type_name -> penumbra.core.component.governance.v1alpha1.ChangedAppParameters - 57, // 57: penumbra.core.component.governance.v1alpha1.VotingPowerAtProposalStartRequest.identity_key:type_name -> penumbra.core.keys.v1alpha1.IdentityKey - 18, // 58: penumbra.core.component.governance.v1alpha1.AllTalliedDelegatorVotesForProposalResponse.tally:type_name -> penumbra.core.component.governance.v1alpha1.Tally - 57, // 59: penumbra.core.component.governance.v1alpha1.AllTalliedDelegatorVotesForProposalResponse.identity_key:type_name -> penumbra.core.keys.v1alpha1.IdentityKey - 8, // 60: penumbra.core.component.governance.v1alpha1.DelegatorVoteView.Visible.delegator_vote:type_name -> penumbra.core.component.governance.v1alpha1.DelegatorVote - 69, // 61: penumbra.core.component.governance.v1alpha1.DelegatorVoteView.Visible.note:type_name -> penumbra.core.component.shielded_pool.v1alpha1.NoteView - 8, // 62: penumbra.core.component.governance.v1alpha1.DelegatorVoteView.Opaque.delegator_vote:type_name -> penumbra.core.component.governance.v1alpha1.DelegatorVote - 17, // 63: penumbra.core.component.governance.v1alpha1.ProposalState.Finished.outcome:type_name -> penumbra.core.component.governance.v1alpha1.ProposalOutcome - 17, // 64: penumbra.core.component.governance.v1alpha1.ProposalState.Claimed.outcome:type_name -> penumbra.core.component.governance.v1alpha1.ProposalOutcome - 46, // 65: penumbra.core.component.governance.v1alpha1.ProposalOutcome.Failed.withdrawn:type_name -> penumbra.core.component.governance.v1alpha1.ProposalOutcome.Withdrawn - 46, // 66: penumbra.core.component.governance.v1alpha1.ProposalOutcome.Slashed.withdrawn:type_name -> penumbra.core.component.governance.v1alpha1.ProposalOutcome.Withdrawn - 32, // 67: penumbra.core.component.governance.v1alpha1.Proposal.ParameterChange.old_parameters:type_name -> penumbra.core.component.governance.v1alpha1.ChangedAppParameters - 32, // 68: penumbra.core.component.governance.v1alpha1.Proposal.ParameterChange.new_parameters:type_name -> penumbra.core.component.governance.v1alpha1.ChangedAppParameters - 70, // 69: penumbra.core.component.governance.v1alpha1.Proposal.DaoSpend.transaction_plan:type_name -> google.protobuf.Any - 20, // 70: penumbra.core.component.governance.v1alpha1.QueryService.ProposalInfo:input_type -> penumbra.core.component.governance.v1alpha1.ProposalInfoRequest - 26, // 71: penumbra.core.component.governance.v1alpha1.QueryService.ProposalList:input_type -> penumbra.core.component.governance.v1alpha1.ProposalListRequest - 22, // 72: penumbra.core.component.governance.v1alpha1.QueryService.ProposalData:input_type -> penumbra.core.component.governance.v1alpha1.ProposalDataRequest - 38, // 73: penumbra.core.component.governance.v1alpha1.QueryService.NextProposalId:input_type -> penumbra.core.component.governance.v1alpha1.NextProposalIdRequest - 28, // 74: penumbra.core.component.governance.v1alpha1.QueryService.ValidatorVotes:input_type -> penumbra.core.component.governance.v1alpha1.ValidatorVotesRequest - 34, // 75: penumbra.core.component.governance.v1alpha1.QueryService.VotingPowerAtProposalStart:input_type -> penumbra.core.component.governance.v1alpha1.VotingPowerAtProposalStartRequest - 36, // 76: penumbra.core.component.governance.v1alpha1.QueryService.AllTalliedDelegatorVotesForProposal:input_type -> penumbra.core.component.governance.v1alpha1.AllTalliedDelegatorVotesForProposalRequest - 24, // 77: penumbra.core.component.governance.v1alpha1.QueryService.ProposalRateData:input_type -> penumbra.core.component.governance.v1alpha1.ProposalRateDataRequest - 21, // 78: penumbra.core.component.governance.v1alpha1.QueryService.ProposalInfo:output_type -> penumbra.core.component.governance.v1alpha1.ProposalInfoResponse - 27, // 79: penumbra.core.component.governance.v1alpha1.QueryService.ProposalList:output_type -> penumbra.core.component.governance.v1alpha1.ProposalListResponse - 23, // 80: penumbra.core.component.governance.v1alpha1.QueryService.ProposalData:output_type -> penumbra.core.component.governance.v1alpha1.ProposalDataResponse - 39, // 81: penumbra.core.component.governance.v1alpha1.QueryService.NextProposalId:output_type -> penumbra.core.component.governance.v1alpha1.NextProposalIdResponse - 29, // 82: penumbra.core.component.governance.v1alpha1.QueryService.ValidatorVotes:output_type -> penumbra.core.component.governance.v1alpha1.ValidatorVotesResponse - 35, // 83: penumbra.core.component.governance.v1alpha1.QueryService.VotingPowerAtProposalStart:output_type -> penumbra.core.component.governance.v1alpha1.VotingPowerAtProposalStartResponse - 37, // 84: penumbra.core.component.governance.v1alpha1.QueryService.AllTalliedDelegatorVotesForProposal:output_type -> penumbra.core.component.governance.v1alpha1.AllTalliedDelegatorVotesForProposalResponse - 25, // 85: penumbra.core.component.governance.v1alpha1.QueryService.ProposalRateData:output_type -> penumbra.core.component.governance.v1alpha1.ProposalRateDataResponse - 78, // [78:86] is the sub-list for method output_type - 70, // [70:78] is the sub-list for method input_type - 70, // [70:70] is the sub-list for extension type_name - 70, // [70:70] is the sub-list for extension extendee - 0, // [0:70] is the sub-list for field type_name + 61, // 14: penumbra.core.component.governance.v1alpha1.DelegatorVoteBody.value:type_name -> penumbra.core.asset.v1alpha1.Value + 57, // 15: penumbra.core.component.governance.v1alpha1.DelegatorVoteBody.unbonded_amount:type_name -> penumbra.core.num.v1alpha1.Amount + 62, // 16: penumbra.core.component.governance.v1alpha1.DelegatorVoteBody.nullifier:type_name -> penumbra.core.component.sct.v1alpha1.Nullifier + 63, // 17: penumbra.core.component.governance.v1alpha1.DelegatorVoteBody.rk:type_name -> penumbra.crypto.decaf377_rdsa.v1alpha1.SpendVerificationKey + 40, // 18: penumbra.core.component.governance.v1alpha1.DelegatorVoteView.visible:type_name -> penumbra.core.component.governance.v1alpha1.DelegatorVoteView.Visible + 41, // 19: penumbra.core.component.governance.v1alpha1.DelegatorVoteView.opaque:type_name -> penumbra.core.component.governance.v1alpha1.DelegatorVoteView.Opaque + 15, // 20: penumbra.core.component.governance.v1alpha1.DelegatorVotePlan.vote:type_name -> penumbra.core.component.governance.v1alpha1.Vote + 64, // 21: penumbra.core.component.governance.v1alpha1.DelegatorVotePlan.staked_note:type_name -> penumbra.core.component.shielded_pool.v1alpha1.Note + 57, // 22: penumbra.core.component.governance.v1alpha1.DelegatorVotePlan.unbonded_amount:type_name -> penumbra.core.num.v1alpha1.Amount + 61, // 23: penumbra.core.component.governance.v1alpha1.CommunityPoolDeposit.value:type_name -> penumbra.core.asset.v1alpha1.Value + 61, // 24: penumbra.core.component.governance.v1alpha1.CommunityPoolSpend.value:type_name -> penumbra.core.asset.v1alpha1.Value + 61, // 25: penumbra.core.component.governance.v1alpha1.CommunityPoolOutput.value:type_name -> penumbra.core.asset.v1alpha1.Value + 65, // 26: penumbra.core.component.governance.v1alpha1.CommunityPoolOutput.address:type_name -> penumbra.core.keys.v1alpha1.Address + 0, // 27: penumbra.core.component.governance.v1alpha1.Vote.vote:type_name -> penumbra.core.component.governance.v1alpha1.Vote.Vote + 42, // 28: penumbra.core.component.governance.v1alpha1.ProposalState.voting:type_name -> penumbra.core.component.governance.v1alpha1.ProposalState.Voting + 43, // 29: penumbra.core.component.governance.v1alpha1.ProposalState.withdrawn:type_name -> penumbra.core.component.governance.v1alpha1.ProposalState.Withdrawn + 44, // 30: penumbra.core.component.governance.v1alpha1.ProposalState.finished:type_name -> penumbra.core.component.governance.v1alpha1.ProposalState.Finished + 45, // 31: penumbra.core.component.governance.v1alpha1.ProposalState.claimed:type_name -> penumbra.core.component.governance.v1alpha1.ProposalState.Claimed + 47, // 32: penumbra.core.component.governance.v1alpha1.ProposalOutcome.passed:type_name -> penumbra.core.component.governance.v1alpha1.ProposalOutcome.Passed + 48, // 33: penumbra.core.component.governance.v1alpha1.ProposalOutcome.failed:type_name -> penumbra.core.component.governance.v1alpha1.ProposalOutcome.Failed + 49, // 34: penumbra.core.component.governance.v1alpha1.ProposalOutcome.slashed:type_name -> penumbra.core.component.governance.v1alpha1.ProposalOutcome.Slashed + 50, // 35: penumbra.core.component.governance.v1alpha1.Proposal.signaling:type_name -> penumbra.core.component.governance.v1alpha1.Proposal.Signaling + 51, // 36: penumbra.core.component.governance.v1alpha1.Proposal.emergency:type_name -> penumbra.core.component.governance.v1alpha1.Proposal.Emergency + 52, // 37: penumbra.core.component.governance.v1alpha1.Proposal.parameter_change:type_name -> penumbra.core.component.governance.v1alpha1.Proposal.ParameterChange + 53, // 38: penumbra.core.component.governance.v1alpha1.Proposal.community_pool_spend:type_name -> penumbra.core.component.governance.v1alpha1.Proposal.CommunityPoolSpend + 54, // 39: penumbra.core.component.governance.v1alpha1.Proposal.upgrade_plan:type_name -> penumbra.core.component.governance.v1alpha1.Proposal.UpgradePlan + 55, // 40: penumbra.core.component.governance.v1alpha1.Proposal.freeze_ibc_client:type_name -> penumbra.core.component.governance.v1alpha1.Proposal.FreezeIbcClient + 56, // 41: penumbra.core.component.governance.v1alpha1.Proposal.unfreeze_ibc_client:type_name -> penumbra.core.component.governance.v1alpha1.Proposal.UnfreezeIbcClient + 19, // 42: penumbra.core.component.governance.v1alpha1.ProposalDataResponse.proposal:type_name -> penumbra.core.component.governance.v1alpha1.Proposal + 16, // 43: penumbra.core.component.governance.v1alpha1.ProposalDataResponse.state:type_name -> penumbra.core.component.governance.v1alpha1.ProposalState + 57, // 44: penumbra.core.component.governance.v1alpha1.ProposalDataResponse.proposal_deposit_amount:type_name -> penumbra.core.num.v1alpha1.Amount + 66, // 45: penumbra.core.component.governance.v1alpha1.ProposalRateDataResponse.rate_data:type_name -> penumbra.core.component.stake.v1alpha1.RateData + 19, // 46: penumbra.core.component.governance.v1alpha1.ProposalListResponse.proposal:type_name -> penumbra.core.component.governance.v1alpha1.Proposal + 16, // 47: penumbra.core.component.governance.v1alpha1.ProposalListResponse.state:type_name -> penumbra.core.component.governance.v1alpha1.ProposalState + 15, // 48: penumbra.core.component.governance.v1alpha1.ValidatorVotesResponse.vote:type_name -> penumbra.core.component.governance.v1alpha1.Vote + 59, // 49: penumbra.core.component.governance.v1alpha1.ValidatorVotesResponse.identity_key:type_name -> penumbra.core.keys.v1alpha1.IdentityKey + 57, // 50: penumbra.core.component.governance.v1alpha1.GovernanceParameters.proposal_deposit_amount:type_name -> penumbra.core.num.v1alpha1.Amount + 30, // 51: penumbra.core.component.governance.v1alpha1.GenesisContent.governance_params:type_name -> penumbra.core.component.governance.v1alpha1.GovernanceParameters + 67, // 52: penumbra.core.component.governance.v1alpha1.ChangedAppParameters.chain_params:type_name -> penumbra.core.component.chain.v1alpha1.ChainParameters + 68, // 53: penumbra.core.component.governance.v1alpha1.ChangedAppParameters.community_pool_params:type_name -> penumbra.core.component.community_pool.v1alpha1.CommunityPoolParameters + 30, // 54: penumbra.core.component.governance.v1alpha1.ChangedAppParameters.governance_params:type_name -> penumbra.core.component.governance.v1alpha1.GovernanceParameters + 69, // 55: penumbra.core.component.governance.v1alpha1.ChangedAppParameters.ibc_params:type_name -> penumbra.core.component.ibc.v1alpha1.IbcParameters + 70, // 56: penumbra.core.component.governance.v1alpha1.ChangedAppParameters.stake_params:type_name -> penumbra.core.component.stake.v1alpha1.StakeParameters + 71, // 57: penumbra.core.component.governance.v1alpha1.ChangedAppParameters.fee_params:type_name -> penumbra.core.component.fee.v1alpha1.FeeParameters + 72, // 58: penumbra.core.component.governance.v1alpha1.ChangedAppParameters.distributions_params:type_name -> penumbra.core.component.distributions.v1alpha1.DistributionsParameters + 32, // 59: penumbra.core.component.governance.v1alpha1.ChangedAppParametersSet.old:type_name -> penumbra.core.component.governance.v1alpha1.ChangedAppParameters + 32, // 60: penumbra.core.component.governance.v1alpha1.ChangedAppParametersSet.new:type_name -> penumbra.core.component.governance.v1alpha1.ChangedAppParameters + 59, // 61: penumbra.core.component.governance.v1alpha1.VotingPowerAtProposalStartRequest.identity_key:type_name -> penumbra.core.keys.v1alpha1.IdentityKey + 18, // 62: penumbra.core.component.governance.v1alpha1.AllTalliedDelegatorVotesForProposalResponse.tally:type_name -> penumbra.core.component.governance.v1alpha1.Tally + 59, // 63: penumbra.core.component.governance.v1alpha1.AllTalliedDelegatorVotesForProposalResponse.identity_key:type_name -> penumbra.core.keys.v1alpha1.IdentityKey + 8, // 64: penumbra.core.component.governance.v1alpha1.DelegatorVoteView.Visible.delegator_vote:type_name -> penumbra.core.component.governance.v1alpha1.DelegatorVote + 73, // 65: penumbra.core.component.governance.v1alpha1.DelegatorVoteView.Visible.note:type_name -> penumbra.core.component.shielded_pool.v1alpha1.NoteView + 8, // 66: penumbra.core.component.governance.v1alpha1.DelegatorVoteView.Opaque.delegator_vote:type_name -> penumbra.core.component.governance.v1alpha1.DelegatorVote + 17, // 67: penumbra.core.component.governance.v1alpha1.ProposalState.Finished.outcome:type_name -> penumbra.core.component.governance.v1alpha1.ProposalOutcome + 17, // 68: penumbra.core.component.governance.v1alpha1.ProposalState.Claimed.outcome:type_name -> penumbra.core.component.governance.v1alpha1.ProposalOutcome + 46, // 69: penumbra.core.component.governance.v1alpha1.ProposalOutcome.Failed.withdrawn:type_name -> penumbra.core.component.governance.v1alpha1.ProposalOutcome.Withdrawn + 46, // 70: penumbra.core.component.governance.v1alpha1.ProposalOutcome.Slashed.withdrawn:type_name -> penumbra.core.component.governance.v1alpha1.ProposalOutcome.Withdrawn + 32, // 71: penumbra.core.component.governance.v1alpha1.Proposal.ParameterChange.old_parameters:type_name -> penumbra.core.component.governance.v1alpha1.ChangedAppParameters + 32, // 72: penumbra.core.component.governance.v1alpha1.Proposal.ParameterChange.new_parameters:type_name -> penumbra.core.component.governance.v1alpha1.ChangedAppParameters + 74, // 73: penumbra.core.component.governance.v1alpha1.Proposal.CommunityPoolSpend.transaction_plan:type_name -> google.protobuf.Any + 20, // 74: penumbra.core.component.governance.v1alpha1.QueryService.ProposalInfo:input_type -> penumbra.core.component.governance.v1alpha1.ProposalInfoRequest + 26, // 75: penumbra.core.component.governance.v1alpha1.QueryService.ProposalList:input_type -> penumbra.core.component.governance.v1alpha1.ProposalListRequest + 22, // 76: penumbra.core.component.governance.v1alpha1.QueryService.ProposalData:input_type -> penumbra.core.component.governance.v1alpha1.ProposalDataRequest + 38, // 77: penumbra.core.component.governance.v1alpha1.QueryService.NextProposalId:input_type -> penumbra.core.component.governance.v1alpha1.NextProposalIdRequest + 28, // 78: penumbra.core.component.governance.v1alpha1.QueryService.ValidatorVotes:input_type -> penumbra.core.component.governance.v1alpha1.ValidatorVotesRequest + 34, // 79: penumbra.core.component.governance.v1alpha1.QueryService.VotingPowerAtProposalStart:input_type -> penumbra.core.component.governance.v1alpha1.VotingPowerAtProposalStartRequest + 36, // 80: penumbra.core.component.governance.v1alpha1.QueryService.AllTalliedDelegatorVotesForProposal:input_type -> penumbra.core.component.governance.v1alpha1.AllTalliedDelegatorVotesForProposalRequest + 24, // 81: penumbra.core.component.governance.v1alpha1.QueryService.ProposalRateData:input_type -> penumbra.core.component.governance.v1alpha1.ProposalRateDataRequest + 21, // 82: penumbra.core.component.governance.v1alpha1.QueryService.ProposalInfo:output_type -> penumbra.core.component.governance.v1alpha1.ProposalInfoResponse + 27, // 83: penumbra.core.component.governance.v1alpha1.QueryService.ProposalList:output_type -> penumbra.core.component.governance.v1alpha1.ProposalListResponse + 23, // 84: penumbra.core.component.governance.v1alpha1.QueryService.ProposalData:output_type -> penumbra.core.component.governance.v1alpha1.ProposalDataResponse + 39, // 85: penumbra.core.component.governance.v1alpha1.QueryService.NextProposalId:output_type -> penumbra.core.component.governance.v1alpha1.NextProposalIdResponse + 29, // 86: penumbra.core.component.governance.v1alpha1.QueryService.ValidatorVotes:output_type -> penumbra.core.component.governance.v1alpha1.ValidatorVotesResponse + 35, // 87: penumbra.core.component.governance.v1alpha1.QueryService.VotingPowerAtProposalStart:output_type -> penumbra.core.component.governance.v1alpha1.VotingPowerAtProposalStartResponse + 37, // 88: penumbra.core.component.governance.v1alpha1.QueryService.AllTalliedDelegatorVotesForProposal:output_type -> penumbra.core.component.governance.v1alpha1.AllTalliedDelegatorVotesForProposalResponse + 25, // 89: penumbra.core.component.governance.v1alpha1.QueryService.ProposalRateData:output_type -> penumbra.core.component.governance.v1alpha1.ProposalRateDataResponse + 82, // [82:90] is the sub-list for method output_type + 74, // [74:82] is the sub-list for method input_type + 74, // [74:74] is the sub-list for extension type_name + 74, // [74:74] is the sub-list for extension extendee + 0, // [0:74] is the sub-list for field type_name } func init() { file_penumbra_core_component_governance_v1alpha1_governance_proto_init() } @@ -4498,7 +4658,7 @@ func file_penumbra_core_component_governance_v1alpha1_governance_proto_init() { } } file_penumbra_core_component_governance_v1alpha1_governance_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DaoDeposit); i { + switch v := v.(*CommunityPoolDeposit); i { case 0: return &v.state case 1: @@ -4510,7 +4670,7 @@ func file_penumbra_core_component_governance_v1alpha1_governance_proto_init() { } } file_penumbra_core_component_governance_v1alpha1_governance_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DaoSpend); i { + switch v := v.(*CommunityPoolSpend); i { case 0: return &v.state case 1: @@ -4522,7 +4682,7 @@ func file_penumbra_core_component_governance_v1alpha1_governance_proto_init() { } } file_penumbra_core_component_governance_v1alpha1_governance_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DaoOutput); i { + switch v := v.(*CommunityPoolOutput); i { case 0: return &v.state case 1: @@ -4990,7 +5150,7 @@ func file_penumbra_core_component_governance_v1alpha1_governance_proto_init() { } } file_penumbra_core_component_governance_v1alpha1_governance_proto_msgTypes[52].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Proposal_DaoSpend); i { + switch v := v.(*Proposal_CommunityPoolSpend); i { case 0: return &v.state case 1: @@ -5013,6 +5173,30 @@ func file_penumbra_core_component_governance_v1alpha1_governance_proto_init() { return nil } } + file_penumbra_core_component_governance_v1alpha1_governance_proto_msgTypes[54].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Proposal_FreezeIbcClient); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_penumbra_core_component_governance_v1alpha1_governance_proto_msgTypes[55].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Proposal_UnfreezeIbcClient); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } } file_penumbra_core_component_governance_v1alpha1_governance_proto_msgTypes[9].OneofWrappers = []interface{}{ (*DelegatorVoteView_Visible_)(nil), @@ -5035,7 +5219,7 @@ func file_penumbra_core_component_governance_v1alpha1_governance_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_penumbra_core_component_governance_v1alpha1_governance_proto_rawDesc, NumEnums: 1, - NumMessages: 54, + NumMessages: 56, NumExtensions: 0, NumServices: 1, }, diff --git a/proto/go/gen/penumbra/core/component/ibc/v1alpha1/ibc.pb.go b/proto/go/gen/penumbra/core/component/ibc/v1alpha1/ibc.pb.go index 1db4e7464f..3f01c9da27 100644 --- a/proto/go/gen/penumbra/core/component/ibc/v1alpha1/ibc.pb.go +++ b/proto/go/gen/penumbra/core/component/ibc/v1alpha1/ibc.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.31.0 +// protoc-gen-go v1.32.0 // protoc (unknown) // source: penumbra/core/component/ibc/v1alpha1/ibc.proto diff --git a/proto/go/gen/penumbra/core/component/sct/v1alpha1/sct.pb.go b/proto/go/gen/penumbra/core/component/sct/v1alpha1/sct.pb.go index fceeb21fcd..46e03501e9 100644 --- a/proto/go/gen/penumbra/core/component/sct/v1alpha1/sct.pb.go +++ b/proto/go/gen/penumbra/core/component/sct/v1alpha1/sct.pb.go @@ -1,13 +1,12 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.31.0 +// protoc-gen-go v1.32.0 // protoc (unknown) // source: penumbra/core/component/sct/v1alpha1/sct.proto package sctv1alpha1 import ( - _ "github.com/penumbra-zone/penumbra/proto/go/gen/penumbra/core/component/chain/v1alpha1" v1alpha1 "github.com/penumbra-zone/penumbra/proto/go/gen/penumbra/crypto/tct/v1alpha1" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" @@ -36,7 +35,7 @@ type CommitmentSource struct { // *CommitmentSource_Transaction_ // *CommitmentSource_Ics_20Transfer // *CommitmentSource_FundingStreamReward_ - // *CommitmentSource_DaoOutput_ + // *CommitmentSource_CommunityPoolOutput_ // *CommitmentSource_Genesis_ Source isCommitmentSource_Source `protobuf_oneof:"source"` } @@ -101,9 +100,9 @@ func (x *CommitmentSource) GetFundingStreamReward() *CommitmentSource_FundingStr return nil } -func (x *CommitmentSource) GetDaoOutput() *CommitmentSource_DaoOutput { - if x, ok := x.GetSource().(*CommitmentSource_DaoOutput_); ok { - return x.DaoOutput +func (x *CommitmentSource) GetCommunityPoolOutput() *CommitmentSource_CommunityPoolOutput { + if x, ok := x.GetSource().(*CommitmentSource_CommunityPoolOutput_); ok { + return x.CommunityPoolOutput } return nil } @@ -131,8 +130,8 @@ type CommitmentSource_FundingStreamReward_ struct { FundingStreamReward *CommitmentSource_FundingStreamReward `protobuf:"bytes,20,opt,name=funding_stream_reward,json=fundingStreamReward,proto3,oneof"` } -type CommitmentSource_DaoOutput_ struct { - DaoOutput *CommitmentSource_DaoOutput `protobuf:"bytes,30,opt,name=dao_output,json=daoOutput,proto3,oneof"` +type CommitmentSource_CommunityPoolOutput_ struct { + CommunityPoolOutput *CommitmentSource_CommunityPoolOutput `protobuf:"bytes,30,opt,name=community_pool_output,json=communityPoolOutput,proto3,oneof"` } type CommitmentSource_Genesis_ struct { @@ -145,7 +144,7 @@ func (*CommitmentSource_Ics_20Transfer) isCommitmentSource_Source() {} func (*CommitmentSource_FundingStreamReward_) isCommitmentSource_Source() {} -func (*CommitmentSource_DaoOutput_) isCommitmentSource_Source() {} +func (*CommitmentSource_CommunityPoolOutput_) isCommitmentSource_Source() {} func (*CommitmentSource_Genesis_) isCommitmentSource_Source() {} @@ -628,15 +627,15 @@ func (x *CommitmentSource_FundingStreamReward) GetEpochIndex() uint64 { return 0 } -// The commitment was created through a `DaoOutput` in a governance-initated transaction. -type CommitmentSource_DaoOutput struct { +// The commitment was created through a `CommunityPoolOutput` in a governance-initated transaction. +type CommitmentSource_CommunityPoolOutput struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields } -func (x *CommitmentSource_DaoOutput) Reset() { - *x = CommitmentSource_DaoOutput{} +func (x *CommitmentSource_CommunityPoolOutput) Reset() { + *x = CommitmentSource_CommunityPoolOutput{} if protoimpl.UnsafeEnabled { mi := &file_penumbra_core_component_sct_v1alpha1_sct_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -644,13 +643,13 @@ func (x *CommitmentSource_DaoOutput) Reset() { } } -func (x *CommitmentSource_DaoOutput) String() string { +func (x *CommitmentSource_CommunityPoolOutput) String() string { return protoimpl.X.MessageStringOf(x) } -func (*CommitmentSource_DaoOutput) ProtoMessage() {} +func (*CommitmentSource_CommunityPoolOutput) ProtoMessage() {} -func (x *CommitmentSource_DaoOutput) ProtoReflect() protoreflect.Message { +func (x *CommitmentSource_CommunityPoolOutput) ProtoReflect() protoreflect.Message { mi := &file_penumbra_core_component_sct_v1alpha1_sct_proto_msgTypes[10] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -662,8 +661,8 @@ func (x *CommitmentSource_DaoOutput) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use CommitmentSource_DaoOutput.ProtoReflect.Descriptor instead. -func (*CommitmentSource_DaoOutput) Descriptor() ([]byte, []int) { +// Deprecated: Use CommitmentSource_CommunityPoolOutput.ProtoReflect.Descriptor instead. +func (*CommitmentSource_CommunityPoolOutput) Descriptor() ([]byte, []int) { return file_penumbra_core_component_sct_v1alpha1_sct_proto_rawDescGZIP(), []int{0, 3} } @@ -742,123 +741,122 @@ var file_penumbra_core_component_sct_v1alpha1_sct_proto_rawDesc = []byte{ 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x73, 0x63, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x24, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x63, 0x74, 0x2e, 0x76, 0x31, - 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x1a, 0x32, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, - 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2f, - 0x63, 0x68, 0x61, 0x69, 0x6e, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x63, - 0x68, 0x61, 0x69, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x26, 0x70, 0x65, 0x6e, 0x75, - 0x6d, 0x62, 0x72, 0x61, 0x2f, 0x63, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x2f, 0x74, 0x63, 0x74, 0x2f, - 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x74, 0x63, 0x74, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x22, 0x8c, 0x06, 0x0a, 0x10, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, - 0x74, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x66, 0x0a, 0x0b, 0x74, 0x72, 0x61, 0x6e, 0x73, - 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x42, 0x2e, 0x70, - 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, - 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x63, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, - 0x68, 0x61, 0x31, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x48, 0x00, 0x52, 0x0b, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, - 0x6e, 0x0a, 0x0f, 0x69, 0x63, 0x73, 0x5f, 0x32, 0x30, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, - 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x44, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, + 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x1a, 0x26, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, + 0x2f, 0x63, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x2f, 0x74, 0x63, 0x74, 0x2f, 0x76, 0x31, 0x61, 0x6c, + 0x70, 0x68, 0x61, 0x31, 0x2f, 0x74, 0x63, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xb6, + 0x06, 0x0a, 0x10, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x12, 0x66, 0x0a, 0x0b, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x42, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x63, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x2e, 0x49, 0x63, 0x73, 0x32, 0x30, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x48, 0x00, - 0x52, 0x0d, 0x69, 0x63, 0x73, 0x32, 0x30, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x12, - 0x80, 0x01, 0x0a, 0x15, 0x66, 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x73, 0x74, 0x72, 0x65, - 0x61, 0x6d, 0x5f, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x4a, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, - 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x63, 0x74, 0x2e, 0x76, 0x31, - 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, - 0x74, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x46, 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x53, - 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x48, 0x00, 0x52, 0x13, 0x66, - 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x77, 0x61, - 0x72, 0x64, 0x12, 0x61, 0x0a, 0x0a, 0x64, 0x61, 0x6f, 0x5f, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, - 0x18, 0x1e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x40, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, - 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, - 0x2e, 0x73, 0x63, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x43, 0x6f, - 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x44, - 0x61, 0x6f, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x48, 0x00, 0x52, 0x09, 0x64, 0x61, 0x6f, 0x4f, - 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x5a, 0x0a, 0x07, 0x67, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, - 0x18, 0x28, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3e, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, - 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, - 0x2e, 0x73, 0x63, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x43, 0x6f, - 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x47, - 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x48, 0x00, 0x52, 0x07, 0x67, 0x65, 0x6e, 0x65, 0x73, 0x69, - 0x73, 0x1a, 0x09, 0x0a, 0x07, 0x47, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x1a, 0x1d, 0x0a, 0x0b, - 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x0e, 0x0a, 0x02, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x02, 0x69, 0x64, 0x1a, 0x36, 0x0a, 0x13, 0x46, - 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x77, 0x61, - 0x72, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x69, 0x6e, 0x64, 0x65, - 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x49, 0x6e, - 0x64, 0x65, 0x78, 0x1a, 0x0b, 0x0a, 0x09, 0x44, 0x61, 0x6f, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, - 0x1a, 0x65, 0x0a, 0x0d, 0x49, 0x63, 0x73, 0x32, 0x30, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, - 0x72, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x73, 0x65, 0x71, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x53, 0x65, 0x71, - 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x64, 0x12, - 0x16, 0x0a, 0x06, 0x73, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x06, 0x73, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x42, 0x08, 0x0a, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x22, 0x21, 0x0a, 0x09, 0x4e, 0x75, 0x6c, 0x6c, 0x69, 0x66, 0x69, 0x65, 0x72, 0x12, 0x14, - 0x0a, 0x05, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x69, - 0x6e, 0x6e, 0x65, 0x72, 0x22, 0x46, 0x0a, 0x11, 0x4e, 0x75, 0x6c, 0x6c, 0x69, 0x66, 0x69, 0x63, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x02, 0x69, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x70, 0x65, - 0x6e, 0x64, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, - 0x0b, 0x73, 0x70, 0x65, 0x6e, 0x64, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x22, 0xcc, 0x01, 0x0a, - 0x0f, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, - 0x12, 0x4d, 0x0a, 0x0a, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, - 0x63, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x2e, 0x74, 0x63, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, - 0x68, 0x61, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, - 0x65, 0x6e, 0x74, 0x52, 0x0a, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 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, 0x4e, 0x0a, 0x06, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x70, 0x65, + 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x0b, + 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x6e, 0x0a, 0x0f, 0x69, + 0x63, 0x73, 0x5f, 0x32, 0x30, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x44, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, + 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x73, + 0x63, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, + 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x49, 0x63, 0x73, + 0x32, 0x30, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x48, 0x00, 0x52, 0x0d, 0x69, 0x63, + 0x73, 0x32, 0x30, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x12, 0x80, 0x01, 0x0a, 0x15, + 0x66, 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5f, 0x72, + 0x65, 0x77, 0x61, 0x72, 0x64, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x4a, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x63, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x52, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x22, 0x67, 0x0a, 0x0b, 0x45, - 0x76, 0x65, 0x6e, 0x74, 0x41, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x12, 0x40, 0x0a, 0x06, 0x61, 0x6e, - 0x63, 0x68, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x70, 0x65, 0x6e, + 0x72, 0x63, 0x65, 0x2e, 0x46, 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x72, 0x65, 0x61, + 0x6d, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x48, 0x00, 0x52, 0x13, 0x66, 0x75, 0x6e, 0x64, 0x69, + 0x6e, 0x67, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x12, 0x80, + 0x01, 0x0a, 0x15, 0x63, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x74, 0x79, 0x5f, 0x70, 0x6f, 0x6f, + 0x6c, 0x5f, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x18, 0x1e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x4a, + 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, + 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x63, 0x74, 0x2e, 0x76, 0x31, 0x61, + 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, + 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x74, 0x79, + 0x50, 0x6f, 0x6f, 0x6c, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x48, 0x00, 0x52, 0x13, 0x63, 0x6f, + 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x74, 0x79, 0x50, 0x6f, 0x6f, 0x6c, 0x4f, 0x75, 0x74, 0x70, 0x75, + 0x74, 0x12, 0x5a, 0x0a, 0x07, 0x67, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x18, 0x28, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x3e, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, + 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x63, 0x74, + 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, + 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x73, + 0x69, 0x73, 0x48, 0x00, 0x52, 0x07, 0x67, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x1a, 0x09, 0x0a, + 0x07, 0x47, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x1a, 0x1d, 0x0a, 0x0b, 0x54, 0x72, 0x61, 0x6e, + 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0c, 0x52, 0x02, 0x69, 0x64, 0x1a, 0x36, 0x0a, 0x13, 0x46, 0x75, 0x6e, 0x64, 0x69, + 0x6e, 0x67, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x12, 0x1f, + 0x0a, 0x0b, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x04, 0x52, 0x0a, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x1a, + 0x15, 0x0a, 0x13, 0x43, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x74, 0x79, 0x50, 0x6f, 0x6f, 0x6c, + 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x1a, 0x65, 0x0a, 0x0d, 0x49, 0x63, 0x73, 0x32, 0x30, 0x54, + 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x61, 0x63, 0x6b, 0x65, + 0x74, 0x5f, 0x73, 0x65, 0x71, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x70, 0x61, 0x63, + 0x6b, 0x65, 0x74, 0x53, 0x65, 0x71, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, + 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x68, 0x61, 0x6e, + 0x6e, 0x65, 0x6c, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x42, 0x08, 0x0a, + 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x22, 0x21, 0x0a, 0x09, 0x4e, 0x75, 0x6c, 0x6c, 0x69, + 0x66, 0x69, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0c, 0x52, 0x05, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x22, 0x46, 0x0a, 0x11, 0x4e, 0x75, + 0x6c, 0x6c, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x12, + 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x02, 0x69, 0x64, 0x12, + 0x21, 0x0a, 0x0c, 0x73, 0x70, 0x65, 0x6e, 0x64, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x73, 0x70, 0x65, 0x6e, 0x64, 0x48, 0x65, 0x69, 0x67, + 0x68, 0x74, 0x22, 0xcc, 0x01, 0x0a, 0x0f, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6d, 0x6d, + 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x4d, 0x0a, 0x0a, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, + 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x2e, 0x74, 0x63, 0x74, - 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4d, 0x65, 0x72, 0x6b, 0x6c, 0x65, - 0x52, 0x6f, 0x6f, 0x74, 0x52, 0x06, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x12, 0x16, 0x0a, 0x06, - 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x68, 0x65, - 0x69, 0x67, 0x68, 0x74, 0x22, 0x64, 0x0a, 0x0e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x45, 0x70, 0x6f, - 0x63, 0x68, 0x52, 0x6f, 0x6f, 0x74, 0x12, 0x3c, 0x0a, 0x04, 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, - 0x63, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x2e, 0x74, 0x63, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, - 0x68, 0x61, 0x31, 0x2e, 0x4d, 0x65, 0x72, 0x6b, 0x6c, 0x65, 0x52, 0x6f, 0x6f, 0x74, 0x52, 0x04, - 0x72, 0x6f, 0x6f, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x04, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x66, 0x0a, 0x0e, 0x45, 0x76, - 0x65, 0x6e, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x6f, 0x6f, 0x74, 0x12, 0x3c, 0x0a, 0x04, + 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x43, + 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0a, 0x63, 0x6f, 0x6d, 0x6d, 0x69, + 0x74, 0x6d, 0x65, 0x6e, 0x74, 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, 0x4e, 0x0a, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x36, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, + 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x63, 0x74, 0x2e, + 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, + 0x65, 0x6e, 0x74, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x22, 0x67, 0x0a, 0x0b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x41, 0x6e, 0x63, 0x68, 0x6f, 0x72, + 0x12, 0x40, 0x0a, 0x06, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x28, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x72, 0x79, 0x70, + 0x74, 0x6f, 0x2e, 0x74, 0x63, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, + 0x4d, 0x65, 0x72, 0x6b, 0x6c, 0x65, 0x52, 0x6f, 0x6f, 0x74, 0x52, 0x06, 0x61, 0x6e, 0x63, 0x68, + 0x6f, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x04, 0x52, 0x06, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x22, 0x64, 0x0a, 0x0e, 0x45, 0x76, + 0x65, 0x6e, 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x52, 0x6f, 0x6f, 0x74, 0x12, 0x3c, 0x0a, 0x04, 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x2e, 0x74, 0x63, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4d, 0x65, 0x72, 0x6b, 0x6c, 0x65, - 0x52, 0x6f, 0x6f, 0x74, 0x52, 0x04, 0x72, 0x6f, 0x6f, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x68, 0x65, - 0x69, 0x67, 0x68, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x68, 0x65, 0x69, 0x67, - 0x68, 0x74, 0x32, 0x0e, 0x0a, 0x0c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x42, 0xca, 0x02, 0x0a, 0x28, 0x63, 0x6f, 0x6d, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, - 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, - 0x6e, 0x74, 0x2e, 0x73, 0x63, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x42, - 0x08, 0x53, 0x63, 0x74, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x5f, 0x67, 0x69, 0x74, - 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, - 0x2d, 0x7a, 0x6f, 0x6e, 0x65, 0x2f, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2f, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x6f, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x70, 0x65, 0x6e, 0x75, - 0x6d, 0x62, 0x72, 0x61, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, - 0x65, 0x6e, 0x74, 0x2f, 0x73, 0x63, 0x74, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, - 0x3b, 0x73, 0x63, 0x74, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0xa2, 0x02, 0x04, 0x50, - 0x43, 0x43, 0x53, 0xaa, 0x02, 0x24, 0x50, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x43, - 0x6f, 0x72, 0x65, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x63, - 0x74, 0x2e, 0x56, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0xca, 0x02, 0x24, 0x50, 0x65, 0x6e, - 0x75, 0x6d, 0x62, 0x72, 0x61, 0x5c, 0x43, 0x6f, 0x72, 0x65, 0x5c, 0x43, 0x6f, 0x6d, 0x70, 0x6f, - 0x6e, 0x65, 0x6e, 0x74, 0x5c, 0x53, 0x63, 0x74, 0x5c, 0x56, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, - 0x31, 0xe2, 0x02, 0x30, 0x50, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x5c, 0x43, 0x6f, 0x72, - 0x65, 0x5c, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x5c, 0x53, 0x63, 0x74, 0x5c, - 0x56, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, - 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x28, 0x50, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x3a, - 0x3a, 0x43, 0x6f, 0x72, 0x65, 0x3a, 0x3a, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, - 0x3a, 0x3a, 0x53, 0x63, 0x74, 0x3a, 0x3a, 0x56, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x62, - 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x52, 0x6f, 0x6f, 0x74, 0x52, 0x04, 0x72, 0x6f, 0x6f, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, + 0x64, 0x65, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, + 0x22, 0x66, 0x0a, 0x0e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x6f, + 0x6f, 0x74, 0x12, 0x3c, 0x0a, 0x04, 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x28, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x72, 0x79, 0x70, + 0x74, 0x6f, 0x2e, 0x74, 0x63, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, + 0x4d, 0x65, 0x72, 0x6b, 0x6c, 0x65, 0x52, 0x6f, 0x6f, 0x74, 0x52, 0x04, 0x72, 0x6f, 0x6f, 0x74, + 0x12, 0x16, 0x0a, 0x06, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, + 0x52, 0x06, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x32, 0x0e, 0x0a, 0x0c, 0x51, 0x75, 0x65, 0x72, + 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x42, 0xca, 0x02, 0x0a, 0x28, 0x63, 0x6f, 0x6d, + 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, + 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x63, 0x74, 0x2e, 0x76, 0x31, 0x61, + 0x6c, 0x70, 0x68, 0x61, 0x31, 0x42, 0x08, 0x53, 0x63, 0x74, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, + 0x01, 0x5a, 0x5f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x65, + 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2d, 0x7a, 0x6f, 0x6e, 0x65, 0x2f, 0x70, 0x65, 0x6e, 0x75, + 0x6d, 0x62, 0x72, 0x61, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x6f, 0x2f, 0x67, 0x65, + 0x6e, 0x2f, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, + 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2f, 0x73, 0x63, 0x74, 0x2f, 0x76, 0x31, + 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x3b, 0x73, 0x63, 0x74, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, + 0x61, 0x31, 0xa2, 0x02, 0x04, 0x50, 0x43, 0x43, 0x53, 0xaa, 0x02, 0x24, 0x50, 0x65, 0x6e, 0x75, + 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x43, 0x6f, 0x72, 0x65, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, + 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x63, 0x74, 0x2e, 0x56, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, + 0xca, 0x02, 0x24, 0x50, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x5c, 0x43, 0x6f, 0x72, 0x65, + 0x5c, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x5c, 0x53, 0x63, 0x74, 0x5c, 0x56, + 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0xe2, 0x02, 0x30, 0x50, 0x65, 0x6e, 0x75, 0x6d, 0x62, + 0x72, 0x61, 0x5c, 0x43, 0x6f, 0x72, 0x65, 0x5c, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, + 0x74, 0x5c, 0x53, 0x63, 0x74, 0x5c, 0x56, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x5c, 0x47, + 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x28, 0x50, 0x65, 0x6e, + 0x75, 0x6d, 0x62, 0x72, 0x61, 0x3a, 0x3a, 0x43, 0x6f, 0x72, 0x65, 0x3a, 0x3a, 0x43, 0x6f, 0x6d, + 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x3a, 0x3a, 0x53, 0x63, 0x74, 0x3a, 0x3a, 0x56, 0x31, 0x61, + 0x6c, 0x70, 0x68, 0x61, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -885,7 +883,7 @@ var file_penumbra_core_component_sct_v1alpha1_sct_proto_goTypes = []interface{}{ (*CommitmentSource_Genesis)(nil), // 7: penumbra.core.component.sct.v1alpha1.CommitmentSource.Genesis (*CommitmentSource_Transaction)(nil), // 8: penumbra.core.component.sct.v1alpha1.CommitmentSource.Transaction (*CommitmentSource_FundingStreamReward)(nil), // 9: penumbra.core.component.sct.v1alpha1.CommitmentSource.FundingStreamReward - (*CommitmentSource_DaoOutput)(nil), // 10: penumbra.core.component.sct.v1alpha1.CommitmentSource.DaoOutput + (*CommitmentSource_CommunityPoolOutput)(nil), // 10: penumbra.core.component.sct.v1alpha1.CommitmentSource.CommunityPoolOutput (*CommitmentSource_Ics20Transfer)(nil), // 11: penumbra.core.component.sct.v1alpha1.CommitmentSource.Ics20Transfer (*v1alpha1.StateCommitment)(nil), // 12: penumbra.crypto.tct.v1alpha1.StateCommitment (*v1alpha1.MerkleRoot)(nil), // 13: penumbra.crypto.tct.v1alpha1.MerkleRoot @@ -894,7 +892,7 @@ var file_penumbra_core_component_sct_v1alpha1_sct_proto_depIdxs = []int32{ 8, // 0: penumbra.core.component.sct.v1alpha1.CommitmentSource.transaction:type_name -> penumbra.core.component.sct.v1alpha1.CommitmentSource.Transaction 11, // 1: penumbra.core.component.sct.v1alpha1.CommitmentSource.ics_20_transfer:type_name -> penumbra.core.component.sct.v1alpha1.CommitmentSource.Ics20Transfer 9, // 2: penumbra.core.component.sct.v1alpha1.CommitmentSource.funding_stream_reward:type_name -> penumbra.core.component.sct.v1alpha1.CommitmentSource.FundingStreamReward - 10, // 3: penumbra.core.component.sct.v1alpha1.CommitmentSource.dao_output:type_name -> penumbra.core.component.sct.v1alpha1.CommitmentSource.DaoOutput + 10, // 3: penumbra.core.component.sct.v1alpha1.CommitmentSource.community_pool_output:type_name -> penumbra.core.component.sct.v1alpha1.CommitmentSource.CommunityPoolOutput 7, // 4: penumbra.core.component.sct.v1alpha1.CommitmentSource.genesis:type_name -> penumbra.core.component.sct.v1alpha1.CommitmentSource.Genesis 12, // 5: penumbra.core.component.sct.v1alpha1.EventCommitment.commitment:type_name -> penumbra.crypto.tct.v1alpha1.StateCommitment 0, // 6: penumbra.core.component.sct.v1alpha1.EventCommitment.source:type_name -> penumbra.core.component.sct.v1alpha1.CommitmentSource @@ -1035,7 +1033,7 @@ func file_penumbra_core_component_sct_v1alpha1_sct_proto_init() { } } file_penumbra_core_component_sct_v1alpha1_sct_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CommitmentSource_DaoOutput); i { + switch v := v.(*CommitmentSource_CommunityPoolOutput); i { case 0: return &v.state case 1: @@ -1063,7 +1061,7 @@ func file_penumbra_core_component_sct_v1alpha1_sct_proto_init() { (*CommitmentSource_Transaction_)(nil), (*CommitmentSource_Ics_20Transfer)(nil), (*CommitmentSource_FundingStreamReward_)(nil), - (*CommitmentSource_DaoOutput_)(nil), + (*CommitmentSource_CommunityPoolOutput_)(nil), (*CommitmentSource_Genesis_)(nil), } type x struct{} diff --git a/proto/go/gen/penumbra/core/component/shielded_pool/v1alpha1/shielded_pool.pb.go b/proto/go/gen/penumbra/core/component/shielded_pool/v1alpha1/shielded_pool.pb.go index 251ab2cb60..1c7712332b 100644 --- a/proto/go/gen/penumbra/core/component/shielded_pool/v1alpha1/shielded_pool.pb.go +++ b/proto/go/gen/penumbra/core/component/shielded_pool/v1alpha1/shielded_pool.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.31.0 +// protoc-gen-go v1.32.0 // protoc (unknown) // source: penumbra/core/component/shielded_pool/v1alpha1/shielded_pool.proto @@ -588,9 +588,9 @@ type SpendBody struct { // A commitment to the value of the input note. BalanceCommitment *v1alpha1.BalanceCommitment `protobuf:"bytes,1,opt,name=balance_commitment,json=balanceCommitment,proto3" json:"balance_commitment,omitempty"` // The nullifier of the input note. - Nullifier []byte `protobuf:"bytes,3,opt,name=nullifier,proto3" json:"nullifier,omitempty"` + Nullifier *v1alpha14.Nullifier `protobuf:"bytes,6,opt,name=nullifier,proto3" json:"nullifier,omitempty"` // The randomized validating key for the spend authorization signature. - Rk []byte `protobuf:"bytes,4,opt,name=rk,proto3" json:"rk,omitempty"` + Rk *v1alpha13.SpendVerificationKey `protobuf:"bytes,4,opt,name=rk,proto3" json:"rk,omitempty"` } func (x *SpendBody) Reset() { @@ -632,14 +632,14 @@ func (x *SpendBody) GetBalanceCommitment() *v1alpha1.BalanceCommitment { return nil } -func (x *SpendBody) GetNullifier() []byte { +func (x *SpendBody) GetNullifier() *v1alpha14.Nullifier { if x != nil { return x.Nullifier } return nil } -func (x *SpendBody) GetRk() []byte { +func (x *SpendBody) GetRk() *v1alpha13.SpendVerificationKey { if x != nil { return x.Rk } @@ -1575,7 +1575,10 @@ var file_penumbra_core_component_shielded_pool_v1alpha1_shielded_pool_proto_rawD 0x69, 0x65, 0x6c, 0x64, 0x65, 0x64, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x1a, 0x28, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x61, 0x73, 0x73, 0x65, 0x74, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, - 0x61, 0x31, 0x2f, 0x61, 0x73, 0x73, 0x65, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x26, + 0x61, 0x31, 0x2f, 0x61, 0x73, 0x73, 0x65, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x2e, + 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x63, 0x6f, + 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2f, 0x73, 0x63, 0x74, 0x2f, 0x76, 0x31, 0x61, 0x6c, + 0x70, 0x68, 0x61, 0x31, 0x2f, 0x73, 0x63, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x26, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x6b, 0x65, 0x79, 0x73, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x6b, 0x65, 0x79, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x24, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, @@ -1587,9 +1590,6 @@ var file_penumbra_core_component_shielded_pool_v1alpha1_shielded_pool_proto_rawD 0x73, 0x61, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x26, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2f, 0x63, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x2f, 0x74, 0x63, 0x74, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x74, 0x63, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x1a, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, - 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2f, 0x73, 0x63, 0x74, 0x2f, 0x76, 0x31, - 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x73, 0x63, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x97, 0x01, 0x0a, 0x04, 0x4e, 0x6f, 0x74, 0x65, 0x12, 0x39, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x74, 0x2e, 0x76, @@ -1664,215 +1664,222 @@ var file_penumbra_core_component_shielded_pool_v1alpha1_shielded_pool_proto_rawD 0x61, 0x2e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x2e, 0x74, 0x63, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0e, 0x6e, 0x6f, 0x74, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, - 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x99, 0x01, 0x0a, 0x09, 0x53, 0x70, 0x65, 0x6e, 0x64, 0x42, + 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x88, 0x02, 0x0a, 0x09, 0x53, 0x70, 0x65, 0x6e, 0x64, 0x42, 0x6f, 0x64, 0x79, 0x12, 0x5e, 0x0a, 0x12, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x11, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, - 0x65, 0x6e, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x75, 0x6c, 0x6c, 0x69, 0x66, 0x69, 0x65, 0x72, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x6e, 0x75, 0x6c, 0x6c, 0x69, 0x66, 0x69, 0x65, - 0x72, 0x12, 0x0e, 0x0a, 0x02, 0x72, 0x6b, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x02, 0x72, - 0x6b, 0x22, 0xd2, 0x03, 0x0a, 0x09, 0x53, 0x70, 0x65, 0x6e, 0x64, 0x56, 0x69, 0x65, 0x77, 0x12, - 0x5d, 0x0a, 0x07, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x41, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, + 0x65, 0x6e, 0x74, 0x12, 0x4d, 0x0a, 0x09, 0x6e, 0x75, 0x6c, 0x6c, 0x69, 0x66, 0x69, 0x65, 0x72, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, + 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, + 0x2e, 0x73, 0x63, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4e, 0x75, + 0x6c, 0x6c, 0x69, 0x66, 0x69, 0x65, 0x72, 0x52, 0x09, 0x6e, 0x75, 0x6c, 0x6c, 0x69, 0x66, 0x69, + 0x65, 0x72, 0x12, 0x4c, 0x0a, 0x02, 0x72, 0x6b, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3c, + 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x6f, + 0x2e, 0x64, 0x65, 0x63, 0x61, 0x66, 0x33, 0x37, 0x37, 0x5f, 0x72, 0x64, 0x73, 0x61, 0x2e, 0x76, + 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x70, 0x65, 0x6e, 0x64, 0x56, 0x65, 0x72, + 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4b, 0x65, 0x79, 0x52, 0x02, 0x72, 0x6b, + 0x22, 0xd2, 0x03, 0x0a, 0x09, 0x53, 0x70, 0x65, 0x6e, 0x64, 0x56, 0x69, 0x65, 0x77, 0x12, 0x5d, + 0x0a, 0x07, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x41, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, + 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x68, 0x69, 0x65, 0x6c, 0x64, + 0x65, 0x64, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, + 0x2e, 0x53, 0x70, 0x65, 0x6e, 0x64, 0x56, 0x69, 0x65, 0x77, 0x2e, 0x56, 0x69, 0x73, 0x69, 0x62, + 0x6c, 0x65, 0x48, 0x00, 0x52, 0x07, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x12, 0x5a, 0x0a, + 0x06, 0x6f, 0x70, 0x61, 0x71, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x40, 0x2e, + 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, + 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x68, 0x69, 0x65, 0x6c, 0x64, 0x65, 0x64, + 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, + 0x70, 0x65, 0x6e, 0x64, 0x56, 0x69, 0x65, 0x77, 0x2e, 0x4f, 0x70, 0x61, 0x71, 0x75, 0x65, 0x48, + 0x00, 0x52, 0x06, 0x6f, 0x70, 0x61, 0x71, 0x75, 0x65, 0x1a, 0xa4, 0x01, 0x0a, 0x07, 0x56, 0x69, + 0x73, 0x69, 0x62, 0x6c, 0x65, 0x12, 0x4b, 0x0a, 0x05, 0x73, 0x70, 0x65, 0x6e, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, + 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x73, + 0x68, 0x69, 0x65, 0x6c, 0x64, 0x65, 0x64, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x2e, 0x76, 0x31, 0x61, + 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x70, 0x65, 0x6e, 0x64, 0x52, 0x05, 0x73, 0x70, 0x65, + 0x6e, 0x64, 0x12, 0x4c, 0x0a, 0x04, 0x6e, 0x6f, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x38, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x68, 0x69, 0x65, 0x6c, 0x64, 0x65, 0x64, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, - 0x31, 0x2e, 0x53, 0x70, 0x65, 0x6e, 0x64, 0x56, 0x69, 0x65, 0x77, 0x2e, 0x56, 0x69, 0x73, 0x69, - 0x62, 0x6c, 0x65, 0x48, 0x00, 0x52, 0x07, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x12, 0x5a, - 0x0a, 0x06, 0x6f, 0x70, 0x61, 0x71, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x40, - 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, - 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x68, 0x69, 0x65, 0x6c, 0x64, 0x65, - 0x64, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, - 0x53, 0x70, 0x65, 0x6e, 0x64, 0x56, 0x69, 0x65, 0x77, 0x2e, 0x4f, 0x70, 0x61, 0x71, 0x75, 0x65, - 0x48, 0x00, 0x52, 0x06, 0x6f, 0x70, 0x61, 0x71, 0x75, 0x65, 0x1a, 0xa4, 0x01, 0x0a, 0x07, 0x56, - 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x12, 0x4b, 0x0a, 0x05, 0x73, 0x70, 0x65, 0x6e, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, - 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, - 0x73, 0x68, 0x69, 0x65, 0x6c, 0x64, 0x65, 0x64, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x2e, 0x76, 0x31, - 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x70, 0x65, 0x6e, 0x64, 0x52, 0x05, 0x73, 0x70, - 0x65, 0x6e, 0x64, 0x12, 0x4c, 0x0a, 0x04, 0x6e, 0x6f, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x38, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, + 0x31, 0x2e, 0x4e, 0x6f, 0x74, 0x65, 0x56, 0x69, 0x65, 0x77, 0x52, 0x04, 0x6e, 0x6f, 0x74, 0x65, + 0x1a, 0x55, 0x0a, 0x06, 0x4f, 0x70, 0x61, 0x71, 0x75, 0x65, 0x12, 0x4b, 0x0a, 0x05, 0x73, 0x70, + 0x65, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x70, 0x65, 0x6e, 0x75, + 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, + 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x68, 0x69, 0x65, 0x6c, 0x64, 0x65, 0x64, 0x5f, 0x70, 0x6f, 0x6f, + 0x6c, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x70, 0x65, 0x6e, 0x64, + 0x52, 0x05, 0x73, 0x70, 0x65, 0x6e, 0x64, 0x42, 0x0c, 0x0a, 0x0a, 0x73, 0x70, 0x65, 0x6e, 0x64, + 0x5f, 0x76, 0x69, 0x65, 0x77, 0x22, 0x8c, 0x02, 0x0a, 0x09, 0x53, 0x70, 0x65, 0x6e, 0x64, 0x50, + 0x6c, 0x61, 0x6e, 0x12, 0x48, 0x0a, 0x04, 0x6e, 0x6f, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x34, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x68, 0x69, 0x65, 0x6c, 0x64, 0x65, 0x64, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, - 0x61, 0x31, 0x2e, 0x4e, 0x6f, 0x74, 0x65, 0x56, 0x69, 0x65, 0x77, 0x52, 0x04, 0x6e, 0x6f, 0x74, - 0x65, 0x1a, 0x55, 0x0a, 0x06, 0x4f, 0x70, 0x61, 0x71, 0x75, 0x65, 0x12, 0x4b, 0x0a, 0x05, 0x73, - 0x70, 0x65, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x70, 0x65, 0x6e, - 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, - 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x68, 0x69, 0x65, 0x6c, 0x64, 0x65, 0x64, 0x5f, 0x70, 0x6f, - 0x6f, 0x6c, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x70, 0x65, 0x6e, - 0x64, 0x52, 0x05, 0x73, 0x70, 0x65, 0x6e, 0x64, 0x42, 0x0c, 0x0a, 0x0a, 0x73, 0x70, 0x65, 0x6e, - 0x64, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x22, 0x8c, 0x02, 0x0a, 0x09, 0x53, 0x70, 0x65, 0x6e, 0x64, - 0x50, 0x6c, 0x61, 0x6e, 0x12, 0x48, 0x0a, 0x04, 0x6e, 0x6f, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, - 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x68, 0x69, - 0x65, 0x6c, 0x64, 0x65, 0x64, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, - 0x68, 0x61, 0x31, 0x2e, 0x4e, 0x6f, 0x74, 0x65, 0x52, 0x04, 0x6e, 0x6f, 0x74, 0x65, 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, 0x1e, 0x0a, 0x0a, 0x72, 0x61, - 0x6e, 0x64, 0x6f, 0x6d, 0x69, 0x7a, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0a, - 0x72, 0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x69, 0x7a, 0x65, 0x72, 0x12, 0x25, 0x0a, 0x0e, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x5f, 0x62, 0x6c, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x0c, 0x52, 0x0d, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x6c, 0x69, 0x6e, 0x64, 0x69, 0x6e, - 0x67, 0x12, 0x28, 0x0a, 0x10, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x5f, 0x62, 0x6c, 0x69, 0x6e, 0x64, - 0x69, 0x6e, 0x67, 0x5f, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0e, 0x70, 0x72, 0x6f, - 0x6f, 0x66, 0x42, 0x6c, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x12, 0x28, 0x0a, 0x10, 0x70, - 0x72, 0x6f, 0x6f, 0x66, 0x5f, 0x62, 0x6c, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x73, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0e, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x42, 0x6c, 0x69, 0x6e, - 0x64, 0x69, 0x6e, 0x67, 0x53, 0x22, 0xad, 0x01, 0x0a, 0x06, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, - 0x12, 0x4e, 0x0a, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3a, + 0x61, 0x31, 0x2e, 0x4e, 0x6f, 0x74, 0x65, 0x52, 0x04, 0x6e, 0x6f, 0x74, 0x65, 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, 0x1e, 0x0a, 0x0a, 0x72, 0x61, 0x6e, + 0x64, 0x6f, 0x6d, 0x69, 0x7a, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0a, 0x72, + 0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x69, 0x7a, 0x65, 0x72, 0x12, 0x25, 0x0a, 0x0e, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x5f, 0x62, 0x6c, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x0c, 0x52, 0x0d, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x6c, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, + 0x12, 0x28, 0x0a, 0x10, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x5f, 0x62, 0x6c, 0x69, 0x6e, 0x64, 0x69, + 0x6e, 0x67, 0x5f, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0e, 0x70, 0x72, 0x6f, 0x6f, + 0x66, 0x42, 0x6c, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x12, 0x28, 0x0a, 0x10, 0x70, 0x72, + 0x6f, 0x6f, 0x66, 0x5f, 0x62, 0x6c, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x73, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0e, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x42, 0x6c, 0x69, 0x6e, 0x64, + 0x69, 0x6e, 0x67, 0x53, 0x22, 0xad, 0x01, 0x0a, 0x06, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, + 0x4e, 0x0a, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3a, 0x2e, + 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, + 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x68, 0x69, 0x65, 0x6c, 0x64, 0x65, 0x64, + 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4f, + 0x75, 0x74, 0x70, 0x75, 0x74, 0x42, 0x6f, 0x64, 0x79, 0x52, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x12, + 0x53, 0x0a, 0x05, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3d, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x68, 0x69, 0x65, 0x6c, 0x64, 0x65, 0x64, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, - 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x42, 0x6f, 0x64, 0x79, 0x52, 0x04, 0x62, 0x6f, 0x64, 0x79, - 0x12, 0x53, 0x0a, 0x05, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x3d, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, - 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x68, 0x69, 0x65, 0x6c, 0x64, - 0x65, 0x64, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, - 0x2e, 0x5a, 0x4b, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x05, - 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x22, 0x9e, 0x02, 0x0a, 0x0a, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, - 0x42, 0x6f, 0x64, 0x79, 0x12, 0x5e, 0x0a, 0x0c, 0x6e, 0x6f, 0x74, 0x65, 0x5f, 0x70, 0x61, 0x79, - 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3b, 0x2e, 0x70, 0x65, 0x6e, - 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, - 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x68, 0x69, 0x65, 0x6c, 0x64, 0x65, 0x64, 0x5f, 0x70, 0x6f, - 0x6f, 0x6c, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4e, 0x6f, 0x74, 0x65, - 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x0b, 0x6e, 0x6f, 0x74, 0x65, 0x50, 0x61, 0x79, - 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x5e, 0x0a, 0x12, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x5f, - 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x2f, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, - 0x2e, 0x61, 0x73, 0x73, 0x65, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, - 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, - 0x74, 0x52, 0x11, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, - 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x28, 0x0a, 0x10, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x64, 0x5f, - 0x6d, 0x65, 0x6d, 0x6f, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0e, - 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x64, 0x4d, 0x65, 0x6d, 0x6f, 0x4b, 0x65, 0x79, 0x12, 0x26, - 0x0a, 0x0f, 0x6f, 0x76, 0x6b, 0x5f, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x64, 0x5f, 0x6b, 0x65, - 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0d, 0x6f, 0x76, 0x6b, 0x57, 0x72, 0x61, 0x70, - 0x70, 0x65, 0x64, 0x4b, 0x65, 0x79, 0x22, 0xa6, 0x04, 0x0a, 0x0a, 0x4f, 0x75, 0x74, 0x70, 0x75, - 0x74, 0x56, 0x69, 0x65, 0x77, 0x12, 0x5e, 0x0a, 0x07, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x42, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, - 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, - 0x2e, 0x73, 0x68, 0x69, 0x65, 0x6c, 0x64, 0x65, 0x64, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x2e, 0x76, - 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x56, 0x69, - 0x65, 0x77, 0x2e, 0x56, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x48, 0x00, 0x52, 0x07, 0x76, 0x69, - 0x73, 0x69, 0x62, 0x6c, 0x65, 0x12, 0x5b, 0x0a, 0x06, 0x6f, 0x70, 0x61, 0x71, 0x75, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x41, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, + 0x5a, 0x4b, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x05, 0x70, + 0x72, 0x6f, 0x6f, 0x66, 0x22, 0x9e, 0x02, 0x0a, 0x0a, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x42, + 0x6f, 0x64, 0x79, 0x12, 0x5e, 0x0a, 0x0c, 0x6e, 0x6f, 0x74, 0x65, 0x5f, 0x70, 0x61, 0x79, 0x6c, + 0x6f, 0x61, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3b, 0x2e, 0x70, 0x65, 0x6e, 0x75, + 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, + 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x68, 0x69, 0x65, 0x6c, 0x64, 0x65, 0x64, 0x5f, 0x70, 0x6f, 0x6f, + 0x6c, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4e, 0x6f, 0x74, 0x65, 0x50, + 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x0b, 0x6e, 0x6f, 0x74, 0x65, 0x50, 0x61, 0x79, 0x6c, + 0x6f, 0x61, 0x64, 0x12, 0x5e, 0x0a, 0x12, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x63, + 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x2f, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, + 0x61, 0x73, 0x73, 0x65, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x42, + 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, + 0x52, 0x11, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, + 0x65, 0x6e, 0x74, 0x12, 0x28, 0x0a, 0x10, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x64, 0x5f, 0x6d, + 0x65, 0x6d, 0x6f, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0e, 0x77, + 0x72, 0x61, 0x70, 0x70, 0x65, 0x64, 0x4d, 0x65, 0x6d, 0x6f, 0x4b, 0x65, 0x79, 0x12, 0x26, 0x0a, + 0x0f, 0x6f, 0x76, 0x6b, 0x5f, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x64, 0x5f, 0x6b, 0x65, 0x79, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0d, 0x6f, 0x76, 0x6b, 0x57, 0x72, 0x61, 0x70, 0x70, + 0x65, 0x64, 0x4b, 0x65, 0x79, 0x22, 0xa6, 0x04, 0x0a, 0x0a, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, + 0x56, 0x69, 0x65, 0x77, 0x12, 0x5e, 0x0a, 0x07, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x42, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x68, 0x69, 0x65, 0x6c, 0x64, 0x65, 0x64, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x56, 0x69, 0x65, - 0x77, 0x2e, 0x4f, 0x70, 0x61, 0x71, 0x75, 0x65, 0x48, 0x00, 0x52, 0x06, 0x6f, 0x70, 0x61, 0x71, - 0x75, 0x65, 0x1a, 0xf1, 0x01, 0x0a, 0x07, 0x56, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x12, 0x4e, - 0x0a, 0x06, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x36, + 0x77, 0x2e, 0x56, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x48, 0x00, 0x52, 0x07, 0x76, 0x69, 0x73, + 0x69, 0x62, 0x6c, 0x65, 0x12, 0x5b, 0x0a, 0x06, 0x6f, 0x70, 0x61, 0x71, 0x75, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x41, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, + 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x73, + 0x68, 0x69, 0x65, 0x6c, 0x64, 0x65, 0x64, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x2e, 0x76, 0x31, 0x61, + 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x56, 0x69, 0x65, 0x77, + 0x2e, 0x4f, 0x70, 0x61, 0x71, 0x75, 0x65, 0x48, 0x00, 0x52, 0x06, 0x6f, 0x70, 0x61, 0x71, 0x75, + 0x65, 0x1a, 0xf1, 0x01, 0x0a, 0x07, 0x56, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x12, 0x4e, 0x0a, + 0x06, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x36, 0x2e, + 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, + 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x68, 0x69, 0x65, 0x6c, 0x64, 0x65, 0x64, + 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4f, + 0x75, 0x74, 0x70, 0x75, 0x74, 0x52, 0x06, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x4c, 0x0a, + 0x04, 0x6e, 0x6f, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x70, 0x65, + 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, + 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x68, 0x69, 0x65, 0x6c, 0x64, 0x65, 0x64, 0x5f, 0x70, + 0x6f, 0x6f, 0x6c, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4e, 0x6f, 0x74, + 0x65, 0x56, 0x69, 0x65, 0x77, 0x52, 0x04, 0x6e, 0x6f, 0x74, 0x65, 0x12, 0x48, 0x0a, 0x0b, 0x70, + 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x27, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, + 0x2e, 0x6b, 0x65, 0x79, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, + 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x4b, 0x65, 0x79, 0x52, 0x0a, 0x70, 0x61, 0x79, 0x6c, 0x6f, + 0x61, 0x64, 0x4b, 0x65, 0x79, 0x1a, 0x58, 0x0a, 0x06, 0x4f, 0x70, 0x61, 0x71, 0x75, 0x65, 0x12, + 0x4e, 0x0a, 0x06, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x36, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, + 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x68, 0x69, 0x65, 0x6c, 0x64, + 0x65, 0x64, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, + 0x2e, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x52, 0x06, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x42, + 0x0d, 0x0a, 0x0b, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x22, 0xa1, + 0x02, 0x0a, 0x0a, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x50, 0x6c, 0x61, 0x6e, 0x12, 0x39, 0x0a, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x70, + 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x73, 0x73, + 0x65, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x56, 0x61, 0x6c, 0x75, + 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x47, 0x0a, 0x0c, 0x64, 0x65, 0x73, 0x74, + 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, + 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6b, + 0x65, 0x79, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x41, 0x64, 0x64, + 0x72, 0x65, 0x73, 0x73, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, + 0x73, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x73, 0x65, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, + 0x52, 0x05, 0x72, 0x73, 0x65, 0x65, 0x64, 0x12, 0x25, 0x0a, 0x0e, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x5f, 0x62, 0x6c, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, + 0x0d, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x6c, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x12, 0x28, + 0x0a, 0x10, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x5f, 0x62, 0x6c, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, + 0x5f, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0e, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x42, + 0x6c, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x12, 0x28, 0x0a, 0x10, 0x70, 0x72, 0x6f, 0x6f, + 0x66, 0x5f, 0x62, 0x6c, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x73, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x0c, 0x52, 0x0e, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x42, 0x6c, 0x69, 0x6e, 0x64, 0x69, 0x6e, + 0x67, 0x53, 0x22, 0x77, 0x0a, 0x18, 0x44, 0x65, 0x6e, 0x6f, 0x6d, 0x4d, 0x65, 0x74, 0x61, 0x64, + 0x61, 0x74, 0x61, 0x42, 0x79, 0x49, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 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, 0x12, 0x40, 0x0a, 0x08, 0x61, 0x73, 0x73, + 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x70, 0x65, + 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x73, 0x73, 0x65, + 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, + 0x49, 0x64, 0x52, 0x07, 0x61, 0x73, 0x73, 0x65, 0x74, 0x49, 0x64, 0x22, 0x6f, 0x0a, 0x19, 0x44, + 0x65, 0x6e, 0x6f, 0x6d, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x42, 0x79, 0x49, 0x64, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x52, 0x0a, 0x0e, 0x64, 0x65, 0x6e, 0x6f, + 0x6d, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x2b, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, + 0x2e, 0x61, 0x73, 0x73, 0x65, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, + 0x44, 0x65, 0x6e, 0x6f, 0x6d, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x0d, 0x64, + 0x65, 0x6e, 0x6f, 0x6d, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x22, 0x9e, 0x02, 0x0a, + 0x0e, 0x47, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, + 0x6b, 0x0a, 0x0b, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x49, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, + 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x73, + 0x68, 0x69, 0x65, 0x6c, 0x64, 0x65, 0x64, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x2e, 0x76, 0x31, 0x61, + 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x43, 0x6f, 0x6e, + 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x41, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x0b, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x9e, 0x01, 0x0a, + 0x0a, 0x41, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x06, 0x61, + 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x70, 0x65, + 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6e, 0x75, 0x6d, 0x2e, + 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x52, + 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x64, 0x65, 0x6e, 0x6f, 0x6d, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x64, 0x65, 0x6e, 0x6f, 0x6d, 0x12, 0x3e, 0x0a, + 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, + 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6b, + 0x65, 0x79, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x41, 0x64, 0x64, + 0x72, 0x65, 0x73, 0x73, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x32, 0xb9, 0x01, + 0x0a, 0x0c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0xa8, + 0x01, 0x0a, 0x11, 0x44, 0x65, 0x6e, 0x6f, 0x6d, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, + 0x42, 0x79, 0x49, 0x64, 0x12, 0x48, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, + 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x73, + 0x68, 0x69, 0x65, 0x6c, 0x64, 0x65, 0x64, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x2e, 0x76, 0x31, 0x61, + 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, 0x65, 0x6e, 0x6f, 0x6d, 0x4d, 0x65, 0x74, 0x61, 0x64, + 0x61, 0x74, 0x61, 0x42, 0x79, 0x49, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x49, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x68, 0x69, 0x65, 0x6c, 0x64, 0x65, 0x64, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, - 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x52, 0x06, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x4c, - 0x0a, 0x04, 0x6e, 0x6f, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x70, - 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, - 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x68, 0x69, 0x65, 0x6c, 0x64, 0x65, 0x64, 0x5f, - 0x70, 0x6f, 0x6f, 0x6c, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4e, 0x6f, - 0x74, 0x65, 0x56, 0x69, 0x65, 0x77, 0x52, 0x04, 0x6e, 0x6f, 0x74, 0x65, 0x12, 0x48, 0x0a, 0x0b, - 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x27, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, - 0x65, 0x2e, 0x6b, 0x65, 0x79, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, - 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x4b, 0x65, 0x79, 0x52, 0x0a, 0x70, 0x61, 0x79, 0x6c, - 0x6f, 0x61, 0x64, 0x4b, 0x65, 0x79, 0x1a, 0x58, 0x0a, 0x06, 0x4f, 0x70, 0x61, 0x71, 0x75, 0x65, - 0x12, 0x4e, 0x0a, 0x06, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x36, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, - 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x68, 0x69, 0x65, 0x6c, - 0x64, 0x65, 0x64, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, - 0x31, 0x2e, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x52, 0x06, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, - 0x42, 0x0d, 0x0a, 0x0b, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x22, - 0xa1, 0x02, 0x0a, 0x0a, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x50, 0x6c, 0x61, 0x6e, 0x12, 0x39, - 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, - 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x73, - 0x73, 0x65, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x56, 0x61, 0x6c, - 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x47, 0x0a, 0x0c, 0x64, 0x65, 0x73, - 0x74, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x24, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, - 0x6b, 0x65, 0x79, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x41, 0x64, - 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, - 0x73, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x73, 0x65, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x0c, 0x52, 0x05, 0x72, 0x73, 0x65, 0x65, 0x64, 0x12, 0x25, 0x0a, 0x0e, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x5f, 0x62, 0x6c, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, - 0x52, 0x0d, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x6c, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x12, - 0x28, 0x0a, 0x10, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x5f, 0x62, 0x6c, 0x69, 0x6e, 0x64, 0x69, 0x6e, - 0x67, 0x5f, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0e, 0x70, 0x72, 0x6f, 0x6f, 0x66, - 0x42, 0x6c, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x12, 0x28, 0x0a, 0x10, 0x70, 0x72, 0x6f, - 0x6f, 0x66, 0x5f, 0x62, 0x6c, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x73, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x0c, 0x52, 0x0e, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x42, 0x6c, 0x69, 0x6e, 0x64, 0x69, - 0x6e, 0x67, 0x53, 0x22, 0x77, 0x0a, 0x18, 0x44, 0x65, 0x6e, 0x6f, 0x6d, 0x4d, 0x65, 0x74, 0x61, - 0x64, 0x61, 0x74, 0x61, 0x42, 0x79, 0x49, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 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, 0x12, 0x40, 0x0a, 0x08, 0x61, 0x73, - 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x70, - 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x73, 0x73, - 0x65, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x41, 0x73, 0x73, 0x65, - 0x74, 0x49, 0x64, 0x52, 0x07, 0x61, 0x73, 0x73, 0x65, 0x74, 0x49, 0x64, 0x22, 0x6f, 0x0a, 0x19, 0x44, 0x65, 0x6e, 0x6f, 0x6d, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x42, 0x79, 0x49, - 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x52, 0x0a, 0x0e, 0x64, 0x65, 0x6e, - 0x6f, 0x6d, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x2b, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, - 0x65, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, - 0x2e, 0x44, 0x65, 0x6e, 0x6f, 0x6d, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x0d, - 0x64, 0x65, 0x6e, 0x6f, 0x6d, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x22, 0x9e, 0x02, - 0x0a, 0x0e, 0x47, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, - 0x12, 0x6b, 0x0a, 0x0b, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, - 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x49, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, - 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, - 0x73, 0x68, 0x69, 0x65, 0x6c, 0x64, 0x65, 0x64, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x2e, 0x76, 0x31, - 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x43, 0x6f, - 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x41, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x52, 0x0b, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x9e, 0x01, - 0x0a, 0x0a, 0x41, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x06, - 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x70, - 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6e, 0x75, 0x6d, - 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, - 0x52, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x64, 0x65, 0x6e, 0x6f, - 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x64, 0x65, 0x6e, 0x6f, 0x6d, 0x12, 0x3e, - 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x24, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, - 0x6b, 0x65, 0x79, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x41, 0x64, - 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x32, 0xb9, - 0x01, 0x0a, 0x0c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, - 0xa8, 0x01, 0x0a, 0x11, 0x44, 0x65, 0x6e, 0x6f, 0x6d, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, - 0x61, 0x42, 0x79, 0x49, 0x64, 0x12, 0x48, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, - 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, - 0x73, 0x68, 0x69, 0x65, 0x6c, 0x64, 0x65, 0x64, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x2e, 0x76, 0x31, - 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, 0x65, 0x6e, 0x6f, 0x6d, 0x4d, 0x65, 0x74, 0x61, - 0x64, 0x61, 0x74, 0x61, 0x42, 0x79, 0x49, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x49, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, + 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x95, 0x03, 0x0a, 0x32, 0x63, 0x6f, + 0x6d, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x68, 0x69, 0x65, 0x6c, 0x64, 0x65, 0x64, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, - 0x2e, 0x44, 0x65, 0x6e, 0x6f, 0x6d, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x42, 0x79, - 0x49, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x95, 0x03, 0x0a, 0x32, 0x63, - 0x6f, 0x6d, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, - 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x68, 0x69, 0x65, 0x6c, - 0x64, 0x65, 0x64, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, - 0x31, 0x42, 0x11, 0x53, 0x68, 0x69, 0x65, 0x6c, 0x64, 0x65, 0x64, 0x50, 0x6f, 0x6f, 0x6c, 0x50, - 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x73, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, - 0x6f, 0x6d, 0x2f, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2d, 0x7a, 0x6f, 0x6e, 0x65, - 0x2f, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, - 0x67, 0x6f, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2f, - 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2f, 0x73, - 0x68, 0x69, 0x65, 0x6c, 0x64, 0x65, 0x64, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x2f, 0x76, 0x31, 0x61, - 0x6c, 0x70, 0x68, 0x61, 0x31, 0x3b, 0x73, 0x68, 0x69, 0x65, 0x6c, 0x64, 0x65, 0x64, 0x5f, 0x70, - 0x6f, 0x6f, 0x6c, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0xa2, 0x02, 0x04, 0x50, 0x43, - 0x43, 0x53, 0xaa, 0x02, 0x2d, 0x50, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x43, 0x6f, - 0x72, 0x65, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x68, 0x69, - 0x65, 0x6c, 0x64, 0x65, 0x64, 0x50, 0x6f, 0x6f, 0x6c, 0x2e, 0x56, 0x31, 0x61, 0x6c, 0x70, 0x68, - 0x61, 0x31, 0xca, 0x02, 0x2d, 0x50, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x5c, 0x43, 0x6f, - 0x72, 0x65, 0x5c, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x5c, 0x53, 0x68, 0x69, - 0x65, 0x6c, 0x64, 0x65, 0x64, 0x50, 0x6f, 0x6f, 0x6c, 0x5c, 0x56, 0x31, 0x61, 0x6c, 0x70, 0x68, - 0x61, 0x31, 0xe2, 0x02, 0x39, 0x50, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x5c, 0x43, 0x6f, - 0x72, 0x65, 0x5c, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x5c, 0x53, 0x68, 0x69, - 0x65, 0x6c, 0x64, 0x65, 0x64, 0x50, 0x6f, 0x6f, 0x6c, 0x5c, 0x56, 0x31, 0x61, 0x6c, 0x70, 0x68, - 0x61, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, - 0x31, 0x50, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x3a, 0x3a, 0x43, 0x6f, 0x72, 0x65, 0x3a, - 0x3a, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x3a, 0x3a, 0x53, 0x68, 0x69, 0x65, - 0x6c, 0x64, 0x65, 0x64, 0x50, 0x6f, 0x6f, 0x6c, 0x3a, 0x3a, 0x56, 0x31, 0x61, 0x6c, 0x70, 0x68, - 0x61, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x42, 0x11, 0x53, 0x68, 0x69, 0x65, 0x6c, 0x64, 0x65, 0x64, 0x50, 0x6f, 0x6f, 0x6c, 0x50, 0x72, + 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x73, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, + 0x6d, 0x2f, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2d, 0x7a, 0x6f, 0x6e, 0x65, 0x2f, + 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, + 0x6f, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2f, 0x63, + 0x6f, 0x72, 0x65, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2f, 0x73, 0x68, + 0x69, 0x65, 0x6c, 0x64, 0x65, 0x64, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x2f, 0x76, 0x31, 0x61, 0x6c, + 0x70, 0x68, 0x61, 0x31, 0x3b, 0x73, 0x68, 0x69, 0x65, 0x6c, 0x64, 0x65, 0x64, 0x5f, 0x70, 0x6f, + 0x6f, 0x6c, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0xa2, 0x02, 0x04, 0x50, 0x43, 0x43, + 0x53, 0xaa, 0x02, 0x2d, 0x50, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x43, 0x6f, 0x72, + 0x65, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x68, 0x69, 0x65, + 0x6c, 0x64, 0x65, 0x64, 0x50, 0x6f, 0x6f, 0x6c, 0x2e, 0x56, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, + 0x31, 0xca, 0x02, 0x2d, 0x50, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x5c, 0x43, 0x6f, 0x72, + 0x65, 0x5c, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x5c, 0x53, 0x68, 0x69, 0x65, + 0x6c, 0x64, 0x65, 0x64, 0x50, 0x6f, 0x6f, 0x6c, 0x5c, 0x56, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, + 0x31, 0xe2, 0x02, 0x39, 0x50, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x5c, 0x43, 0x6f, 0x72, + 0x65, 0x5c, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x5c, 0x53, 0x68, 0x69, 0x65, + 0x6c, 0x64, 0x65, 0x64, 0x50, 0x6f, 0x6f, 0x6c, 0x5c, 0x56, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, + 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x31, + 0x50, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x3a, 0x3a, 0x43, 0x6f, 0x72, 0x65, 0x3a, 0x3a, + 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x3a, 0x3a, 0x53, 0x68, 0x69, 0x65, 0x6c, + 0x64, 0x65, 0x64, 0x50, 0x6f, 0x6f, 0x6c, 0x3a, 0x3a, 0x56, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, + 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -1889,43 +1896,44 @@ func file_penumbra_core_component_shielded_pool_v1alpha1_shielded_pool_proto_raw var file_penumbra_core_component_shielded_pool_v1alpha1_shielded_pool_proto_msgTypes = make([]protoimpl.MessageInfo, 25) var file_penumbra_core_component_shielded_pool_v1alpha1_shielded_pool_proto_goTypes = []interface{}{ - (*Note)(nil), // 0: penumbra.core.component.shielded_pool.v1alpha1.Note - (*NoteView)(nil), // 1: penumbra.core.component.shielded_pool.v1alpha1.NoteView - (*NoteCiphertext)(nil), // 2: penumbra.core.component.shielded_pool.v1alpha1.NoteCiphertext - (*NotePayload)(nil), // 3: penumbra.core.component.shielded_pool.v1alpha1.NotePayload - (*ZKOutputProof)(nil), // 4: penumbra.core.component.shielded_pool.v1alpha1.ZKOutputProof - (*ZKSpendProof)(nil), // 5: penumbra.core.component.shielded_pool.v1alpha1.ZKSpendProof - (*ZKNullifierDerivationProof)(nil), // 6: penumbra.core.component.shielded_pool.v1alpha1.ZKNullifierDerivationProof - (*Spend)(nil), // 7: penumbra.core.component.shielded_pool.v1alpha1.Spend - (*EventSpend)(nil), // 8: penumbra.core.component.shielded_pool.v1alpha1.EventSpend - (*EventOutput)(nil), // 9: penumbra.core.component.shielded_pool.v1alpha1.EventOutput - (*SpendBody)(nil), // 10: penumbra.core.component.shielded_pool.v1alpha1.SpendBody - (*SpendView)(nil), // 11: penumbra.core.component.shielded_pool.v1alpha1.SpendView - (*SpendPlan)(nil), // 12: penumbra.core.component.shielded_pool.v1alpha1.SpendPlan - (*Output)(nil), // 13: penumbra.core.component.shielded_pool.v1alpha1.Output - (*OutputBody)(nil), // 14: penumbra.core.component.shielded_pool.v1alpha1.OutputBody - (*OutputView)(nil), // 15: penumbra.core.component.shielded_pool.v1alpha1.OutputView - (*OutputPlan)(nil), // 16: penumbra.core.component.shielded_pool.v1alpha1.OutputPlan - (*DenomMetadataByIdRequest)(nil), // 17: penumbra.core.component.shielded_pool.v1alpha1.DenomMetadataByIdRequest - (*DenomMetadataByIdResponse)(nil), // 18: penumbra.core.component.shielded_pool.v1alpha1.DenomMetadataByIdResponse - (*GenesisContent)(nil), // 19: penumbra.core.component.shielded_pool.v1alpha1.GenesisContent - (*SpendView_Visible)(nil), // 20: penumbra.core.component.shielded_pool.v1alpha1.SpendView.Visible - (*SpendView_Opaque)(nil), // 21: penumbra.core.component.shielded_pool.v1alpha1.SpendView.Opaque - (*OutputView_Visible)(nil), // 22: penumbra.core.component.shielded_pool.v1alpha1.OutputView.Visible - (*OutputView_Opaque)(nil), // 23: penumbra.core.component.shielded_pool.v1alpha1.OutputView.Opaque - (*GenesisContent_Allocation)(nil), // 24: penumbra.core.component.shielded_pool.v1alpha1.GenesisContent.Allocation - (*v1alpha1.Value)(nil), // 25: penumbra.core.asset.v1alpha1.Value - (*v1alpha11.Address)(nil), // 26: penumbra.core.keys.v1alpha1.Address - (*v1alpha1.ValueView)(nil), // 27: penumbra.core.asset.v1alpha1.ValueView - (*v1alpha11.AddressView)(nil), // 28: penumbra.core.keys.v1alpha1.AddressView - (*v1alpha12.StateCommitment)(nil), // 29: penumbra.crypto.tct.v1alpha1.StateCommitment - (*v1alpha13.SpendAuthSignature)(nil), // 30: penumbra.crypto.decaf377_rdsa.v1alpha1.SpendAuthSignature - (*v1alpha14.Nullifier)(nil), // 31: penumbra.core.component.sct.v1alpha1.Nullifier - (*v1alpha1.BalanceCommitment)(nil), // 32: penumbra.core.asset.v1alpha1.BalanceCommitment - (*v1alpha1.AssetId)(nil), // 33: penumbra.core.asset.v1alpha1.AssetId - (*v1alpha1.DenomMetadata)(nil), // 34: penumbra.core.asset.v1alpha1.DenomMetadata - (*v1alpha11.PayloadKey)(nil), // 35: penumbra.core.keys.v1alpha1.PayloadKey - (*v1alpha15.Amount)(nil), // 36: penumbra.core.num.v1alpha1.Amount + (*Note)(nil), // 0: penumbra.core.component.shielded_pool.v1alpha1.Note + (*NoteView)(nil), // 1: penumbra.core.component.shielded_pool.v1alpha1.NoteView + (*NoteCiphertext)(nil), // 2: penumbra.core.component.shielded_pool.v1alpha1.NoteCiphertext + (*NotePayload)(nil), // 3: penumbra.core.component.shielded_pool.v1alpha1.NotePayload + (*ZKOutputProof)(nil), // 4: penumbra.core.component.shielded_pool.v1alpha1.ZKOutputProof + (*ZKSpendProof)(nil), // 5: penumbra.core.component.shielded_pool.v1alpha1.ZKSpendProof + (*ZKNullifierDerivationProof)(nil), // 6: penumbra.core.component.shielded_pool.v1alpha1.ZKNullifierDerivationProof + (*Spend)(nil), // 7: penumbra.core.component.shielded_pool.v1alpha1.Spend + (*EventSpend)(nil), // 8: penumbra.core.component.shielded_pool.v1alpha1.EventSpend + (*EventOutput)(nil), // 9: penumbra.core.component.shielded_pool.v1alpha1.EventOutput + (*SpendBody)(nil), // 10: penumbra.core.component.shielded_pool.v1alpha1.SpendBody + (*SpendView)(nil), // 11: penumbra.core.component.shielded_pool.v1alpha1.SpendView + (*SpendPlan)(nil), // 12: penumbra.core.component.shielded_pool.v1alpha1.SpendPlan + (*Output)(nil), // 13: penumbra.core.component.shielded_pool.v1alpha1.Output + (*OutputBody)(nil), // 14: penumbra.core.component.shielded_pool.v1alpha1.OutputBody + (*OutputView)(nil), // 15: penumbra.core.component.shielded_pool.v1alpha1.OutputView + (*OutputPlan)(nil), // 16: penumbra.core.component.shielded_pool.v1alpha1.OutputPlan + (*DenomMetadataByIdRequest)(nil), // 17: penumbra.core.component.shielded_pool.v1alpha1.DenomMetadataByIdRequest + (*DenomMetadataByIdResponse)(nil), // 18: penumbra.core.component.shielded_pool.v1alpha1.DenomMetadataByIdResponse + (*GenesisContent)(nil), // 19: penumbra.core.component.shielded_pool.v1alpha1.GenesisContent + (*SpendView_Visible)(nil), // 20: penumbra.core.component.shielded_pool.v1alpha1.SpendView.Visible + (*SpendView_Opaque)(nil), // 21: penumbra.core.component.shielded_pool.v1alpha1.SpendView.Opaque + (*OutputView_Visible)(nil), // 22: penumbra.core.component.shielded_pool.v1alpha1.OutputView.Visible + (*OutputView_Opaque)(nil), // 23: penumbra.core.component.shielded_pool.v1alpha1.OutputView.Opaque + (*GenesisContent_Allocation)(nil), // 24: penumbra.core.component.shielded_pool.v1alpha1.GenesisContent.Allocation + (*v1alpha1.Value)(nil), // 25: penumbra.core.asset.v1alpha1.Value + (*v1alpha11.Address)(nil), // 26: penumbra.core.keys.v1alpha1.Address + (*v1alpha1.ValueView)(nil), // 27: penumbra.core.asset.v1alpha1.ValueView + (*v1alpha11.AddressView)(nil), // 28: penumbra.core.keys.v1alpha1.AddressView + (*v1alpha12.StateCommitment)(nil), // 29: penumbra.crypto.tct.v1alpha1.StateCommitment + (*v1alpha13.SpendAuthSignature)(nil), // 30: penumbra.crypto.decaf377_rdsa.v1alpha1.SpendAuthSignature + (*v1alpha14.Nullifier)(nil), // 31: penumbra.core.component.sct.v1alpha1.Nullifier + (*v1alpha1.BalanceCommitment)(nil), // 32: penumbra.core.asset.v1alpha1.BalanceCommitment + (*v1alpha13.SpendVerificationKey)(nil), // 33: penumbra.crypto.decaf377_rdsa.v1alpha1.SpendVerificationKey + (*v1alpha1.AssetId)(nil), // 34: penumbra.core.asset.v1alpha1.AssetId + (*v1alpha1.DenomMetadata)(nil), // 35: penumbra.core.asset.v1alpha1.DenomMetadata + (*v1alpha11.PayloadKey)(nil), // 36: penumbra.core.keys.v1alpha1.PayloadKey + (*v1alpha15.Amount)(nil), // 37: penumbra.core.num.v1alpha1.Amount } var file_penumbra_core_component_shielded_pool_v1alpha1_shielded_pool_proto_depIdxs = []int32{ 25, // 0: penumbra.core.component.shielded_pool.v1alpha1.Note.value:type_name -> penumbra.core.asset.v1alpha1.Value @@ -1940,36 +1948,38 @@ var file_penumbra_core_component_shielded_pool_v1alpha1_shielded_pool_proto_depI 31, // 9: penumbra.core.component.shielded_pool.v1alpha1.EventSpend.nullifier:type_name -> penumbra.core.component.sct.v1alpha1.Nullifier 29, // 10: penumbra.core.component.shielded_pool.v1alpha1.EventOutput.note_commitment:type_name -> penumbra.crypto.tct.v1alpha1.StateCommitment 32, // 11: penumbra.core.component.shielded_pool.v1alpha1.SpendBody.balance_commitment:type_name -> penumbra.core.asset.v1alpha1.BalanceCommitment - 20, // 12: penumbra.core.component.shielded_pool.v1alpha1.SpendView.visible:type_name -> penumbra.core.component.shielded_pool.v1alpha1.SpendView.Visible - 21, // 13: penumbra.core.component.shielded_pool.v1alpha1.SpendView.opaque:type_name -> penumbra.core.component.shielded_pool.v1alpha1.SpendView.Opaque - 0, // 14: penumbra.core.component.shielded_pool.v1alpha1.SpendPlan.note:type_name -> penumbra.core.component.shielded_pool.v1alpha1.Note - 14, // 15: penumbra.core.component.shielded_pool.v1alpha1.Output.body:type_name -> penumbra.core.component.shielded_pool.v1alpha1.OutputBody - 4, // 16: penumbra.core.component.shielded_pool.v1alpha1.Output.proof:type_name -> penumbra.core.component.shielded_pool.v1alpha1.ZKOutputProof - 3, // 17: penumbra.core.component.shielded_pool.v1alpha1.OutputBody.note_payload:type_name -> penumbra.core.component.shielded_pool.v1alpha1.NotePayload - 32, // 18: penumbra.core.component.shielded_pool.v1alpha1.OutputBody.balance_commitment:type_name -> penumbra.core.asset.v1alpha1.BalanceCommitment - 22, // 19: penumbra.core.component.shielded_pool.v1alpha1.OutputView.visible:type_name -> penumbra.core.component.shielded_pool.v1alpha1.OutputView.Visible - 23, // 20: penumbra.core.component.shielded_pool.v1alpha1.OutputView.opaque:type_name -> penumbra.core.component.shielded_pool.v1alpha1.OutputView.Opaque - 25, // 21: penumbra.core.component.shielded_pool.v1alpha1.OutputPlan.value:type_name -> penumbra.core.asset.v1alpha1.Value - 26, // 22: penumbra.core.component.shielded_pool.v1alpha1.OutputPlan.dest_address:type_name -> penumbra.core.keys.v1alpha1.Address - 33, // 23: penumbra.core.component.shielded_pool.v1alpha1.DenomMetadataByIdRequest.asset_id:type_name -> penumbra.core.asset.v1alpha1.AssetId - 34, // 24: penumbra.core.component.shielded_pool.v1alpha1.DenomMetadataByIdResponse.denom_metadata:type_name -> penumbra.core.asset.v1alpha1.DenomMetadata - 24, // 25: penumbra.core.component.shielded_pool.v1alpha1.GenesisContent.allocations:type_name -> penumbra.core.component.shielded_pool.v1alpha1.GenesisContent.Allocation - 7, // 26: penumbra.core.component.shielded_pool.v1alpha1.SpendView.Visible.spend:type_name -> penumbra.core.component.shielded_pool.v1alpha1.Spend - 1, // 27: penumbra.core.component.shielded_pool.v1alpha1.SpendView.Visible.note:type_name -> penumbra.core.component.shielded_pool.v1alpha1.NoteView - 7, // 28: penumbra.core.component.shielded_pool.v1alpha1.SpendView.Opaque.spend:type_name -> penumbra.core.component.shielded_pool.v1alpha1.Spend - 13, // 29: penumbra.core.component.shielded_pool.v1alpha1.OutputView.Visible.output:type_name -> penumbra.core.component.shielded_pool.v1alpha1.Output - 1, // 30: penumbra.core.component.shielded_pool.v1alpha1.OutputView.Visible.note:type_name -> penumbra.core.component.shielded_pool.v1alpha1.NoteView - 35, // 31: penumbra.core.component.shielded_pool.v1alpha1.OutputView.Visible.payload_key:type_name -> penumbra.core.keys.v1alpha1.PayloadKey - 13, // 32: penumbra.core.component.shielded_pool.v1alpha1.OutputView.Opaque.output:type_name -> penumbra.core.component.shielded_pool.v1alpha1.Output - 36, // 33: penumbra.core.component.shielded_pool.v1alpha1.GenesisContent.Allocation.amount:type_name -> penumbra.core.num.v1alpha1.Amount - 26, // 34: penumbra.core.component.shielded_pool.v1alpha1.GenesisContent.Allocation.address:type_name -> penumbra.core.keys.v1alpha1.Address - 17, // 35: penumbra.core.component.shielded_pool.v1alpha1.QueryService.DenomMetadataById:input_type -> penumbra.core.component.shielded_pool.v1alpha1.DenomMetadataByIdRequest - 18, // 36: penumbra.core.component.shielded_pool.v1alpha1.QueryService.DenomMetadataById:output_type -> penumbra.core.component.shielded_pool.v1alpha1.DenomMetadataByIdResponse - 36, // [36:37] is the sub-list for method output_type - 35, // [35:36] is the sub-list for method input_type - 35, // [35:35] is the sub-list for extension type_name - 35, // [35:35] is the sub-list for extension extendee - 0, // [0:35] is the sub-list for field type_name + 31, // 12: penumbra.core.component.shielded_pool.v1alpha1.SpendBody.nullifier:type_name -> penumbra.core.component.sct.v1alpha1.Nullifier + 33, // 13: penumbra.core.component.shielded_pool.v1alpha1.SpendBody.rk:type_name -> penumbra.crypto.decaf377_rdsa.v1alpha1.SpendVerificationKey + 20, // 14: penumbra.core.component.shielded_pool.v1alpha1.SpendView.visible:type_name -> penumbra.core.component.shielded_pool.v1alpha1.SpendView.Visible + 21, // 15: penumbra.core.component.shielded_pool.v1alpha1.SpendView.opaque:type_name -> penumbra.core.component.shielded_pool.v1alpha1.SpendView.Opaque + 0, // 16: penumbra.core.component.shielded_pool.v1alpha1.SpendPlan.note:type_name -> penumbra.core.component.shielded_pool.v1alpha1.Note + 14, // 17: penumbra.core.component.shielded_pool.v1alpha1.Output.body:type_name -> penumbra.core.component.shielded_pool.v1alpha1.OutputBody + 4, // 18: penumbra.core.component.shielded_pool.v1alpha1.Output.proof:type_name -> penumbra.core.component.shielded_pool.v1alpha1.ZKOutputProof + 3, // 19: penumbra.core.component.shielded_pool.v1alpha1.OutputBody.note_payload:type_name -> penumbra.core.component.shielded_pool.v1alpha1.NotePayload + 32, // 20: penumbra.core.component.shielded_pool.v1alpha1.OutputBody.balance_commitment:type_name -> penumbra.core.asset.v1alpha1.BalanceCommitment + 22, // 21: penumbra.core.component.shielded_pool.v1alpha1.OutputView.visible:type_name -> penumbra.core.component.shielded_pool.v1alpha1.OutputView.Visible + 23, // 22: penumbra.core.component.shielded_pool.v1alpha1.OutputView.opaque:type_name -> penumbra.core.component.shielded_pool.v1alpha1.OutputView.Opaque + 25, // 23: penumbra.core.component.shielded_pool.v1alpha1.OutputPlan.value:type_name -> penumbra.core.asset.v1alpha1.Value + 26, // 24: penumbra.core.component.shielded_pool.v1alpha1.OutputPlan.dest_address:type_name -> penumbra.core.keys.v1alpha1.Address + 34, // 25: penumbra.core.component.shielded_pool.v1alpha1.DenomMetadataByIdRequest.asset_id:type_name -> penumbra.core.asset.v1alpha1.AssetId + 35, // 26: penumbra.core.component.shielded_pool.v1alpha1.DenomMetadataByIdResponse.denom_metadata:type_name -> penumbra.core.asset.v1alpha1.DenomMetadata + 24, // 27: penumbra.core.component.shielded_pool.v1alpha1.GenesisContent.allocations:type_name -> penumbra.core.component.shielded_pool.v1alpha1.GenesisContent.Allocation + 7, // 28: penumbra.core.component.shielded_pool.v1alpha1.SpendView.Visible.spend:type_name -> penumbra.core.component.shielded_pool.v1alpha1.Spend + 1, // 29: penumbra.core.component.shielded_pool.v1alpha1.SpendView.Visible.note:type_name -> penumbra.core.component.shielded_pool.v1alpha1.NoteView + 7, // 30: penumbra.core.component.shielded_pool.v1alpha1.SpendView.Opaque.spend:type_name -> penumbra.core.component.shielded_pool.v1alpha1.Spend + 13, // 31: penumbra.core.component.shielded_pool.v1alpha1.OutputView.Visible.output:type_name -> penumbra.core.component.shielded_pool.v1alpha1.Output + 1, // 32: penumbra.core.component.shielded_pool.v1alpha1.OutputView.Visible.note:type_name -> penumbra.core.component.shielded_pool.v1alpha1.NoteView + 36, // 33: penumbra.core.component.shielded_pool.v1alpha1.OutputView.Visible.payload_key:type_name -> penumbra.core.keys.v1alpha1.PayloadKey + 13, // 34: penumbra.core.component.shielded_pool.v1alpha1.OutputView.Opaque.output:type_name -> penumbra.core.component.shielded_pool.v1alpha1.Output + 37, // 35: penumbra.core.component.shielded_pool.v1alpha1.GenesisContent.Allocation.amount:type_name -> penumbra.core.num.v1alpha1.Amount + 26, // 36: penumbra.core.component.shielded_pool.v1alpha1.GenesisContent.Allocation.address:type_name -> penumbra.core.keys.v1alpha1.Address + 17, // 37: penumbra.core.component.shielded_pool.v1alpha1.QueryService.DenomMetadataById:input_type -> penumbra.core.component.shielded_pool.v1alpha1.DenomMetadataByIdRequest + 18, // 38: penumbra.core.component.shielded_pool.v1alpha1.QueryService.DenomMetadataById:output_type -> penumbra.core.component.shielded_pool.v1alpha1.DenomMetadataByIdResponse + 38, // [38:39] is the sub-list for method output_type + 37, // [37:38] is the sub-list for method input_type + 37, // [37:37] is the sub-list for extension type_name + 37, // [37:37] is the sub-list for extension extendee + 0, // [0:37] is the sub-list for field type_name } func init() { file_penumbra_core_component_shielded_pool_v1alpha1_shielded_pool_proto_init() } diff --git a/proto/go/gen/penumbra/core/component/stake/v1alpha1/stake.pb.go b/proto/go/gen/penumbra/core/component/stake/v1alpha1/stake.pb.go index 7b9cf777de..cce5012900 100644 --- a/proto/go/gen/penumbra/core/component/stake/v1alpha1/stake.pb.go +++ b/proto/go/gen/penumbra/core/component/stake/v1alpha1/stake.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.31.0 +// protoc-gen-go v1.32.0 // protoc (unknown) // source: penumbra/core/component/stake/v1alpha1/stake.proto @@ -365,7 +365,7 @@ type FundingStream struct { // Types that are assignable to Recipient: // // *FundingStream_ToAddress_ - // *FundingStream_ToDao_ + // *FundingStream_ToCommunityPool_ Recipient isFundingStream_Recipient `protobuf_oneof:"recipient"` } @@ -415,9 +415,9 @@ func (x *FundingStream) GetToAddress() *FundingStream_ToAddress { return nil } -func (x *FundingStream) GetToDao() *FundingStream_ToDao { - if x, ok := x.GetRecipient().(*FundingStream_ToDao_); ok { - return x.ToDao +func (x *FundingStream) GetToCommunityPool() *FundingStream_ToCommunityPool { + if x, ok := x.GetRecipient().(*FundingStream_ToCommunityPool_); ok { + return x.ToCommunityPool } return nil } @@ -430,13 +430,13 @@ type FundingStream_ToAddress_ struct { ToAddress *FundingStream_ToAddress `protobuf:"bytes,1,opt,name=to_address,json=toAddress,proto3,oneof"` } -type FundingStream_ToDao_ struct { - ToDao *FundingStream_ToDao `protobuf:"bytes,2,opt,name=to_dao,json=toDao,proto3,oneof"` +type FundingStream_ToCommunityPool_ struct { + ToCommunityPool *FundingStream_ToCommunityPool `protobuf:"bytes,2,opt,name=to_community_pool,json=toCommunityPool,proto3,oneof"` } func (*FundingStream_ToAddress_) isFundingStream_Recipient() {} -func (*FundingStream_ToDao_) isFundingStream_Recipient() {} +func (*FundingStream_ToCommunityPool_) isFundingStream_Recipient() {} // Describes the reward and exchange rates and voting power for a validator in some epoch. type RateData struct { @@ -2138,7 +2138,7 @@ func (x *FundingStream_ToAddress) GetRateBps() uint32 { return 0 } -type FundingStream_ToDao struct { +type FundingStream_ToCommunityPool struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields @@ -2148,8 +2148,8 @@ type FundingStream_ToDao struct { RateBps uint32 `protobuf:"varint,2,opt,name=rate_bps,json=rateBps,proto3" json:"rate_bps,omitempty"` } -func (x *FundingStream_ToDao) Reset() { - *x = FundingStream_ToDao{} +func (x *FundingStream_ToCommunityPool) Reset() { + *x = FundingStream_ToCommunityPool{} if protoimpl.UnsafeEnabled { mi := &file_penumbra_core_component_stake_v1alpha1_stake_proto_msgTypes[31] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -2157,13 +2157,13 @@ func (x *FundingStream_ToDao) Reset() { } } -func (x *FundingStream_ToDao) String() string { +func (x *FundingStream_ToCommunityPool) String() string { return protoimpl.X.MessageStringOf(x) } -func (*FundingStream_ToDao) ProtoMessage() {} +func (*FundingStream_ToCommunityPool) ProtoMessage() {} -func (x *FundingStream_ToDao) ProtoReflect() protoreflect.Message { +func (x *FundingStream_ToCommunityPool) ProtoReflect() protoreflect.Message { mi := &file_penumbra_core_component_stake_v1alpha1_stake_proto_msgTypes[31] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -2175,12 +2175,12 @@ func (x *FundingStream_ToDao) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use FundingStream_ToDao.ProtoReflect.Descriptor instead. -func (*FundingStream_ToDao) Descriptor() ([]byte, []int) { +// Deprecated: Use FundingStream_ToCommunityPool.ProtoReflect.Descriptor instead. +func (*FundingStream_ToCommunityPool) Descriptor() ([]byte, []int) { return file_penumbra_core_component_stake_v1alpha1_stake_proto_rawDescGZIP(), []int{3, 1} } -func (x *FundingStream_ToDao) GetRateBps() uint32 { +func (x *FundingStream_ToCommunityPool) GetRateBps() uint32 { if x != nil { return x.RateBps } @@ -2240,7 +2240,7 @@ var file_penumbra_core_component_stake_v1alpha1_stake_proto_rawDesc = []byte{ 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6b, 0x65, 0x79, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x4b, 0x65, 0x79, 0x52, 0x0d, 0x76, - 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x4b, 0x65, 0x79, 0x73, 0x22, 0xba, 0x02, 0x0a, + 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x4b, 0x65, 0x79, 0x73, 0x22, 0xe3, 0x02, 0x0a, 0x0d, 0x46, 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x12, 0x60, 0x0a, 0x0a, 0x74, 0x6f, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3f, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, @@ -2248,408 +2248,411 @@ var file_penumbra_core_component_stake_v1alpha1_stake_proto_rawDesc = []byte{ 0x6b, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x46, 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x2e, 0x54, 0x6f, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x48, 0x00, 0x52, 0x09, 0x74, 0x6f, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, - 0x12, 0x54, 0x0a, 0x06, 0x74, 0x6f, 0x5f, 0x64, 0x61, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x3b, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, - 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x74, 0x61, 0x6b, 0x65, - 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x46, 0x75, 0x6e, 0x64, 0x69, 0x6e, - 0x67, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x2e, 0x54, 0x6f, 0x44, 0x61, 0x6f, 0x48, 0x00, 0x52, - 0x05, 0x74, 0x6f, 0x44, 0x61, 0x6f, 0x1a, 0x40, 0x0a, 0x09, 0x54, 0x6f, 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, 0x19, 0x0a, - 0x08, 0x72, 0x61, 0x74, 0x65, 0x5f, 0x62, 0x70, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x07, 0x72, 0x61, 0x74, 0x65, 0x42, 0x70, 0x73, 0x1a, 0x22, 0x0a, 0x05, 0x54, 0x6f, 0x44, 0x61, - 0x6f, 0x12, 0x19, 0x0a, 0x08, 0x72, 0x61, 0x74, 0x65, 0x5f, 0x62, 0x70, 0x73, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x07, 0x72, 0x61, 0x74, 0x65, 0x42, 0x70, 0x73, 0x42, 0x0b, 0x0a, 0x09, - 0x72, 0x65, 0x63, 0x69, 0x70, 0x69, 0x65, 0x6e, 0x74, 0x22, 0xe4, 0x01, 0x0a, 0x08, 0x52, 0x61, - 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x12, 0x4b, 0x0a, 0x0c, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, - 0x74, 0x79, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x70, - 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6b, 0x65, 0x79, - 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x49, 0x64, 0x65, 0x6e, 0x74, - 0x69, 0x74, 0x79, 0x4b, 0x65, 0x79, 0x52, 0x0b, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, - 0x4b, 0x65, 0x79, 0x12, 0x1f, 0x0a, 0x0b, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x69, 0x6e, 0x64, - 0x65, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x49, - 0x6e, 0x64, 0x65, 0x78, 0x12, 0x32, 0x0a, 0x15, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, - 0x72, 0x5f, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x5f, 0x72, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x04, 0x52, 0x13, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x65, - 0x77, 0x61, 0x72, 0x64, 0x52, 0x61, 0x74, 0x65, 0x12, 0x36, 0x0a, 0x17, 0x76, 0x61, 0x6c, 0x69, - 0x64, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x65, 0x78, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x72, - 0x61, 0x74, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x15, 0x76, 0x61, 0x6c, 0x69, 0x64, - 0x61, 0x74, 0x6f, 0x72, 0x45, 0x78, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x61, 0x74, 0x65, - 0x22, 0x87, 0x01, 0x0a, 0x0c, 0x42, 0x61, 0x73, 0x65, 0x52, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, - 0x61, 0x12, 0x1f, 0x0a, 0x0b, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x49, 0x6e, 0x64, - 0x65, 0x78, 0x12, 0x28, 0x0a, 0x10, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x72, 0x65, 0x77, 0x61, 0x72, - 0x64, 0x5f, 0x72, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0e, 0x62, 0x61, - 0x73, 0x65, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x52, 0x61, 0x74, 0x65, 0x12, 0x2c, 0x0a, 0x12, - 0x62, 0x61, 0x73, 0x65, 0x5f, 0x65, 0x78, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x72, 0x61, - 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x10, 0x62, 0x61, 0x73, 0x65, 0x45, 0x78, - 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x61, 0x74, 0x65, 0x22, 0xaa, 0x02, 0x0a, 0x0f, 0x56, - 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x4b, - 0x0a, 0x0c, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, - 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6b, 0x65, 0x79, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, - 0x61, 0x31, 0x2e, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x4b, 0x65, 0x79, 0x52, 0x0b, - 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x4b, 0x65, 0x79, 0x12, 0x4c, 0x0a, 0x05, 0x73, - 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x70, 0x65, 0x6e, - 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, - 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x74, 0x61, 0x6b, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, - 0x68, 0x61, 0x31, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x53, 0x74, 0x61, - 0x74, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x76, 0x6f, 0x74, - 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x6f, 0x77, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, - 0x0b, 0x76, 0x6f, 0x74, 0x69, 0x6e, 0x67, 0x50, 0x6f, 0x77, 0x65, 0x72, 0x12, 0x59, 0x0a, 0x0d, - 0x62, 0x6f, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, - 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x74, - 0x61, 0x6b, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x42, 0x6f, 0x6e, - 0x64, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x0c, 0x62, 0x6f, 0x6e, 0x64, 0x69, - 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x22, 0xaf, 0x02, 0x0a, 0x0c, 0x42, 0x6f, 0x6e, 0x64, - 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x5b, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x45, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, - 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, - 0x74, 0x2e, 0x73, 0x74, 0x61, 0x6b, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, - 0x2e, 0x42, 0x6f, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x42, 0x6f, - 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x75, 0x6d, 0x52, 0x05, - 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x27, 0x0a, 0x0f, 0x75, 0x6e, 0x62, 0x6f, 0x6e, 0x64, 0x69, - 0x6e, 0x67, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0e, - 0x75, 0x6e, 0x62, 0x6f, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x22, 0x98, - 0x01, 0x0a, 0x10, 0x42, 0x6f, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x45, - 0x6e, 0x75, 0x6d, 0x12, 0x22, 0x0a, 0x1e, 0x42, 0x4f, 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x5f, 0x53, - 0x54, 0x41, 0x54, 0x45, 0x5f, 0x45, 0x4e, 0x55, 0x4d, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, - 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x1d, 0x0a, 0x19, 0x42, 0x4f, 0x4e, 0x44, 0x49, - 0x4e, 0x47, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x45, 0x4e, 0x55, 0x4d, 0x5f, 0x42, 0x4f, - 0x4e, 0x44, 0x45, 0x44, 0x10, 0x01, 0x12, 0x20, 0x0a, 0x1c, 0x42, 0x4f, 0x4e, 0x44, 0x49, 0x4e, - 0x47, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x45, 0x4e, 0x55, 0x4d, 0x5f, 0x55, 0x4e, 0x42, - 0x4f, 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x12, 0x1f, 0x0a, 0x1b, 0x42, 0x4f, 0x4e, 0x44, - 0x49, 0x4e, 0x47, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x45, 0x4e, 0x55, 0x4d, 0x5f, 0x55, - 0x4e, 0x42, 0x4f, 0x4e, 0x44, 0x45, 0x44, 0x10, 0x03, 0x22, 0xdb, 0x02, 0x0a, 0x0e, 0x56, 0x61, - 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x5f, 0x0a, 0x05, - 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x49, 0x2e, 0x70, 0x65, + 0x12, 0x73, 0x0a, 0x11, 0x74, 0x6f, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x74, 0x79, + 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x45, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x74, 0x61, 0x6b, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, - 0x70, 0x68, 0x61, 0x31, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x53, 0x74, - 0x61, 0x74, 0x65, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x53, 0x74, 0x61, - 0x74, 0x65, 0x45, 0x6e, 0x75, 0x6d, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, 0xe7, 0x01, - 0x0a, 0x12, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, 0x65, - 0x45, 0x6e, 0x75, 0x6d, 0x12, 0x24, 0x0a, 0x20, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x41, 0x54, 0x4f, - 0x52, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x45, 0x4e, 0x55, 0x4d, 0x5f, 0x55, 0x4e, 0x53, - 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x21, 0x0a, 0x1d, 0x56, 0x41, - 0x4c, 0x49, 0x44, 0x41, 0x54, 0x4f, 0x52, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x45, 0x4e, - 0x55, 0x4d, 0x5f, 0x49, 0x4e, 0x41, 0x43, 0x54, 0x49, 0x56, 0x45, 0x10, 0x01, 0x12, 0x1f, 0x0a, - 0x1b, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x41, 0x54, 0x4f, 0x52, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, - 0x5f, 0x45, 0x4e, 0x55, 0x4d, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x45, 0x10, 0x02, 0x12, 0x1f, - 0x0a, 0x1b, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x41, 0x54, 0x4f, 0x52, 0x5f, 0x53, 0x54, 0x41, 0x54, - 0x45, 0x5f, 0x45, 0x4e, 0x55, 0x4d, 0x5f, 0x4a, 0x41, 0x49, 0x4c, 0x45, 0x44, 0x10, 0x03, 0x12, - 0x23, 0x0a, 0x1f, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x41, 0x54, 0x4f, 0x52, 0x5f, 0x53, 0x54, 0x41, - 0x54, 0x45, 0x5f, 0x45, 0x4e, 0x55, 0x4d, 0x5f, 0x54, 0x4f, 0x4d, 0x42, 0x53, 0x54, 0x4f, 0x4e, - 0x45, 0x44, 0x10, 0x04, 0x12, 0x21, 0x0a, 0x1d, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x41, 0x54, 0x4f, - 0x52, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x45, 0x4e, 0x55, 0x4d, 0x5f, 0x44, 0x49, 0x53, - 0x41, 0x42, 0x4c, 0x45, 0x44, 0x10, 0x05, 0x22, 0x80, 0x02, 0x0a, 0x0d, 0x56, 0x61, 0x6c, 0x69, - 0x64, 0x61, 0x74, 0x6f, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x4f, 0x0a, 0x09, 0x76, 0x61, 0x6c, - 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x70, + 0x70, 0x68, 0x61, 0x31, 0x2e, 0x46, 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x72, 0x65, + 0x61, 0x6d, 0x2e, 0x54, 0x6f, 0x43, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x74, 0x79, 0x50, 0x6f, + 0x6f, 0x6c, 0x48, 0x00, 0x52, 0x0f, 0x74, 0x6f, 0x43, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x74, + 0x79, 0x50, 0x6f, 0x6f, 0x6c, 0x1a, 0x40, 0x0a, 0x09, 0x54, 0x6f, 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, 0x19, 0x0a, 0x08, + 0x72, 0x61, 0x74, 0x65, 0x5f, 0x62, 0x70, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, + 0x72, 0x61, 0x74, 0x65, 0x42, 0x70, 0x73, 0x1a, 0x2c, 0x0a, 0x0f, 0x54, 0x6f, 0x43, 0x6f, 0x6d, + 0x6d, 0x75, 0x6e, 0x69, 0x74, 0x79, 0x50, 0x6f, 0x6f, 0x6c, 0x12, 0x19, 0x0a, 0x08, 0x72, 0x61, + 0x74, 0x65, 0x5f, 0x62, 0x70, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x72, 0x61, + 0x74, 0x65, 0x42, 0x70, 0x73, 0x42, 0x0b, 0x0a, 0x09, 0x72, 0x65, 0x63, 0x69, 0x70, 0x69, 0x65, + 0x6e, 0x74, 0x22, 0xe4, 0x01, 0x0a, 0x08, 0x52, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x12, + 0x4b, 0x0a, 0x0c, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x5f, 0x6b, 0x65, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, + 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6b, 0x65, 0x79, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, + 0x68, 0x61, 0x31, 0x2e, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x4b, 0x65, 0x79, 0x52, + 0x0b, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x4b, 0x65, 0x79, 0x12, 0x1f, 0x0a, 0x0b, + 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x0a, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x32, 0x0a, + 0x15, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x72, 0x65, 0x77, 0x61, 0x72, + 0x64, 0x5f, 0x72, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x13, 0x76, 0x61, + 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x52, 0x61, 0x74, + 0x65, 0x12, 0x36, 0x0a, 0x17, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x65, + 0x78, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x72, 0x61, 0x74, 0x65, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x04, 0x52, 0x15, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x45, 0x78, 0x63, + 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x61, 0x74, 0x65, 0x22, 0x87, 0x01, 0x0a, 0x0c, 0x42, 0x61, + 0x73, 0x65, 0x52, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x12, 0x1f, 0x0a, 0x0b, 0x65, 0x70, + 0x6f, 0x63, 0x68, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, + 0x0a, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x28, 0x0a, 0x10, 0x62, + 0x61, 0x73, 0x65, 0x5f, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x5f, 0x72, 0x61, 0x74, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0e, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x77, 0x61, 0x72, + 0x64, 0x52, 0x61, 0x74, 0x65, 0x12, 0x2c, 0x0a, 0x12, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x65, 0x78, + 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x72, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x10, 0x62, 0x61, 0x73, 0x65, 0x45, 0x78, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, + 0x61, 0x74, 0x65, 0x22, 0xaa, 0x02, 0x0a, 0x0f, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, + 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x4b, 0x0a, 0x0c, 0x69, 0x64, 0x65, 0x6e, 0x74, + 0x69, 0x74, 0x79, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, + 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6b, 0x65, + 0x79, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x49, 0x64, 0x65, 0x6e, + 0x74, 0x69, 0x74, 0x79, 0x4b, 0x65, 0x79, 0x52, 0x0b, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, + 0x79, 0x4b, 0x65, 0x79, 0x12, 0x4c, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, + 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x74, + 0x61, 0x6b, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x56, 0x61, 0x6c, + 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, + 0x74, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x76, 0x6f, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x6f, 0x77, + 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x76, 0x6f, 0x74, 0x69, 0x6e, 0x67, + 0x50, 0x6f, 0x77, 0x65, 0x72, 0x12, 0x59, 0x0a, 0x0d, 0x62, 0x6f, 0x6e, 0x64, 0x69, 0x6e, 0x67, + 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x74, 0x61, 0x6b, 0x65, 0x2e, 0x76, 0x31, 0x61, - 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x52, - 0x09, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x4f, 0x0a, 0x06, 0x73, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x70, 0x65, 0x6e, - 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, - 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x74, 0x61, 0x6b, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, - 0x68, 0x61, 0x31, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x4d, 0x0a, 0x09, 0x72, - 0x61, 0x74, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, - 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, - 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x74, 0x61, 0x6b, 0x65, 0x2e, 0x76, - 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x52, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, - 0x52, 0x08, 0x72, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x22, 0x81, 0x01, 0x0a, 0x13, 0x56, - 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, - 0x6f, 0x6e, 0x12, 0x4f, 0x0a, 0x09, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x18, + 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x42, 0x6f, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, + 0x74, 0x65, 0x52, 0x0c, 0x62, 0x6f, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, + 0x22, 0xaf, 0x02, 0x0a, 0x0c, 0x42, 0x6f, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, + 0x65, 0x12, 0x5b, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, + 0x32, 0x45, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, + 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x74, 0x61, 0x6b, 0x65, + 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x42, 0x6f, 0x6e, 0x64, 0x69, 0x6e, + 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x42, 0x6f, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x53, 0x74, + 0x61, 0x74, 0x65, 0x45, 0x6e, 0x75, 0x6d, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x27, + 0x0a, 0x0f, 0x75, 0x6e, 0x62, 0x6f, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x65, 0x70, 0x6f, 0x63, + 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0e, 0x75, 0x6e, 0x62, 0x6f, 0x6e, 0x64, 0x69, + 0x6e, 0x67, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x22, 0x98, 0x01, 0x0a, 0x10, 0x42, 0x6f, 0x6e, 0x64, + 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x75, 0x6d, 0x12, 0x22, 0x0a, 0x1e, + 0x42, 0x4f, 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x45, 0x4e, + 0x55, 0x4d, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, + 0x12, 0x1d, 0x0a, 0x19, 0x42, 0x4f, 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x5f, 0x53, 0x54, 0x41, 0x54, + 0x45, 0x5f, 0x45, 0x4e, 0x55, 0x4d, 0x5f, 0x42, 0x4f, 0x4e, 0x44, 0x45, 0x44, 0x10, 0x01, 0x12, + 0x20, 0x0a, 0x1c, 0x42, 0x4f, 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, + 0x5f, 0x45, 0x4e, 0x55, 0x4d, 0x5f, 0x55, 0x4e, 0x42, 0x4f, 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x10, + 0x02, 0x12, 0x1f, 0x0a, 0x1b, 0x42, 0x4f, 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x5f, 0x53, 0x54, 0x41, + 0x54, 0x45, 0x5f, 0x45, 0x4e, 0x55, 0x4d, 0x5f, 0x55, 0x4e, 0x42, 0x4f, 0x4e, 0x44, 0x45, 0x44, + 0x10, 0x03, 0x22, 0xdb, 0x02, 0x0a, 0x0e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, + 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x5f, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0e, 0x32, 0x49, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, + 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x73, + 0x74, 0x61, 0x6b, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x56, 0x61, + 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x56, 0x61, 0x6c, + 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x75, 0x6d, 0x52, + 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, 0xe7, 0x01, 0x0a, 0x12, 0x56, 0x61, 0x6c, 0x69, 0x64, + 0x61, 0x74, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x75, 0x6d, 0x12, 0x24, 0x0a, + 0x20, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x41, 0x54, 0x4f, 0x52, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, + 0x5f, 0x45, 0x4e, 0x55, 0x4d, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, + 0x44, 0x10, 0x00, 0x12, 0x21, 0x0a, 0x1d, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x41, 0x54, 0x4f, 0x52, + 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x45, 0x4e, 0x55, 0x4d, 0x5f, 0x49, 0x4e, 0x41, 0x43, + 0x54, 0x49, 0x56, 0x45, 0x10, 0x01, 0x12, 0x1f, 0x0a, 0x1b, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x41, + 0x54, 0x4f, 0x52, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x45, 0x4e, 0x55, 0x4d, 0x5f, 0x41, + 0x43, 0x54, 0x49, 0x56, 0x45, 0x10, 0x02, 0x12, 0x1f, 0x0a, 0x1b, 0x56, 0x41, 0x4c, 0x49, 0x44, + 0x41, 0x54, 0x4f, 0x52, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x45, 0x4e, 0x55, 0x4d, 0x5f, + 0x4a, 0x41, 0x49, 0x4c, 0x45, 0x44, 0x10, 0x03, 0x12, 0x23, 0x0a, 0x1f, 0x56, 0x41, 0x4c, 0x49, + 0x44, 0x41, 0x54, 0x4f, 0x52, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x45, 0x4e, 0x55, 0x4d, + 0x5f, 0x54, 0x4f, 0x4d, 0x42, 0x53, 0x54, 0x4f, 0x4e, 0x45, 0x44, 0x10, 0x04, 0x12, 0x21, 0x0a, + 0x1d, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x41, 0x54, 0x4f, 0x52, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, + 0x5f, 0x45, 0x4e, 0x55, 0x4d, 0x5f, 0x44, 0x49, 0x53, 0x41, 0x42, 0x4c, 0x45, 0x44, 0x10, 0x05, + 0x22, 0x80, 0x02, 0x0a, 0x0d, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x49, 0x6e, + 0x66, 0x6f, 0x12, 0x4f, 0x0a, 0x09, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x74, 0x61, 0x6b, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x09, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, - 0x74, 0x6f, 0x72, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x73, 0x69, 0x67, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x61, 0x75, 0x74, 0x68, 0x53, 0x69, 0x67, 0x22, 0xa2, - 0x02, 0x0a, 0x08, 0x44, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x65, 0x12, 0x57, 0x0a, 0x12, 0x76, + 0x74, 0x6f, 0x72, 0x12, 0x4f, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, + 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x74, + 0x61, 0x6b, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x56, 0x61, 0x6c, + 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x12, 0x4d, 0x0a, 0x09, 0x72, 0x61, 0x74, 0x65, 0x5f, 0x64, 0x61, 0x74, + 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, + 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, + 0x74, 0x2e, 0x73, 0x74, 0x61, 0x6b, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, + 0x2e, 0x52, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x52, 0x08, 0x72, 0x61, 0x74, 0x65, 0x44, + 0x61, 0x74, 0x61, 0x22, 0x81, 0x01, 0x0a, 0x13, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, + 0x72, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x4f, 0x0a, 0x09, 0x76, + 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, + 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, + 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x74, 0x61, 0x6b, 0x65, 0x2e, 0x76, + 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, + 0x72, 0x52, 0x09, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x19, 0x0a, 0x08, + 0x61, 0x75, 0x74, 0x68, 0x5f, 0x73, 0x69, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, + 0x61, 0x75, 0x74, 0x68, 0x53, 0x69, 0x67, 0x22, 0xa2, 0x02, 0x0a, 0x08, 0x44, 0x65, 0x6c, 0x65, + 0x67, 0x61, 0x74, 0x65, 0x12, 0x57, 0x0a, 0x12, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, + 0x72, 0x5f, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x28, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, + 0x2e, 0x6b, 0x65, 0x79, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x49, + 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x4b, 0x65, 0x79, 0x52, 0x11, 0x76, 0x61, 0x6c, 0x69, + 0x64, 0x61, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x12, 0x1f, 0x0a, + 0x0b, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x04, 0x52, 0x0a, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x4b, + 0x0a, 0x0f, 0x75, 0x6e, 0x62, 0x6f, 0x6e, 0x64, 0x65, 0x64, 0x5f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, + 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, + 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6e, 0x75, 0x6d, 0x2e, 0x76, 0x31, 0x61, 0x6c, + 0x70, 0x68, 0x61, 0x31, 0x2e, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x0e, 0x75, 0x6e, 0x62, + 0x6f, 0x6e, 0x64, 0x65, 0x64, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x4f, 0x0a, 0x11, 0x64, + 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, + 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6e, 0x75, 0x6d, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, + 0x68, 0x61, 0x31, 0x2e, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x10, 0x64, 0x65, 0x6c, 0x65, + 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0xaf, 0x02, 0x0a, + 0x0a, 0x55, 0x6e, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x65, 0x12, 0x57, 0x0a, 0x12, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6b, 0x65, 0x79, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x4b, 0x65, 0x79, 0x52, 0x11, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x65, 0x6e, - 0x74, 0x69, 0x74, 0x79, 0x12, 0x1f, 0x0a, 0x0b, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x69, 0x6e, - 0x64, 0x65, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, 0x65, 0x70, 0x6f, 0x63, 0x68, - 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x4b, 0x0a, 0x0f, 0x75, 0x6e, 0x62, 0x6f, 0x6e, 0x64, 0x65, - 0x64, 0x5f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, - 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6e, - 0x75, 0x6d, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x41, 0x6d, 0x6f, 0x75, - 0x6e, 0x74, 0x52, 0x0e, 0x75, 0x6e, 0x62, 0x6f, 0x6e, 0x64, 0x65, 0x64, 0x41, 0x6d, 0x6f, 0x75, - 0x6e, 0x74, 0x12, 0x4f, 0x0a, 0x11, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x5f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, - 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6e, 0x75, - 0x6d, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x41, 0x6d, 0x6f, 0x75, 0x6e, - 0x74, 0x52, 0x10, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x6d, 0x6f, - 0x75, 0x6e, 0x74, 0x22, 0xaf, 0x02, 0x0a, 0x0a, 0x55, 0x6e, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, - 0x74, 0x65, 0x12, 0x57, 0x0a, 0x12, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x5f, - 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, - 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6b, - 0x65, 0x79, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x49, 0x64, 0x65, - 0x6e, 0x74, 0x69, 0x74, 0x79, 0x4b, 0x65, 0x79, 0x52, 0x11, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, - 0x74, 0x6f, 0x72, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x12, 0x2a, 0x0a, 0x11, 0x73, - 0x74, 0x61, 0x72, 0x74, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x45, 0x70, 0x6f, - 0x63, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x4b, 0x0a, 0x0f, 0x75, 0x6e, 0x62, 0x6f, 0x6e, - 0x64, 0x65, 0x64, 0x5f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x22, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, - 0x2e, 0x6e, 0x75, 0x6d, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x41, 0x6d, - 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x0e, 0x75, 0x6e, 0x62, 0x6f, 0x6e, 0x64, 0x65, 0x64, 0x41, 0x6d, - 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x4f, 0x0a, 0x11, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x5f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x22, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, - 0x6e, 0x75, 0x6d, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x41, 0x6d, 0x6f, - 0x75, 0x6e, 0x74, 0x52, 0x10, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x41, - 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x78, 0x0a, 0x0f, 0x55, 0x6e, 0x64, 0x65, 0x6c, 0x65, 0x67, - 0x61, 0x74, 0x65, 0x43, 0x6c, 0x61, 0x69, 0x6d, 0x12, 0x4f, 0x0a, 0x04, 0x62, 0x6f, 0x64, 0x79, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3b, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, + 0x74, 0x69, 0x74, 0x79, 0x12, 0x2a, 0x0a, 0x11, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x65, 0x70, + 0x6f, 0x63, 0x68, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, + 0x0f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, + 0x12, 0x4b, 0x0a, 0x0f, 0x75, 0x6e, 0x62, 0x6f, 0x6e, 0x64, 0x65, 0x64, 0x5f, 0x61, 0x6d, 0x6f, + 0x75, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x70, 0x65, 0x6e, 0x75, + 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6e, 0x75, 0x6d, 0x2e, 0x76, 0x31, + 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x0e, 0x75, + 0x6e, 0x62, 0x6f, 0x6e, 0x64, 0x65, 0x64, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x4f, 0x0a, + 0x11, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x61, 0x6d, 0x6f, 0x75, + 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, + 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6e, 0x75, 0x6d, 0x2e, 0x76, 0x31, 0x61, + 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x10, 0x64, 0x65, + 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x78, + 0x0a, 0x0f, 0x55, 0x6e, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x65, 0x43, 0x6c, 0x61, 0x69, + 0x6d, 0x12, 0x4f, 0x0a, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x3b, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, + 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x74, 0x61, 0x6b, 0x65, 0x2e, + 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x55, 0x6e, 0x64, 0x65, 0x6c, 0x65, 0x67, + 0x61, 0x74, 0x65, 0x43, 0x6c, 0x61, 0x69, 0x6d, 0x42, 0x6f, 0x64, 0x79, 0x52, 0x04, 0x62, 0x6f, + 0x64, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0c, 0x52, 0x05, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x22, 0xc5, 0x02, 0x0a, 0x13, 0x55, 0x6e, 0x64, + 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x65, 0x43, 0x6c, 0x61, 0x69, 0x6d, 0x42, 0x6f, 0x64, 0x79, + 0x12, 0x57, 0x0a, 0x12, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x69, 0x64, + 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x70, + 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6b, 0x65, 0x79, + 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x49, 0x64, 0x65, 0x6e, 0x74, + 0x69, 0x74, 0x79, 0x4b, 0x65, 0x79, 0x52, 0x11, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, + 0x72, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x12, 0x2a, 0x0a, 0x11, 0x73, 0x74, 0x61, + 0x72, 0x74, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x04, 0x52, 0x0f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, + 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x49, 0x0a, 0x07, 0x70, 0x65, 0x6e, 0x61, 0x6c, 0x74, 0x79, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x74, 0x61, 0x6b, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, - 0x55, 0x6e, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x65, 0x43, 0x6c, 0x61, 0x69, 0x6d, 0x42, - 0x6f, 0x64, 0x79, 0x52, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x72, 0x6f, - 0x6f, 0x66, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x22, - 0xc5, 0x02, 0x0a, 0x13, 0x55, 0x6e, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x65, 0x43, 0x6c, - 0x61, 0x69, 0x6d, 0x42, 0x6f, 0x64, 0x79, 0x12, 0x57, 0x0a, 0x12, 0x76, 0x61, 0x6c, 0x69, 0x64, - 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, - 0x6f, 0x72, 0x65, 0x2e, 0x6b, 0x65, 0x79, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, - 0x31, 0x2e, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x4b, 0x65, 0x79, 0x52, 0x11, 0x76, - 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, - 0x12, 0x2a, 0x0a, 0x11, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, - 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0f, 0x73, 0x74, 0x61, - 0x72, 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x49, 0x0a, 0x07, - 0x70, 0x65, 0x6e, 0x61, 0x6c, 0x74, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, - 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, - 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x74, 0x61, 0x6b, 0x65, 0x2e, 0x76, 0x31, - 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x65, 0x6e, 0x61, 0x6c, 0x74, 0x79, 0x52, 0x07, - 0x70, 0x65, 0x6e, 0x61, 0x6c, 0x74, 0x79, 0x12, 0x5e, 0x0a, 0x12, 0x62, 0x61, 0x6c, 0x61, 0x6e, - 0x63, 0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, - 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, - 0x61, 0x31, 0x2e, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, - 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x11, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x43, 0x6f, 0x6d, - 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0xb3, 0x03, 0x0a, 0x13, 0x55, 0x6e, 0x64, 0x65, - 0x6c, 0x65, 0x67, 0x61, 0x74, 0x65, 0x43, 0x6c, 0x61, 0x69, 0x6d, 0x50, 0x6c, 0x61, 0x6e, 0x12, - 0x57, 0x0a, 0x12, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x69, 0x64, 0x65, - 0x6e, 0x74, 0x69, 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x70, 0x65, - 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6b, 0x65, 0x79, 0x73, - 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, - 0x74, 0x79, 0x4b, 0x65, 0x79, 0x52, 0x11, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, - 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x12, 0x2a, 0x0a, 0x11, 0x73, 0x74, 0x61, 0x72, - 0x74, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x04, 0x52, 0x0f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x49, - 0x6e, 0x64, 0x65, 0x78, 0x12, 0x49, 0x0a, 0x07, 0x70, 0x65, 0x6e, 0x61, 0x6c, 0x74, 0x79, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, - 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, - 0x73, 0x74, 0x61, 0x6b, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, - 0x65, 0x6e, 0x61, 0x6c, 0x74, 0x79, 0x52, 0x07, 0x70, 0x65, 0x6e, 0x61, 0x6c, 0x74, 0x79, 0x12, - 0x4d, 0x0a, 0x10, 0x75, 0x6e, 0x62, 0x6f, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x61, 0x6d, 0x6f, - 0x75, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x70, 0x65, 0x6e, 0x75, - 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6e, 0x75, 0x6d, 0x2e, 0x76, 0x31, - 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x0f, 0x75, - 0x6e, 0x62, 0x6f, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x29, - 0x0a, 0x10, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x62, 0x6c, 0x69, 0x6e, 0x64, 0x69, - 0x6e, 0x67, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0f, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, - 0x65, 0x42, 0x6c, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x12, 0x28, 0x0a, 0x10, 0x70, 0x72, 0x6f, - 0x6f, 0x66, 0x5f, 0x62, 0x6c, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x72, 0x18, 0x07, 0x20, - 0x01, 0x28, 0x0c, 0x52, 0x0e, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x42, 0x6c, 0x69, 0x6e, 0x64, 0x69, - 0x6e, 0x67, 0x52, 0x12, 0x28, 0x0a, 0x10, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x5f, 0x62, 0x6c, 0x69, - 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0e, 0x70, - 0x72, 0x6f, 0x6f, 0x66, 0x42, 0x6c, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x53, 0x22, 0xc1, 0x01, - 0x0a, 0x11, 0x44, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, - 0x67, 0x65, 0x73, 0x12, 0x52, 0x0a, 0x0b, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, - 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, - 0x6e, 0x74, 0x2e, 0x73, 0x74, 0x61, 0x6b, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, - 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x65, 0x52, 0x0b, 0x64, 0x65, 0x6c, 0x65, - 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x58, 0x0a, 0x0d, 0x75, 0x6e, 0x64, 0x65, 0x6c, - 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x32, + 0x50, 0x65, 0x6e, 0x61, 0x6c, 0x74, 0x79, 0x52, 0x07, 0x70, 0x65, 0x6e, 0x61, 0x6c, 0x74, 0x79, + 0x12, 0x5e, 0x0a, 0x12, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, + 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x70, + 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x73, 0x73, + 0x65, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x42, 0x61, 0x6c, 0x61, + 0x6e, 0x63, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x11, 0x62, + 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, + 0x22, 0xb3, 0x03, 0x0a, 0x13, 0x55, 0x6e, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x65, 0x43, + 0x6c, 0x61, 0x69, 0x6d, 0x50, 0x6c, 0x61, 0x6e, 0x12, 0x57, 0x0a, 0x12, 0x76, 0x61, 0x6c, 0x69, + 0x64, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, + 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6b, 0x65, 0x79, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, + 0x61, 0x31, 0x2e, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x4b, 0x65, 0x79, 0x52, 0x11, + 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, + 0x79, 0x12, 0x2a, 0x0a, 0x11, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, + 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0f, 0x73, 0x74, + 0x61, 0x72, 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x49, 0x0a, + 0x07, 0x70, 0x65, 0x6e, 0x61, 0x6c, 0x74, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x74, 0x61, 0x6b, 0x65, 0x2e, 0x76, - 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x55, 0x6e, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, - 0x74, 0x65, 0x52, 0x0d, 0x75, 0x6e, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x22, 0x6c, 0x0a, 0x06, 0x55, 0x70, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x2b, 0x0a, 0x12, 0x61, - 0x73, 0x5f, 0x6f, 0x66, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, - 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0f, 0x61, 0x73, 0x4f, 0x66, 0x42, 0x6c, 0x6f, - 0x63, 0x6b, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x77, 0x69, 0x6e, 0x64, - 0x6f, 0x77, 0x5f, 0x6c, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x77, 0x69, - 0x6e, 0x64, 0x6f, 0x77, 0x4c, 0x65, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x62, 0x69, 0x74, 0x76, 0x65, - 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x62, 0x69, 0x74, 0x76, 0x65, 0x63, 0x22, - 0x68, 0x0a, 0x14, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x73, 0x65, 0x6e, - 0x73, 0x75, 0x73, 0x4b, 0x65, 0x79, 0x73, 0x12, 0x50, 0x0a, 0x0e, 0x63, 0x6f, 0x6e, 0x73, 0x65, - 0x6e, 0x73, 0x75, 0x73, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x29, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, - 0x6b, 0x65, 0x79, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x43, 0x6f, - 0x6e, 0x73, 0x65, 0x6e, 0x73, 0x75, 0x73, 0x4b, 0x65, 0x79, 0x52, 0x0d, 0x63, 0x6f, 0x6e, 0x73, - 0x65, 0x6e, 0x73, 0x75, 0x73, 0x4b, 0x65, 0x79, 0x73, 0x22, 0x1f, 0x0a, 0x07, 0x50, 0x65, 0x6e, - 0x61, 0x6c, 0x74, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0c, 0x52, 0x05, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x22, 0x56, 0x0a, 0x14, 0x56, 0x61, - 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 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, 0x12, 0x23, 0x0a, - 0x0d, 0x73, 0x68, 0x6f, 0x77, 0x5f, 0x69, 0x6e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x73, 0x68, 0x6f, 0x77, 0x49, 0x6e, 0x61, 0x63, 0x74, 0x69, - 0x76, 0x65, 0x22, 0x75, 0x0a, 0x15, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x49, - 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5c, 0x0a, 0x0e, 0x76, - 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, - 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x74, - 0x61, 0x6b, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x56, 0x61, 0x6c, - 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0d, 0x76, 0x61, 0x6c, 0x69, - 0x64, 0x61, 0x74, 0x6f, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x80, 0x01, 0x0a, 0x16, 0x56, 0x61, - 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 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, 0x12, - 0x4b, 0x0a, 0x0c, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x5f, 0x6b, 0x65, 0x79, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, - 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6b, 0x65, 0x79, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, - 0x68, 0x61, 0x31, 0x2e, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x4b, 0x65, 0x79, 0x52, - 0x0b, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x4b, 0x65, 0x79, 0x22, 0x6a, 0x0a, 0x17, - 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4f, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, + 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x65, 0x6e, 0x61, 0x6c, 0x74, 0x79, 0x52, + 0x07, 0x70, 0x65, 0x6e, 0x61, 0x6c, 0x74, 0x79, 0x12, 0x4d, 0x0a, 0x10, 0x75, 0x6e, 0x62, 0x6f, + 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, + 0x72, 0x65, 0x2e, 0x6e, 0x75, 0x6d, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, + 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x0f, 0x75, 0x6e, 0x62, 0x6f, 0x6e, 0x64, 0x69, 0x6e, + 0x67, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x29, 0x0a, 0x10, 0x62, 0x61, 0x6c, 0x61, 0x6e, + 0x63, 0x65, 0x5f, 0x62, 0x6c, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x0c, 0x52, 0x0f, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x42, 0x6c, 0x69, 0x6e, 0x64, 0x69, + 0x6e, 0x67, 0x12, 0x28, 0x0a, 0x10, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x5f, 0x62, 0x6c, 0x69, 0x6e, + 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0e, 0x70, 0x72, + 0x6f, 0x6f, 0x66, 0x42, 0x6c, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x12, 0x28, 0x0a, 0x10, + 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x5f, 0x62, 0x6c, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x73, + 0x18, 0x08, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0e, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x42, 0x6c, 0x69, + 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x53, 0x22, 0xc1, 0x01, 0x0a, 0x11, 0x44, 0x65, 0x6c, 0x65, 0x67, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x12, 0x52, 0x0a, 0x0b, + 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x30, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, + 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x74, 0x61, 0x6b, + 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x67, + 0x61, 0x74, 0x65, 0x52, 0x0b, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x12, 0x58, 0x0a, 0x0d, 0x75, 0x6e, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x74, 0x61, 0x6b, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, - 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0xd5, 0x01, 0x0a, 0x17, 0x56, 0x61, 0x6c, - 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x50, 0x65, 0x6e, 0x61, 0x6c, 0x74, 0x79, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 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, 0x12, - 0x4b, 0x0a, 0x0c, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x5f, 0x6b, 0x65, 0x79, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, - 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6b, 0x65, 0x79, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, - 0x68, 0x61, 0x31, 0x2e, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x4b, 0x65, 0x79, 0x52, - 0x0b, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x4b, 0x65, 0x79, 0x12, 0x2a, 0x0a, 0x11, - 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x69, 0x6e, 0x64, 0x65, - 0x78, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x45, 0x70, - 0x6f, 0x63, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x26, 0x0a, 0x0f, 0x65, 0x6e, 0x64, 0x5f, - 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x04, 0x52, 0x0d, 0x65, 0x6e, 0x64, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, - 0x22, 0x65, 0x0a, 0x18, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x50, 0x65, 0x6e, - 0x61, 0x6c, 0x74, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x49, 0x0a, 0x07, - 0x70, 0x65, 0x6e, 0x61, 0x6c, 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, - 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, - 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x74, 0x61, 0x6b, 0x65, 0x2e, 0x76, 0x31, - 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x65, 0x6e, 0x61, 0x6c, 0x74, 0x79, 0x52, 0x07, - 0x70, 0x65, 0x6e, 0x61, 0x6c, 0x74, 0x79, 0x22, 0x85, 0x01, 0x0a, 0x1b, 0x43, 0x75, 0x72, 0x72, - 0x65, 0x6e, 0x74, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x61, 0x74, 0x65, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 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, 0x12, 0x4b, 0x0a, 0x0c, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x5f, 0x6b, - 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, + 0x2e, 0x55, 0x6e, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x65, 0x52, 0x0d, 0x75, 0x6e, 0x64, + 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x6c, 0x0a, 0x06, 0x55, 0x70, + 0x74, 0x69, 0x6d, 0x65, 0x12, 0x2b, 0x0a, 0x12, 0x61, 0x73, 0x5f, 0x6f, 0x66, 0x5f, 0x62, 0x6c, + 0x6f, 0x63, 0x6b, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, + 0x52, 0x0f, 0x61, 0x73, 0x4f, 0x66, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x69, 0x67, 0x68, + 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x5f, 0x6c, 0x65, 0x6e, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x4c, 0x65, 0x6e, + 0x12, 0x16, 0x0a, 0x06, 0x62, 0x69, 0x74, 0x76, 0x65, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, + 0x52, 0x06, 0x62, 0x69, 0x74, 0x76, 0x65, 0x63, 0x22, 0x68, 0x0a, 0x14, 0x43, 0x75, 0x72, 0x72, + 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x73, 0x65, 0x6e, 0x73, 0x75, 0x73, 0x4b, 0x65, 0x79, 0x73, + 0x12, 0x50, 0x0a, 0x0e, 0x63, 0x6f, 0x6e, 0x73, 0x65, 0x6e, 0x73, 0x75, 0x73, 0x5f, 0x6b, 0x65, + 0x79, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6b, 0x65, 0x79, 0x73, 0x2e, 0x76, 0x31, - 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x4b, - 0x65, 0x79, 0x52, 0x0b, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x4b, 0x65, 0x79, 0x22, - 0x64, 0x0a, 0x1c, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, - 0x74, 0x6f, 0x72, 0x52, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x44, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, + 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x73, 0x65, 0x6e, 0x73, 0x75, 0x73, + 0x4b, 0x65, 0x79, 0x52, 0x0d, 0x63, 0x6f, 0x6e, 0x73, 0x65, 0x6e, 0x73, 0x75, 0x73, 0x4b, 0x65, + 0x79, 0x73, 0x22, 0x1f, 0x0a, 0x07, 0x50, 0x65, 0x6e, 0x61, 0x6c, 0x74, 0x79, 0x12, 0x14, 0x0a, + 0x05, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x69, 0x6e, + 0x6e, 0x65, 0x72, 0x22, 0x56, 0x0a, 0x14, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, + 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 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, 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x68, 0x6f, 0x77, 0x5f, 0x69, + 0x6e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x73, + 0x68, 0x6f, 0x77, 0x49, 0x6e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x22, 0x75, 0x0a, 0x15, 0x56, + 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5c, 0x0a, 0x0e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, + 0x72, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x70, + 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, + 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x74, 0x61, 0x6b, 0x65, 0x2e, 0x76, 0x31, 0x61, + 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x49, + 0x6e, 0x66, 0x6f, 0x52, 0x0d, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x49, 0x6e, + 0x66, 0x6f, 0x22, 0x80, 0x01, 0x0a, 0x16, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 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, 0x12, 0x4b, 0x0a, 0x0c, 0x69, 0x64, 0x65, 0x6e, + 0x74, 0x69, 0x74, 0x79, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, + 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6b, + 0x65, 0x79, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x49, 0x64, 0x65, + 0x6e, 0x74, 0x69, 0x74, 0x79, 0x4b, 0x65, 0x79, 0x52, 0x0b, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, + 0x74, 0x79, 0x4b, 0x65, 0x79, 0x22, 0x6a, 0x0a, 0x17, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, + 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x4f, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x37, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, + 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x74, 0x61, 0x6b, 0x65, + 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, + 0x74, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x22, 0xd5, 0x01, 0x0a, 0x17, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x50, + 0x65, 0x6e, 0x61, 0x6c, 0x74, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 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, 0x12, 0x4b, 0x0a, 0x0c, 0x69, 0x64, 0x65, 0x6e, + 0x74, 0x69, 0x74, 0x79, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, + 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6b, + 0x65, 0x79, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x49, 0x64, 0x65, + 0x6e, 0x74, 0x69, 0x74, 0x79, 0x4b, 0x65, 0x79, 0x52, 0x0b, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, + 0x74, 0x79, 0x4b, 0x65, 0x79, 0x12, 0x2a, 0x0a, 0x11, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x65, + 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, + 0x52, 0x0f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x49, 0x6e, 0x64, 0x65, + 0x78, 0x12, 0x26, 0x0a, 0x0f, 0x65, 0x6e, 0x64, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x69, + 0x6e, 0x64, 0x65, 0x78, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x65, 0x6e, 0x64, 0x45, + 0x70, 0x6f, 0x63, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x65, 0x0a, 0x18, 0x56, 0x61, 0x6c, + 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x50, 0x65, 0x6e, 0x61, 0x6c, 0x74, 0x79, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x49, 0x0a, 0x07, 0x70, 0x65, 0x6e, 0x61, 0x6c, 0x74, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, + 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, + 0x2e, 0x73, 0x74, 0x61, 0x6b, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, + 0x50, 0x65, 0x6e, 0x61, 0x6c, 0x74, 0x79, 0x52, 0x07, 0x70, 0x65, 0x6e, 0x61, 0x6c, 0x74, 0x79, + 0x22, 0x85, 0x01, 0x0a, 0x1b, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x56, 0x61, 0x6c, 0x69, + 0x64, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 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, 0x12, 0x4b, 0x0a, 0x0c, 0x69, + 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x28, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, + 0x65, 0x2e, 0x6b, 0x65, 0x79, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, + 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x4b, 0x65, 0x79, 0x52, 0x0b, 0x69, 0x64, 0x65, + 0x6e, 0x74, 0x69, 0x74, 0x79, 0x4b, 0x65, 0x79, 0x22, 0x64, 0x0a, 0x1c, 0x43, 0x75, 0x72, 0x72, + 0x65, 0x6e, 0x74, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x61, 0x74, 0x65, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x44, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, + 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, + 0x2e, 0x73, 0x74, 0x61, 0x6b, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, + 0x52, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0x87, + 0x03, 0x0a, 0x0f, 0x53, 0x74, 0x61, 0x6b, 0x65, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, + 0x72, 0x73, 0x12, 0x29, 0x0a, 0x10, 0x75, 0x6e, 0x62, 0x6f, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, + 0x65, 0x70, 0x6f, 0x63, 0x68, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0f, 0x75, 0x6e, + 0x62, 0x6f, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x73, 0x12, 0x34, 0x0a, + 0x16, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, + 0x72, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x14, 0x61, + 0x63, 0x74, 0x69, 0x76, 0x65, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x4c, 0x69, + 0x6d, 0x69, 0x74, 0x12, 0x28, 0x0a, 0x10, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x72, 0x65, 0x77, 0x61, + 0x72, 0x64, 0x5f, 0x72, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0e, 0x62, + 0x61, 0x73, 0x65, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x52, 0x61, 0x74, 0x65, 0x12, 0x40, 0x0a, + 0x1c, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x65, 0x6e, 0x61, 0x6c, 0x74, + 0x79, 0x5f, 0x6d, 0x69, 0x73, 0x62, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x04, 0x52, 0x1a, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x69, 0x6e, 0x67, 0x50, 0x65, 0x6e, + 0x61, 0x6c, 0x74, 0x79, 0x4d, 0x69, 0x73, 0x62, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x12, + 0x3a, 0x0a, 0x19, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x65, 0x6e, 0x61, + 0x6c, 0x74, 0x79, 0x5f, 0x64, 0x6f, 0x77, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x04, 0x52, 0x17, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x69, 0x6e, 0x67, 0x50, 0x65, 0x6e, 0x61, + 0x6c, 0x74, 0x79, 0x44, 0x6f, 0x77, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x37, 0x0a, 0x18, 0x73, + 0x69, 0x67, 0x6e, 0x65, 0x64, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x5f, 0x77, 0x69, 0x6e, + 0x64, 0x6f, 0x77, 0x5f, 0x6c, 0x65, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x04, 0x52, 0x15, 0x73, + 0x69, 0x67, 0x6e, 0x65, 0x64, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x57, 0x69, 0x6e, 0x64, 0x6f, + 0x77, 0x4c, 0x65, 0x6e, 0x12, 0x32, 0x0a, 0x15, 0x6d, 0x69, 0x73, 0x73, 0x65, 0x64, 0x5f, 0x62, + 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x5f, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x18, 0x07, 0x20, + 0x01, 0x28, 0x04, 0x52, 0x13, 0x6d, 0x69, 0x73, 0x73, 0x65, 0x64, 0x42, 0x6c, 0x6f, 0x63, 0x6b, + 0x73, 0x4d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x22, 0xbf, 0x01, 0x0a, 0x0e, 0x47, 0x65, 0x6e, + 0x65, 0x73, 0x69, 0x73, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x5a, 0x0a, 0x0c, 0x73, + 0x74, 0x61, 0x6b, 0x65, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x37, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, + 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x74, 0x61, 0x6b, + 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x6b, 0x65, + 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x52, 0x0b, 0x73, 0x74, 0x61, 0x6b, + 0x65, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x51, 0x0a, 0x0a, 0x76, 0x61, 0x6c, 0x69, 0x64, + 0x61, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x70, 0x65, + 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, + 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x74, 0x61, 0x6b, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, + 0x70, 0x68, 0x61, 0x31, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x0a, + 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x73, 0x32, 0xf0, 0x04, 0x0a, 0x0c, 0x51, + 0x75, 0x65, 0x72, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x8e, 0x01, 0x0a, 0x0d, + 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x3c, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x74, 0x61, 0x6b, 0x65, 0x2e, 0x76, 0x31, - 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x52, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x52, - 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0x87, 0x03, 0x0a, 0x0f, 0x53, 0x74, 0x61, 0x6b, 0x65, 0x50, - 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x12, 0x29, 0x0a, 0x10, 0x75, 0x6e, 0x62, - 0x6f, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x73, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x04, 0x52, 0x0f, 0x75, 0x6e, 0x62, 0x6f, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x45, 0x70, - 0x6f, 0x63, 0x68, 0x73, 0x12, 0x34, 0x0a, 0x16, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x76, - 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x04, 0x52, 0x14, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x56, 0x61, 0x6c, 0x69, - 0x64, 0x61, 0x74, 0x6f, 0x72, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x28, 0x0a, 0x10, 0x62, 0x61, - 0x73, 0x65, 0x5f, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x5f, 0x72, 0x61, 0x74, 0x65, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x04, 0x52, 0x0e, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, - 0x52, 0x61, 0x74, 0x65, 0x12, 0x40, 0x0a, 0x1c, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x69, 0x6e, 0x67, - 0x5f, 0x70, 0x65, 0x6e, 0x61, 0x6c, 0x74, 0x79, 0x5f, 0x6d, 0x69, 0x73, 0x62, 0x65, 0x68, 0x61, - 0x76, 0x69, 0x6f, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x1a, 0x73, 0x6c, 0x61, 0x73, - 0x68, 0x69, 0x6e, 0x67, 0x50, 0x65, 0x6e, 0x61, 0x6c, 0x74, 0x79, 0x4d, 0x69, 0x73, 0x62, 0x65, - 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x12, 0x3a, 0x0a, 0x19, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x69, - 0x6e, 0x67, 0x5f, 0x70, 0x65, 0x6e, 0x61, 0x6c, 0x74, 0x79, 0x5f, 0x64, 0x6f, 0x77, 0x6e, 0x74, - 0x69, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x17, 0x73, 0x6c, 0x61, 0x73, 0x68, - 0x69, 0x6e, 0x67, 0x50, 0x65, 0x6e, 0x61, 0x6c, 0x74, 0x79, 0x44, 0x6f, 0x77, 0x6e, 0x74, 0x69, - 0x6d, 0x65, 0x12, 0x37, 0x0a, 0x18, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x5f, 0x62, 0x6c, 0x6f, - 0x63, 0x6b, 0x73, 0x5f, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x5f, 0x6c, 0x65, 0x6e, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x04, 0x52, 0x15, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x42, 0x6c, 0x6f, 0x63, - 0x6b, 0x73, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x4c, 0x65, 0x6e, 0x12, 0x32, 0x0a, 0x15, 0x6d, - 0x69, 0x73, 0x73, 0x65, 0x64, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x5f, 0x6d, 0x61, 0x78, - 0x69, 0x6d, 0x75, 0x6d, 0x18, 0x07, 0x20, 0x01, 0x28, 0x04, 0x52, 0x13, 0x6d, 0x69, 0x73, 0x73, - 0x65, 0x64, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x4d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x22, - 0xbf, 0x01, 0x0a, 0x0e, 0x47, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x43, 0x6f, 0x6e, 0x74, 0x65, - 0x6e, 0x74, 0x12, 0x5a, 0x0a, 0x0c, 0x73, 0x74, 0x61, 0x6b, 0x65, 0x5f, 0x70, 0x61, 0x72, 0x61, - 0x6d, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, - 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, - 0x6e, 0x74, 0x2e, 0x73, 0x74, 0x61, 0x6b, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, - 0x31, 0x2e, 0x53, 0x74, 0x61, 0x6b, 0x65, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, - 0x73, 0x52, 0x0b, 0x73, 0x74, 0x61, 0x6b, 0x65, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x51, - 0x0a, 0x0a, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, - 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x74, 0x61, - 0x6b, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x56, 0x61, 0x6c, 0x69, - 0x64, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x0a, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, - 0x73, 0x32, 0xf0, 0x04, 0x0a, 0x0c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x12, 0x8e, 0x01, 0x0a, 0x0d, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, - 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x3c, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, - 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x73, - 0x74, 0x61, 0x6b, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x56, 0x61, - 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x3d, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, - 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x74, 0x61, - 0x6b, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x56, 0x61, 0x6c, 0x69, - 0x64, 0x61, 0x74, 0x6f, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x30, 0x01, 0x12, 0x92, 0x01, 0x0a, 0x0f, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, - 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x3e, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, + 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, + 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3d, 0x2e, 0x70, 0x65, + 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, + 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x74, 0x61, 0x6b, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, + 0x70, 0x68, 0x61, 0x31, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x49, 0x6e, + 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x30, 0x01, 0x12, 0x92, 0x01, 0x0a, + 0x0f, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x12, 0x3e, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, + 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x74, 0x61, 0x6b, 0x65, + 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, + 0x74, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x3f, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, + 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x74, 0x61, 0x6b, 0x65, + 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, + 0x74, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x95, 0x01, 0x0a, 0x10, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x50, + 0x65, 0x6e, 0x61, 0x6c, 0x74, 0x79, 0x12, 0x3f, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, + 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, + 0x2e, 0x73, 0x74, 0x61, 0x6b, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, + 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x50, 0x65, 0x6e, 0x61, 0x6c, 0x74, 0x79, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x40, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x74, 0x61, 0x6b, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, - 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3f, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, + 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x50, 0x65, 0x6e, 0x61, 0x6c, 0x74, + 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0xa1, 0x01, 0x0a, 0x14, 0x43, 0x75, + 0x72, 0x72, 0x65, 0x6e, 0x74, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x61, + 0x74, 0x65, 0x12, 0x43, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, + 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x74, 0x61, + 0x6b, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x43, 0x75, 0x72, 0x72, + 0x65, 0x6e, 0x74, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x61, 0x74, 0x65, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x44, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x74, 0x61, 0x6b, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, - 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x95, 0x01, 0x0a, 0x10, 0x56, 0x61, 0x6c, - 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x50, 0x65, 0x6e, 0x61, 0x6c, 0x74, 0x79, 0x12, 0x3f, 0x2e, - 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, - 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x74, 0x61, 0x6b, 0x65, 0x2e, 0x76, 0x31, - 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, - 0x50, 0x65, 0x6e, 0x61, 0x6c, 0x74, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x40, - 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, - 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x74, 0x61, 0x6b, 0x65, 0x2e, 0x76, - 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, - 0x72, 0x50, 0x65, 0x6e, 0x61, 0x6c, 0x74, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0xa1, 0x01, 0x0a, 0x14, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x56, 0x61, 0x6c, 0x69, - 0x64, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x61, 0x74, 0x65, 0x12, 0x43, 0x2e, 0x70, 0x65, 0x6e, 0x75, - 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, - 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x74, 0x61, 0x6b, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, - 0x61, 0x31, 0x2e, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, - 0x74, 0x6f, 0x72, 0x52, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x44, - 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, - 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x74, 0x61, 0x6b, 0x65, 0x2e, 0x76, - 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x56, - 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x42, 0xda, 0x02, 0x0a, 0x2a, 0x63, 0x6f, 0x6d, 0x2e, 0x70, 0x65, 0x6e, - 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, - 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x74, 0x61, 0x6b, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, - 0x68, 0x61, 0x31, 0x42, 0x0a, 0x53, 0x74, 0x61, 0x6b, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, - 0x01, 0x5a, 0x63, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x65, - 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2d, 0x7a, 0x6f, 0x6e, 0x65, 0x2f, 0x70, 0x65, 0x6e, 0x75, - 0x6d, 0x62, 0x72, 0x61, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x6f, 0x2f, 0x67, 0x65, - 0x6e, 0x2f, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, - 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2f, 0x73, 0x74, 0x61, 0x6b, 0x65, 0x2f, - 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x3b, 0x73, 0x74, 0x61, 0x6b, 0x65, 0x76, 0x31, - 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0xa2, 0x02, 0x04, 0x50, 0x43, 0x43, 0x53, 0xaa, 0x02, 0x26, - 0x50, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x43, 0x6f, 0x72, 0x65, 0x2e, 0x43, 0x6f, - 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x61, 0x6b, 0x65, 0x2e, 0x56, 0x31, - 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0xca, 0x02, 0x26, 0x50, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, - 0x61, 0x5c, 0x43, 0x6f, 0x72, 0x65, 0x5c, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, - 0x5c, 0x53, 0x74, 0x61, 0x6b, 0x65, 0x5c, 0x56, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0xe2, - 0x02, 0x32, 0x50, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x5c, 0x43, 0x6f, 0x72, 0x65, 0x5c, + 0x2e, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, + 0x72, 0x52, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0xda, 0x02, + 0x0a, 0x2a, 0x63, 0x6f, 0x6d, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, + 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x74, + 0x61, 0x6b, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x42, 0x0a, 0x53, 0x74, + 0x61, 0x6b, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x63, 0x67, 0x69, 0x74, 0x68, + 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2d, + 0x7a, 0x6f, 0x6e, 0x65, 0x2f, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2f, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x6f, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x70, 0x65, 0x6e, 0x75, 0x6d, + 0x62, 0x72, 0x61, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, + 0x6e, 0x74, 0x2f, 0x73, 0x74, 0x61, 0x6b, 0x65, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, + 0x31, 0x3b, 0x73, 0x74, 0x61, 0x6b, 0x65, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0xa2, + 0x02, 0x04, 0x50, 0x43, 0x43, 0x53, 0xaa, 0x02, 0x26, 0x50, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, + 0x61, 0x2e, 0x43, 0x6f, 0x72, 0x65, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, + 0x2e, 0x53, 0x74, 0x61, 0x6b, 0x65, 0x2e, 0x56, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0xca, + 0x02, 0x26, 0x50, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x5c, 0x43, 0x6f, 0x72, 0x65, 0x5c, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x5c, 0x53, 0x74, 0x61, 0x6b, 0x65, 0x5c, - 0x56, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, - 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x2a, 0x50, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x3a, - 0x3a, 0x43, 0x6f, 0x72, 0x65, 0x3a, 0x3a, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, - 0x3a, 0x3a, 0x53, 0x74, 0x61, 0x6b, 0x65, 0x3a, 0x3a, 0x56, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, - 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x56, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0xe2, 0x02, 0x32, 0x50, 0x65, 0x6e, 0x75, 0x6d, + 0x62, 0x72, 0x61, 0x5c, 0x43, 0x6f, 0x72, 0x65, 0x5c, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, + 0x6e, 0x74, 0x5c, 0x53, 0x74, 0x61, 0x6b, 0x65, 0x5c, 0x56, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, + 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x2a, + 0x50, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x3a, 0x3a, 0x43, 0x6f, 0x72, 0x65, 0x3a, 0x3a, + 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x3a, 0x3a, 0x53, 0x74, 0x61, 0x6b, 0x65, + 0x3a, 0x3a, 0x56, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x33, } var ( @@ -2700,7 +2703,7 @@ var file_penumbra_core_component_stake_v1alpha1_stake_proto_goTypes = []interfac (*StakeParameters)(nil), // 30: penumbra.core.component.stake.v1alpha1.StakeParameters (*GenesisContent)(nil), // 31: penumbra.core.component.stake.v1alpha1.GenesisContent (*FundingStream_ToAddress)(nil), // 32: penumbra.core.component.stake.v1alpha1.FundingStream.ToAddress - (*FundingStream_ToDao)(nil), // 33: penumbra.core.component.stake.v1alpha1.FundingStream.ToDao + (*FundingStream_ToCommunityPool)(nil), // 33: penumbra.core.component.stake.v1alpha1.FundingStream.ToCommunityPool (*v1alpha1.IdentityKey)(nil), // 34: penumbra.core.keys.v1alpha1.IdentityKey (*v1alpha1.GovernanceKey)(nil), // 35: penumbra.core.keys.v1alpha1.GovernanceKey (*v1alpha11.Amount)(nil), // 36: penumbra.core.num.v1alpha1.Amount @@ -2713,7 +2716,7 @@ var file_penumbra_core_component_stake_v1alpha1_stake_proto_depIdxs = []int32{ 35, // 2: penumbra.core.component.stake.v1alpha1.Validator.governance_key:type_name -> penumbra.core.keys.v1alpha1.GovernanceKey 34, // 3: penumbra.core.component.stake.v1alpha1.ValidatorList.validator_keys:type_name -> penumbra.core.keys.v1alpha1.IdentityKey 32, // 4: penumbra.core.component.stake.v1alpha1.FundingStream.to_address:type_name -> penumbra.core.component.stake.v1alpha1.FundingStream.ToAddress - 33, // 5: penumbra.core.component.stake.v1alpha1.FundingStream.to_dao:type_name -> penumbra.core.component.stake.v1alpha1.FundingStream.ToDao + 33, // 5: penumbra.core.component.stake.v1alpha1.FundingStream.to_community_pool:type_name -> penumbra.core.component.stake.v1alpha1.FundingStream.ToCommunityPool 34, // 6: penumbra.core.component.stake.v1alpha1.RateData.identity_key:type_name -> penumbra.core.keys.v1alpha1.IdentityKey 34, // 7: penumbra.core.component.stake.v1alpha1.ValidatorStatus.identity_key:type_name -> penumbra.core.keys.v1alpha1.IdentityKey 10, // 8: penumbra.core.component.stake.v1alpha1.ValidatorStatus.state:type_name -> penumbra.core.component.stake.v1alpha1.ValidatorState @@ -3143,7 +3146,7 @@ func file_penumbra_core_component_stake_v1alpha1_stake_proto_init() { } } file_penumbra_core_component_stake_v1alpha1_stake_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*FundingStream_ToDao); i { + switch v := v.(*FundingStream_ToCommunityPool); i { case 0: return &v.state case 1: @@ -3157,7 +3160,7 @@ func file_penumbra_core_component_stake_v1alpha1_stake_proto_init() { } file_penumbra_core_component_stake_v1alpha1_stake_proto_msgTypes[3].OneofWrappers = []interface{}{ (*FundingStream_ToAddress_)(nil), - (*FundingStream_ToDao_)(nil), + (*FundingStream_ToCommunityPool_)(nil), } type x struct{} out := protoimpl.TypeBuilder{ diff --git a/proto/go/gen/penumbra/core/keys/v1alpha1/keys.pb.go b/proto/go/gen/penumbra/core/keys/v1alpha1/keys.pb.go index baec8b610b..a52b10ac90 100644 --- a/proto/go/gen/penumbra/core/keys/v1alpha1/keys.pb.go +++ b/proto/go/gen/penumbra/core/keys/v1alpha1/keys.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.31.0 +// protoc-gen-go v1.32.0 // protoc (unknown) // source: penumbra/core/keys/v1alpha1/keys.proto @@ -261,53 +261,6 @@ func (x *SpendKey) GetInner() []byte { return nil } -type SpendVerificationKey struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Inner []byte `protobuf:"bytes,1,opt,name=inner,proto3" json:"inner,omitempty"` -} - -func (x *SpendVerificationKey) Reset() { - *x = SpendVerificationKey{} - if protoimpl.UnsafeEnabled { - mi := &file_penumbra_core_keys_v1alpha1_keys_proto_msgTypes[4] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *SpendVerificationKey) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*SpendVerificationKey) ProtoMessage() {} - -func (x *SpendVerificationKey) ProtoReflect() protoreflect.Message { - mi := &file_penumbra_core_keys_v1alpha1_keys_proto_msgTypes[4] - 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 SpendVerificationKey.ProtoReflect.Descriptor instead. -func (*SpendVerificationKey) Descriptor() ([]byte, []int) { - return file_penumbra_core_keys_v1alpha1_keys_proto_rawDescGZIP(), []int{4} -} - -func (x *SpendVerificationKey) GetInner() []byte { - if x != nil { - return x.Inner - } - return nil -} - type FullViewingKey struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -319,7 +272,7 @@ type FullViewingKey struct { func (x *FullViewingKey) Reset() { *x = FullViewingKey{} if protoimpl.UnsafeEnabled { - mi := &file_penumbra_core_keys_v1alpha1_keys_proto_msgTypes[5] + mi := &file_penumbra_core_keys_v1alpha1_keys_proto_msgTypes[4] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -332,7 +285,7 @@ func (x *FullViewingKey) String() string { func (*FullViewingKey) ProtoMessage() {} func (x *FullViewingKey) ProtoReflect() protoreflect.Message { - mi := &file_penumbra_core_keys_v1alpha1_keys_proto_msgTypes[5] + mi := &file_penumbra_core_keys_v1alpha1_keys_proto_msgTypes[4] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -345,7 +298,7 @@ func (x *FullViewingKey) ProtoReflect() protoreflect.Message { // Deprecated: Use FullViewingKey.ProtoReflect.Descriptor instead. func (*FullViewingKey) Descriptor() ([]byte, []int) { - return file_penumbra_core_keys_v1alpha1_keys_proto_rawDescGZIP(), []int{5} + return file_penumbra_core_keys_v1alpha1_keys_proto_rawDescGZIP(), []int{4} } func (x *FullViewingKey) GetInner() []byte { @@ -366,7 +319,7 @@ type WalletId struct { func (x *WalletId) Reset() { *x = WalletId{} if protoimpl.UnsafeEnabled { - mi := &file_penumbra_core_keys_v1alpha1_keys_proto_msgTypes[6] + mi := &file_penumbra_core_keys_v1alpha1_keys_proto_msgTypes[5] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -379,7 +332,7 @@ func (x *WalletId) String() string { func (*WalletId) ProtoMessage() {} func (x *WalletId) ProtoReflect() protoreflect.Message { - mi := &file_penumbra_core_keys_v1alpha1_keys_proto_msgTypes[6] + mi := &file_penumbra_core_keys_v1alpha1_keys_proto_msgTypes[5] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -392,7 +345,7 @@ func (x *WalletId) ProtoReflect() protoreflect.Message { // Deprecated: Use WalletId.ProtoReflect.Descriptor instead. func (*WalletId) Descriptor() ([]byte, []int) { - return file_penumbra_core_keys_v1alpha1_keys_proto_rawDescGZIP(), []int{6} + return file_penumbra_core_keys_v1alpha1_keys_proto_rawDescGZIP(), []int{5} } func (x *WalletId) GetInner() []byte { @@ -413,7 +366,7 @@ type Diversifier struct { func (x *Diversifier) Reset() { *x = Diversifier{} if protoimpl.UnsafeEnabled { - mi := &file_penumbra_core_keys_v1alpha1_keys_proto_msgTypes[7] + mi := &file_penumbra_core_keys_v1alpha1_keys_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -426,7 +379,7 @@ func (x *Diversifier) String() string { func (*Diversifier) ProtoMessage() {} func (x *Diversifier) ProtoReflect() protoreflect.Message { - mi := &file_penumbra_core_keys_v1alpha1_keys_proto_msgTypes[7] + mi := &file_penumbra_core_keys_v1alpha1_keys_proto_msgTypes[6] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -439,7 +392,7 @@ func (x *Diversifier) ProtoReflect() protoreflect.Message { // Deprecated: Use Diversifier.ProtoReflect.Descriptor instead. func (*Diversifier) Descriptor() ([]byte, []int) { - return file_penumbra_core_keys_v1alpha1_keys_proto_rawDescGZIP(), []int{7} + return file_penumbra_core_keys_v1alpha1_keys_proto_rawDescGZIP(), []int{6} } func (x *Diversifier) GetInner() []byte { @@ -461,7 +414,7 @@ type AddressIndex struct { func (x *AddressIndex) Reset() { *x = AddressIndex{} if protoimpl.UnsafeEnabled { - mi := &file_penumbra_core_keys_v1alpha1_keys_proto_msgTypes[8] + mi := &file_penumbra_core_keys_v1alpha1_keys_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -474,7 +427,7 @@ func (x *AddressIndex) String() string { func (*AddressIndex) ProtoMessage() {} func (x *AddressIndex) ProtoReflect() protoreflect.Message { - mi := &file_penumbra_core_keys_v1alpha1_keys_proto_msgTypes[8] + mi := &file_penumbra_core_keys_v1alpha1_keys_proto_msgTypes[7] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -487,7 +440,7 @@ func (x *AddressIndex) ProtoReflect() protoreflect.Message { // Deprecated: Use AddressIndex.ProtoReflect.Descriptor instead. func (*AddressIndex) Descriptor() ([]byte, []int) { - return file_penumbra_core_keys_v1alpha1_keys_proto_rawDescGZIP(), []int{8} + return file_penumbra_core_keys_v1alpha1_keys_proto_rawDescGZIP(), []int{7} } func (x *AddressIndex) GetAccount() uint32 { @@ -516,7 +469,7 @@ type IdentityKey struct { func (x *IdentityKey) Reset() { *x = IdentityKey{} if protoimpl.UnsafeEnabled { - mi := &file_penumbra_core_keys_v1alpha1_keys_proto_msgTypes[9] + mi := &file_penumbra_core_keys_v1alpha1_keys_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -529,7 +482,7 @@ func (x *IdentityKey) String() string { func (*IdentityKey) ProtoMessage() {} func (x *IdentityKey) ProtoReflect() protoreflect.Message { - mi := &file_penumbra_core_keys_v1alpha1_keys_proto_msgTypes[9] + mi := &file_penumbra_core_keys_v1alpha1_keys_proto_msgTypes[8] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -542,7 +495,7 @@ func (x *IdentityKey) ProtoReflect() protoreflect.Message { // Deprecated: Use IdentityKey.ProtoReflect.Descriptor instead. func (*IdentityKey) Descriptor() ([]byte, []int) { - return file_penumbra_core_keys_v1alpha1_keys_proto_rawDescGZIP(), []int{9} + return file_penumbra_core_keys_v1alpha1_keys_proto_rawDescGZIP(), []int{8} } func (x *IdentityKey) GetIk() []byte { @@ -564,7 +517,7 @@ type GovernanceKey struct { func (x *GovernanceKey) Reset() { *x = GovernanceKey{} if protoimpl.UnsafeEnabled { - mi := &file_penumbra_core_keys_v1alpha1_keys_proto_msgTypes[10] + mi := &file_penumbra_core_keys_v1alpha1_keys_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -577,7 +530,7 @@ func (x *GovernanceKey) String() string { func (*GovernanceKey) ProtoMessage() {} func (x *GovernanceKey) ProtoReflect() protoreflect.Message { - mi := &file_penumbra_core_keys_v1alpha1_keys_proto_msgTypes[10] + mi := &file_penumbra_core_keys_v1alpha1_keys_proto_msgTypes[9] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -590,7 +543,7 @@ func (x *GovernanceKey) ProtoReflect() protoreflect.Message { // Deprecated: Use GovernanceKey.ProtoReflect.Descriptor instead. func (*GovernanceKey) Descriptor() ([]byte, []int) { - return file_penumbra_core_keys_v1alpha1_keys_proto_rawDescGZIP(), []int{10} + return file_penumbra_core_keys_v1alpha1_keys_proto_rawDescGZIP(), []int{9} } func (x *GovernanceKey) GetGk() []byte { @@ -611,7 +564,7 @@ type ConsensusKey struct { func (x *ConsensusKey) Reset() { *x = ConsensusKey{} if protoimpl.UnsafeEnabled { - mi := &file_penumbra_core_keys_v1alpha1_keys_proto_msgTypes[11] + mi := &file_penumbra_core_keys_v1alpha1_keys_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -624,7 +577,7 @@ func (x *ConsensusKey) String() string { func (*ConsensusKey) ProtoMessage() {} func (x *ConsensusKey) ProtoReflect() protoreflect.Message { - mi := &file_penumbra_core_keys_v1alpha1_keys_proto_msgTypes[11] + mi := &file_penumbra_core_keys_v1alpha1_keys_proto_msgTypes[10] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -637,7 +590,7 @@ func (x *ConsensusKey) ProtoReflect() protoreflect.Message { // Deprecated: Use ConsensusKey.ProtoReflect.Descriptor instead. func (*ConsensusKey) Descriptor() ([]byte, []int) { - return file_penumbra_core_keys_v1alpha1_keys_proto_rawDescGZIP(), []int{11} + return file_penumbra_core_keys_v1alpha1_keys_proto_rawDescGZIP(), []int{10} } func (x *ConsensusKey) GetInner() []byte { @@ -660,7 +613,7 @@ type AddressView_Visible struct { func (x *AddressView_Visible) Reset() { *x = AddressView_Visible{} if protoimpl.UnsafeEnabled { - mi := &file_penumbra_core_keys_v1alpha1_keys_proto_msgTypes[12] + mi := &file_penumbra_core_keys_v1alpha1_keys_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -673,7 +626,7 @@ func (x *AddressView_Visible) String() string { func (*AddressView_Visible) ProtoMessage() {} func (x *AddressView_Visible) ProtoReflect() protoreflect.Message { - mi := &file_penumbra_core_keys_v1alpha1_keys_proto_msgTypes[12] + mi := &file_penumbra_core_keys_v1alpha1_keys_proto_msgTypes[11] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -721,7 +674,7 @@ type AddressView_Opaque struct { func (x *AddressView_Opaque) Reset() { *x = AddressView_Opaque{} if protoimpl.UnsafeEnabled { - mi := &file_penumbra_core_keys_v1alpha1_keys_proto_msgTypes[13] + mi := &file_penumbra_core_keys_v1alpha1_keys_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -734,7 +687,7 @@ func (x *AddressView_Opaque) String() string { func (*AddressView_Opaque) ProtoMessage() {} func (x *AddressView_Opaque) ProtoReflect() protoreflect.Message { - mi := &file_penumbra_core_keys_v1alpha1_keys_proto_msgTypes[13] + mi := &file_penumbra_core_keys_v1alpha1_keys_proto_msgTypes[12] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -802,45 +755,42 @@ var file_penumbra_core_keys_v1alpha1_keys_proto_rawDesc = []byte{ 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x22, 0x20, 0x0a, 0x08, 0x53, 0x70, 0x65, 0x6e, 0x64, 0x4b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x69, 0x6e, 0x6e, 0x65, - 0x72, 0x22, 0x2c, 0x0a, 0x14, 0x53, 0x70, 0x65, 0x6e, 0x64, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x6e, - 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x22, - 0x26, 0x0a, 0x0e, 0x46, 0x75, 0x6c, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x69, 0x6e, 0x67, 0x4b, 0x65, - 0x79, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, - 0x52, 0x05, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x22, 0x20, 0x0a, 0x08, 0x57, 0x61, 0x6c, 0x6c, 0x65, - 0x74, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0c, 0x52, 0x05, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x22, 0x23, 0x0a, 0x0b, 0x44, 0x69, 0x76, - 0x65, 0x72, 0x73, 0x69, 0x66, 0x69, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x6e, 0x65, - 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x22, 0x48, - 0x0a, 0x0c, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x18, - 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x72, 0x61, 0x6e, 0x64, - 0x6f, 0x6d, 0x69, 0x7a, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0a, 0x72, 0x61, - 0x6e, 0x64, 0x6f, 0x6d, 0x69, 0x7a, 0x65, 0x72, 0x22, 0x1d, 0x0a, 0x0b, 0x49, 0x64, 0x65, 0x6e, - 0x74, 0x69, 0x74, 0x79, 0x4b, 0x65, 0x79, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x6b, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0c, 0x52, 0x02, 0x69, 0x6b, 0x22, 0x1f, 0x0a, 0x0d, 0x47, 0x6f, 0x76, 0x65, 0x72, - 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x4b, 0x65, 0x79, 0x12, 0x0e, 0x0a, 0x02, 0x67, 0x6b, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0c, 0x52, 0x02, 0x67, 0x6b, 0x22, 0x24, 0x0a, 0x0c, 0x43, 0x6f, 0x6e, 0x73, - 0x65, 0x6e, 0x73, 0x75, 0x73, 0x4b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x6e, 0x65, - 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x42, 0x94, - 0x02, 0x0a, 0x1f, 0x63, 0x6f, 0x6d, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, - 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6b, 0x65, 0x79, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, - 0x61, 0x31, 0x42, 0x09, 0x4b, 0x65, 0x79, 0x73, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, - 0x57, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x65, 0x6e, 0x75, - 0x6d, 0x62, 0x72, 0x61, 0x2d, 0x7a, 0x6f, 0x6e, 0x65, 0x2f, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, - 0x72, 0x61, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x6f, 0x2f, 0x67, 0x65, 0x6e, 0x2f, - 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x6b, 0x65, - 0x79, 0x73, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x3b, 0x6b, 0x65, 0x79, 0x73, - 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0xa2, 0x02, 0x03, 0x50, 0x43, 0x4b, 0xaa, 0x02, - 0x1b, 0x50, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x43, 0x6f, 0x72, 0x65, 0x2e, 0x4b, - 0x65, 0x79, 0x73, 0x2e, 0x56, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0xca, 0x02, 0x1b, 0x50, + 0x72, 0x22, 0x26, 0x0a, 0x0e, 0x46, 0x75, 0x6c, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x69, 0x6e, 0x67, + 0x4b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0c, 0x52, 0x05, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x22, 0x20, 0x0a, 0x08, 0x57, 0x61, 0x6c, + 0x6c, 0x65, 0x74, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x22, 0x23, 0x0a, 0x0b, 0x44, + 0x69, 0x76, 0x65, 0x72, 0x73, 0x69, 0x66, 0x69, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, + 0x6e, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x69, 0x6e, 0x6e, 0x65, 0x72, + 0x22, 0x48, 0x0a, 0x0c, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x49, 0x6e, 0x64, 0x65, 0x78, + 0x12, 0x18, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x72, 0x61, + 0x6e, 0x64, 0x6f, 0x6d, 0x69, 0x7a, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0a, + 0x72, 0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x69, 0x7a, 0x65, 0x72, 0x22, 0x1d, 0x0a, 0x0b, 0x49, 0x64, + 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x4b, 0x65, 0x79, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x6b, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x02, 0x69, 0x6b, 0x22, 0x1f, 0x0a, 0x0d, 0x47, 0x6f, 0x76, + 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x4b, 0x65, 0x79, 0x12, 0x0e, 0x0a, 0x02, 0x67, 0x6b, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x02, 0x67, 0x6b, 0x22, 0x24, 0x0a, 0x0c, 0x43, 0x6f, + 0x6e, 0x73, 0x65, 0x6e, 0x73, 0x75, 0x73, 0x4b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, + 0x6e, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x69, 0x6e, 0x6e, 0x65, 0x72, + 0x42, 0x94, 0x02, 0x0a, 0x1f, 0x63, 0x6f, 0x6d, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, + 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6b, 0x65, 0x79, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, + 0x70, 0x68, 0x61, 0x31, 0x42, 0x09, 0x4b, 0x65, 0x79, 0x73, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, + 0x01, 0x5a, 0x57, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x65, + 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2d, 0x7a, 0x6f, 0x6e, 0x65, 0x2f, 0x70, 0x65, 0x6e, 0x75, + 0x6d, 0x62, 0x72, 0x61, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x6f, 0x2f, 0x67, 0x65, + 0x6e, 0x2f, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, + 0x6b, 0x65, 0x79, 0x73, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x3b, 0x6b, 0x65, + 0x79, 0x73, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0xa2, 0x02, 0x03, 0x50, 0x43, 0x4b, + 0xaa, 0x02, 0x1b, 0x50, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x43, 0x6f, 0x72, 0x65, + 0x2e, 0x4b, 0x65, 0x79, 0x73, 0x2e, 0x56, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0xca, 0x02, + 0x1b, 0x50, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x5c, 0x43, 0x6f, 0x72, 0x65, 0x5c, 0x4b, + 0x65, 0x79, 0x73, 0x5c, 0x56, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0xe2, 0x02, 0x27, 0x50, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x5c, 0x43, 0x6f, 0x72, 0x65, 0x5c, 0x4b, 0x65, 0x79, - 0x73, 0x5c, 0x56, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0xe2, 0x02, 0x27, 0x50, 0x65, 0x6e, - 0x75, 0x6d, 0x62, 0x72, 0x61, 0x5c, 0x43, 0x6f, 0x72, 0x65, 0x5c, 0x4b, 0x65, 0x79, 0x73, 0x5c, - 0x56, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, - 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x1e, 0x50, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x3a, - 0x3a, 0x43, 0x6f, 0x72, 0x65, 0x3a, 0x3a, 0x4b, 0x65, 0x79, 0x73, 0x3a, 0x3a, 0x56, 0x31, 0x61, - 0x6c, 0x70, 0x68, 0x61, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x73, 0x5c, 0x56, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, + 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x1e, 0x50, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, + 0x61, 0x3a, 0x3a, 0x43, 0x6f, 0x72, 0x65, 0x3a, 0x3a, 0x4b, 0x65, 0x79, 0x73, 0x3a, 0x3a, 0x56, + 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -855,29 +805,28 @@ func file_penumbra_core_keys_v1alpha1_keys_proto_rawDescGZIP() []byte { return file_penumbra_core_keys_v1alpha1_keys_proto_rawDescData } -var file_penumbra_core_keys_v1alpha1_keys_proto_msgTypes = make([]protoimpl.MessageInfo, 14) +var file_penumbra_core_keys_v1alpha1_keys_proto_msgTypes = make([]protoimpl.MessageInfo, 13) var file_penumbra_core_keys_v1alpha1_keys_proto_goTypes = []interface{}{ - (*Address)(nil), // 0: penumbra.core.keys.v1alpha1.Address - (*AddressView)(nil), // 1: penumbra.core.keys.v1alpha1.AddressView - (*PayloadKey)(nil), // 2: penumbra.core.keys.v1alpha1.PayloadKey - (*SpendKey)(nil), // 3: penumbra.core.keys.v1alpha1.SpendKey - (*SpendVerificationKey)(nil), // 4: penumbra.core.keys.v1alpha1.SpendVerificationKey - (*FullViewingKey)(nil), // 5: penumbra.core.keys.v1alpha1.FullViewingKey - (*WalletId)(nil), // 6: penumbra.core.keys.v1alpha1.WalletId - (*Diversifier)(nil), // 7: penumbra.core.keys.v1alpha1.Diversifier - (*AddressIndex)(nil), // 8: penumbra.core.keys.v1alpha1.AddressIndex - (*IdentityKey)(nil), // 9: penumbra.core.keys.v1alpha1.IdentityKey - (*GovernanceKey)(nil), // 10: penumbra.core.keys.v1alpha1.GovernanceKey - (*ConsensusKey)(nil), // 11: penumbra.core.keys.v1alpha1.ConsensusKey - (*AddressView_Visible)(nil), // 12: penumbra.core.keys.v1alpha1.AddressView.Visible - (*AddressView_Opaque)(nil), // 13: penumbra.core.keys.v1alpha1.AddressView.Opaque + (*Address)(nil), // 0: penumbra.core.keys.v1alpha1.Address + (*AddressView)(nil), // 1: penumbra.core.keys.v1alpha1.AddressView + (*PayloadKey)(nil), // 2: penumbra.core.keys.v1alpha1.PayloadKey + (*SpendKey)(nil), // 3: penumbra.core.keys.v1alpha1.SpendKey + (*FullViewingKey)(nil), // 4: penumbra.core.keys.v1alpha1.FullViewingKey + (*WalletId)(nil), // 5: penumbra.core.keys.v1alpha1.WalletId + (*Diversifier)(nil), // 6: penumbra.core.keys.v1alpha1.Diversifier + (*AddressIndex)(nil), // 7: penumbra.core.keys.v1alpha1.AddressIndex + (*IdentityKey)(nil), // 8: penumbra.core.keys.v1alpha1.IdentityKey + (*GovernanceKey)(nil), // 9: penumbra.core.keys.v1alpha1.GovernanceKey + (*ConsensusKey)(nil), // 10: penumbra.core.keys.v1alpha1.ConsensusKey + (*AddressView_Visible)(nil), // 11: penumbra.core.keys.v1alpha1.AddressView.Visible + (*AddressView_Opaque)(nil), // 12: penumbra.core.keys.v1alpha1.AddressView.Opaque } var file_penumbra_core_keys_v1alpha1_keys_proto_depIdxs = []int32{ - 12, // 0: penumbra.core.keys.v1alpha1.AddressView.visible:type_name -> penumbra.core.keys.v1alpha1.AddressView.Visible - 13, // 1: penumbra.core.keys.v1alpha1.AddressView.opaque:type_name -> penumbra.core.keys.v1alpha1.AddressView.Opaque + 11, // 0: penumbra.core.keys.v1alpha1.AddressView.visible:type_name -> penumbra.core.keys.v1alpha1.AddressView.Visible + 12, // 1: penumbra.core.keys.v1alpha1.AddressView.opaque:type_name -> penumbra.core.keys.v1alpha1.AddressView.Opaque 0, // 2: penumbra.core.keys.v1alpha1.AddressView.Visible.address:type_name -> penumbra.core.keys.v1alpha1.Address - 8, // 3: penumbra.core.keys.v1alpha1.AddressView.Visible.index:type_name -> penumbra.core.keys.v1alpha1.AddressIndex - 6, // 4: penumbra.core.keys.v1alpha1.AddressView.Visible.wallet_id:type_name -> penumbra.core.keys.v1alpha1.WalletId + 7, // 3: penumbra.core.keys.v1alpha1.AddressView.Visible.index:type_name -> penumbra.core.keys.v1alpha1.AddressIndex + 5, // 4: penumbra.core.keys.v1alpha1.AddressView.Visible.wallet_id:type_name -> penumbra.core.keys.v1alpha1.WalletId 0, // 5: penumbra.core.keys.v1alpha1.AddressView.Opaque.address:type_name -> penumbra.core.keys.v1alpha1.Address 6, // [6:6] is the sub-list for method output_type 6, // [6:6] is the sub-list for method input_type @@ -941,18 +890,6 @@ func file_penumbra_core_keys_v1alpha1_keys_proto_init() { } } file_penumbra_core_keys_v1alpha1_keys_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SpendVerificationKey); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_penumbra_core_keys_v1alpha1_keys_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*FullViewingKey); i { case 0: return &v.state @@ -964,7 +901,7 @@ func file_penumbra_core_keys_v1alpha1_keys_proto_init() { return nil } } - file_penumbra_core_keys_v1alpha1_keys_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { + file_penumbra_core_keys_v1alpha1_keys_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*WalletId); i { case 0: return &v.state @@ -976,7 +913,7 @@ func file_penumbra_core_keys_v1alpha1_keys_proto_init() { return nil } } - file_penumbra_core_keys_v1alpha1_keys_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { + file_penumbra_core_keys_v1alpha1_keys_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Diversifier); i { case 0: return &v.state @@ -988,7 +925,7 @@ func file_penumbra_core_keys_v1alpha1_keys_proto_init() { return nil } } - file_penumbra_core_keys_v1alpha1_keys_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { + file_penumbra_core_keys_v1alpha1_keys_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*AddressIndex); i { case 0: return &v.state @@ -1000,7 +937,7 @@ func file_penumbra_core_keys_v1alpha1_keys_proto_init() { return nil } } - file_penumbra_core_keys_v1alpha1_keys_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { + file_penumbra_core_keys_v1alpha1_keys_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*IdentityKey); i { case 0: return &v.state @@ -1012,7 +949,7 @@ func file_penumbra_core_keys_v1alpha1_keys_proto_init() { return nil } } - file_penumbra_core_keys_v1alpha1_keys_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { + file_penumbra_core_keys_v1alpha1_keys_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GovernanceKey); i { case 0: return &v.state @@ -1024,7 +961,7 @@ func file_penumbra_core_keys_v1alpha1_keys_proto_init() { return nil } } - file_penumbra_core_keys_v1alpha1_keys_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { + file_penumbra_core_keys_v1alpha1_keys_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ConsensusKey); i { case 0: return &v.state @@ -1036,7 +973,7 @@ func file_penumbra_core_keys_v1alpha1_keys_proto_init() { return nil } } - file_penumbra_core_keys_v1alpha1_keys_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { + file_penumbra_core_keys_v1alpha1_keys_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*AddressView_Visible); i { case 0: return &v.state @@ -1048,7 +985,7 @@ func file_penumbra_core_keys_v1alpha1_keys_proto_init() { return nil } } - file_penumbra_core_keys_v1alpha1_keys_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { + file_penumbra_core_keys_v1alpha1_keys_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*AddressView_Opaque); i { case 0: return &v.state @@ -1071,7 +1008,7 @@ func file_penumbra_core_keys_v1alpha1_keys_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_penumbra_core_keys_v1alpha1_keys_proto_rawDesc, NumEnums: 0, - NumMessages: 14, + NumMessages: 13, NumExtensions: 0, NumServices: 0, }, diff --git a/proto/go/gen/penumbra/core/num/v1alpha1/num.pb.go b/proto/go/gen/penumbra/core/num/v1alpha1/num.pb.go index 216c2ebd29..6c8b9b629e 100644 --- a/proto/go/gen/penumbra/core/num/v1alpha1/num.pb.go +++ b/proto/go/gen/penumbra/core/num/v1alpha1/num.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.31.0 +// protoc-gen-go v1.32.0 // protoc (unknown) // source: penumbra/core/num/v1alpha1/num.proto diff --git a/proto/go/gen/penumbra/core/transaction/v1alpha1/transaction.pb.go b/proto/go/gen/penumbra/core/transaction/v1alpha1/transaction.pb.go index 7dfffb9a29..13e1bb2f81 100644 --- a/proto/go/gen/penumbra/core/transaction/v1alpha1/transaction.pb.go +++ b/proto/go/gen/penumbra/core/transaction/v1alpha1/transaction.pb.go @@ -1,24 +1,25 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.31.0 +// protoc-gen-go v1.32.0 // protoc (unknown) // source: penumbra/core/transaction/v1alpha1/transaction.proto package transactionv1alpha1 import ( - v1alpha19 "github.com/penumbra-zone/penumbra/proto/go/gen/penumbra/core/asset/v1alpha1" - v1alpha14 "github.com/penumbra-zone/penumbra/proto/go/gen/penumbra/core/component/dex/v1alpha1" - v1alpha11 "github.com/penumbra-zone/penumbra/proto/go/gen/penumbra/core/component/fee/v1alpha1" - v1alpha17 "github.com/penumbra-zone/penumbra/proto/go/gen/penumbra/core/component/governance/v1alpha1" - v1alpha16 "github.com/penumbra-zone/penumbra/proto/go/gen/penumbra/core/component/ibc/v1alpha1" - v1alpha110 "github.com/penumbra-zone/penumbra/proto/go/gen/penumbra/core/component/sct/v1alpha1" - v1alpha13 "github.com/penumbra-zone/penumbra/proto/go/gen/penumbra/core/component/shielded_pool/v1alpha1" - v1alpha15 "github.com/penumbra-zone/penumbra/proto/go/gen/penumbra/core/component/stake/v1alpha1" - v1alpha18 "github.com/penumbra-zone/penumbra/proto/go/gen/penumbra/core/keys/v1alpha1" - v1alpha12 "github.com/penumbra-zone/penumbra/proto/go/gen/penumbra/crypto/decaf377_fmd/v1alpha1" - v1alpha111 "github.com/penumbra-zone/penumbra/proto/go/gen/penumbra/crypto/decaf377_rdsa/v1alpha1" - v1alpha1 "github.com/penumbra-zone/penumbra/proto/go/gen/penumbra/crypto/tct/v1alpha1" + v1alpha110 "github.com/penumbra-zone/penumbra/proto/go/gen/penumbra/core/asset/v1alpha1" + v1alpha15 "github.com/penumbra-zone/penumbra/proto/go/gen/penumbra/core/component/dex/v1alpha1" + v1alpha12 "github.com/penumbra-zone/penumbra/proto/go/gen/penumbra/core/component/fee/v1alpha1" + v1alpha18 "github.com/penumbra-zone/penumbra/proto/go/gen/penumbra/core/component/governance/v1alpha1" + v1alpha17 "github.com/penumbra-zone/penumbra/proto/go/gen/penumbra/core/component/ibc/v1alpha1" + v1alpha112 "github.com/penumbra-zone/penumbra/proto/go/gen/penumbra/core/component/sct/v1alpha1" + v1alpha14 "github.com/penumbra-zone/penumbra/proto/go/gen/penumbra/core/component/shielded_pool/v1alpha1" + v1alpha16 "github.com/penumbra-zone/penumbra/proto/go/gen/penumbra/core/component/stake/v1alpha1" + v1alpha19 "github.com/penumbra-zone/penumbra/proto/go/gen/penumbra/core/keys/v1alpha1" + v1alpha111 "github.com/penumbra-zone/penumbra/proto/go/gen/penumbra/core/txhash/v1alpha1" + v1alpha13 "github.com/penumbra-zone/penumbra/proto/go/gen/penumbra/crypto/decaf377_fmd/v1alpha1" + v1alpha1 "github.com/penumbra-zone/penumbra/proto/go/gen/penumbra/crypto/decaf377_rdsa/v1alpha1" + v1alpha11 "github.com/penumbra-zone/penumbra/proto/go/gen/penumbra/crypto/tct/v1alpha1" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" reflect "reflect" @@ -40,10 +41,10 @@ type Transaction struct { Body *TransactionBody `protobuf:"bytes,1,opt,name=body,proto3" json:"body,omitempty"` // The binding signature is stored separately from the transaction body that it signs. - BindingSig []byte `protobuf:"bytes,2,opt,name=binding_sig,json=bindingSig,proto3" json:"binding_sig,omitempty"` + BindingSig *v1alpha1.BindingSignature `protobuf:"bytes,2,opt,name=binding_sig,json=bindingSig,proto3" json:"binding_sig,omitempty"` // The root of some previous state of the state commitment tree, used as an anchor for all // ZK state transition proofs. - Anchor *v1alpha1.MerkleRoot `protobuf:"bytes,3,opt,name=anchor,proto3" json:"anchor,omitempty"` + Anchor *v1alpha11.MerkleRoot `protobuf:"bytes,3,opt,name=anchor,proto3" json:"anchor,omitempty"` } func (x *Transaction) Reset() { @@ -85,68 +86,20 @@ func (x *Transaction) GetBody() *TransactionBody { return nil } -func (x *Transaction) GetBindingSig() []byte { +func (x *Transaction) GetBindingSig() *v1alpha1.BindingSignature { if x != nil { return x.BindingSig } return nil } -func (x *Transaction) GetAnchor() *v1alpha1.MerkleRoot { +func (x *Transaction) GetAnchor() *v1alpha11.MerkleRoot { if x != nil { return x.Anchor } return nil } -// A transaction ID, the Sha256 hash of a transaction. -type Id struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Hash []byte `protobuf:"bytes,1,opt,name=hash,proto3" json:"hash,omitempty"` -} - -func (x *Id) Reset() { - *x = Id{} - if protoimpl.UnsafeEnabled { - mi := &file_penumbra_core_transaction_v1alpha1_transaction_proto_msgTypes[1] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *Id) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*Id) ProtoMessage() {} - -func (x *Id) ProtoReflect() protoreflect.Message { - mi := &file_penumbra_core_transaction_v1alpha1_transaction_proto_msgTypes[1] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use Id.ProtoReflect.Descriptor instead. -func (*Id) Descriptor() ([]byte, []int) { - return file_penumbra_core_transaction_v1alpha1_transaction_proto_rawDescGZIP(), []int{1} -} - -func (x *Id) GetHash() []byte { - if x != nil { - return x.Hash - } - return nil -} - // The body of a transaction. type TransactionBody struct { state protoimpl.MessageState @@ -157,18 +110,18 @@ type TransactionBody struct { Actions []*Action `protobuf:"bytes,1,rep,name=actions,proto3" json:"actions,omitempty"` // Parameters determining if a transaction should be accepted by this chain. TransactionParameters *TransactionParameters `protobuf:"bytes,2,opt,name=transaction_parameters,json=transactionParameters,proto3" json:"transaction_parameters,omitempty"` - // The transaction fee. - Fee *v1alpha11.Fee `protobuf:"bytes,3,opt,name=fee,proto3" json:"fee,omitempty"` // Detection data for use with Fuzzy Message Detection DetectionData *DetectionData `protobuf:"bytes,4,opt,name=detection_data,json=detectionData,proto3" json:"detection_data,omitempty"` - // Sub-message containing memo ciphertext if a memo was added to the transaction. - MemoData *MemoData `protobuf:"bytes,5,opt,name=memo_data,json=memoData,proto3" json:"memo_data,omitempty"` + // The encrypted memo for this transaction. + // + // This field will be present if and only if the transaction has outputs. + Memo *MemoCiphertext `protobuf:"bytes,5,opt,name=memo,proto3" json:"memo,omitempty"` } func (x *TransactionBody) Reset() { *x = TransactionBody{} if protoimpl.UnsafeEnabled { - mi := &file_penumbra_core_transaction_v1alpha1_transaction_proto_msgTypes[2] + mi := &file_penumbra_core_transaction_v1alpha1_transaction_proto_msgTypes[1] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -181,7 +134,7 @@ func (x *TransactionBody) String() string { func (*TransactionBody) ProtoMessage() {} func (x *TransactionBody) ProtoReflect() protoreflect.Message { - mi := &file_penumbra_core_transaction_v1alpha1_transaction_proto_msgTypes[2] + mi := &file_penumbra_core_transaction_v1alpha1_transaction_proto_msgTypes[1] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -194,7 +147,7 @@ func (x *TransactionBody) ProtoReflect() protoreflect.Message { // Deprecated: Use TransactionBody.ProtoReflect.Descriptor instead. func (*TransactionBody) Descriptor() ([]byte, []int) { - return file_penumbra_core_transaction_v1alpha1_transaction_proto_rawDescGZIP(), []int{2} + return file_penumbra_core_transaction_v1alpha1_transaction_proto_rawDescGZIP(), []int{1} } func (x *TransactionBody) GetActions() []*Action { @@ -211,13 +164,6 @@ func (x *TransactionBody) GetTransactionParameters() *TransactionParameters { return nil } -func (x *TransactionBody) GetFee() *v1alpha11.Fee { - if x != nil { - return x.Fee - } - return nil -} - func (x *TransactionBody) GetDetectionData() *DetectionData { if x != nil { return x.DetectionData @@ -225,59 +171,9 @@ func (x *TransactionBody) GetDetectionData() *DetectionData { return nil } -func (x *TransactionBody) GetMemoData() *MemoData { - if x != nil { - return x.MemoData - } - return nil -} - -// Represents the encrypted memo data. -type MemoData struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // The encrypted data. It will only be populated if there are - // outputs in the actions of the transaction. 528 bytes. - EncryptedMemo []byte `protobuf:"bytes,1,opt,name=encrypted_memo,json=encryptedMemo,proto3" json:"encrypted_memo,omitempty"` -} - -func (x *MemoData) Reset() { - *x = MemoData{} - if protoimpl.UnsafeEnabled { - mi := &file_penumbra_core_transaction_v1alpha1_transaction_proto_msgTypes[3] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *MemoData) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*MemoData) ProtoMessage() {} - -func (x *MemoData) ProtoReflect() protoreflect.Message { - mi := &file_penumbra_core_transaction_v1alpha1_transaction_proto_msgTypes[3] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use MemoData.ProtoReflect.Descriptor instead. -func (*MemoData) Descriptor() ([]byte, []int) { - return file_penumbra_core_transaction_v1alpha1_transaction_proto_rawDescGZIP(), []int{3} -} - -func (x *MemoData) GetEncryptedMemo() []byte { +func (x *TransactionBody) GetMemo() *MemoCiphertext { if x != nil { - return x.EncryptedMemo + return x.Memo } return nil } @@ -295,12 +191,14 @@ type TransactionParameters struct { // The chain this transaction is intended for. Including this prevents // replaying a transaction on one chain onto a different chain. ChainId string `protobuf:"bytes,2,opt,name=chain_id,json=chainId,proto3" json:"chain_id,omitempty"` + // The transaction fee. + Fee *v1alpha12.Fee `protobuf:"bytes,3,opt,name=fee,proto3" json:"fee,omitempty"` } func (x *TransactionParameters) Reset() { *x = TransactionParameters{} if protoimpl.UnsafeEnabled { - mi := &file_penumbra_core_transaction_v1alpha1_transaction_proto_msgTypes[4] + mi := &file_penumbra_core_transaction_v1alpha1_transaction_proto_msgTypes[2] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -313,7 +211,7 @@ func (x *TransactionParameters) String() string { func (*TransactionParameters) ProtoMessage() {} func (x *TransactionParameters) ProtoReflect() protoreflect.Message { - mi := &file_penumbra_core_transaction_v1alpha1_transaction_proto_msgTypes[4] + mi := &file_penumbra_core_transaction_v1alpha1_transaction_proto_msgTypes[2] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -326,7 +224,7 @@ func (x *TransactionParameters) ProtoReflect() protoreflect.Message { // Deprecated: Use TransactionParameters.ProtoReflect.Descriptor instead. func (*TransactionParameters) Descriptor() ([]byte, []int) { - return file_penumbra_core_transaction_v1alpha1_transaction_proto_rawDescGZIP(), []int{4} + return file_penumbra_core_transaction_v1alpha1_transaction_proto_rawDescGZIP(), []int{2} } func (x *TransactionParameters) GetExpiryHeight() uint64 { @@ -343,6 +241,13 @@ func (x *TransactionParameters) GetChainId() string { return "" } +func (x *TransactionParameters) GetFee() *v1alpha12.Fee { + if x != nil { + return x.Fee + } + return nil +} + // Detection data used by a detection server performing Fuzzy Message Detection. type DetectionData struct { state protoimpl.MessageState @@ -350,13 +255,13 @@ type DetectionData struct { unknownFields protoimpl.UnknownFields // A list of clues for use with Fuzzy Message Detection. - FmdClues []*v1alpha12.Clue `protobuf:"bytes,4,rep,name=fmd_clues,json=fmdClues,proto3" json:"fmd_clues,omitempty"` + FmdClues []*v1alpha13.Clue `protobuf:"bytes,4,rep,name=fmd_clues,json=fmdClues,proto3" json:"fmd_clues,omitempty"` } func (x *DetectionData) Reset() { *x = DetectionData{} if protoimpl.UnsafeEnabled { - mi := &file_penumbra_core_transaction_v1alpha1_transaction_proto_msgTypes[5] + mi := &file_penumbra_core_transaction_v1alpha1_transaction_proto_msgTypes[3] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -369,7 +274,7 @@ func (x *DetectionData) String() string { func (*DetectionData) ProtoMessage() {} func (x *DetectionData) ProtoReflect() protoreflect.Message { - mi := &file_penumbra_core_transaction_v1alpha1_transaction_proto_msgTypes[5] + mi := &file_penumbra_core_transaction_v1alpha1_transaction_proto_msgTypes[3] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -382,10 +287,10 @@ func (x *DetectionData) ProtoReflect() protoreflect.Message { // Deprecated: Use DetectionData.ProtoReflect.Descriptor instead. func (*DetectionData) Descriptor() ([]byte, []int) { - return file_penumbra_core_transaction_v1alpha1_transaction_proto_rawDescGZIP(), []int{5} + return file_penumbra_core_transaction_v1alpha1_transaction_proto_rawDescGZIP(), []int{3} } -func (x *DetectionData) GetFmdClues() []*v1alpha12.Clue { +func (x *DetectionData) GetFmdClues() []*v1alpha13.Clue { if x != nil { return x.FmdClues } @@ -418,9 +323,9 @@ type Action struct { // *Action_Delegate // *Action_Undelegate // *Action_UndelegateClaim - // *Action_DaoSpend - // *Action_DaoOutput - // *Action_DaoDeposit + // *Action_CommunityPoolSpend + // *Action_CommunityPoolOutput + // *Action_CommunityPoolDeposit // *Action_Ics20Withdrawal Action isAction_Action `protobuf_oneof:"action"` } @@ -428,7 +333,7 @@ type Action struct { func (x *Action) Reset() { *x = Action{} if protoimpl.UnsafeEnabled { - mi := &file_penumbra_core_transaction_v1alpha1_transaction_proto_msgTypes[6] + mi := &file_penumbra_core_transaction_v1alpha1_transaction_proto_msgTypes[4] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -441,7 +346,7 @@ func (x *Action) String() string { func (*Action) ProtoMessage() {} func (x *Action) ProtoReflect() protoreflect.Message { - mi := &file_penumbra_core_transaction_v1alpha1_transaction_proto_msgTypes[6] + mi := &file_penumbra_core_transaction_v1alpha1_transaction_proto_msgTypes[4] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -454,7 +359,7 @@ func (x *Action) ProtoReflect() protoreflect.Message { // Deprecated: Use Action.ProtoReflect.Descriptor instead. func (*Action) Descriptor() ([]byte, []int) { - return file_penumbra_core_transaction_v1alpha1_transaction_proto_rawDescGZIP(), []int{6} + return file_penumbra_core_transaction_v1alpha1_transaction_proto_rawDescGZIP(), []int{4} } func (m *Action) GetAction() isAction_Action { @@ -464,154 +369,154 @@ func (m *Action) GetAction() isAction_Action { return nil } -func (x *Action) GetSpend() *v1alpha13.Spend { +func (x *Action) GetSpend() *v1alpha14.Spend { if x, ok := x.GetAction().(*Action_Spend); ok { return x.Spend } return nil } -func (x *Action) GetOutput() *v1alpha13.Output { +func (x *Action) GetOutput() *v1alpha14.Output { if x, ok := x.GetAction().(*Action_Output); ok { return x.Output } return nil } -func (x *Action) GetSwap() *v1alpha14.Swap { +func (x *Action) GetSwap() *v1alpha15.Swap { if x, ok := x.GetAction().(*Action_Swap); ok { return x.Swap } return nil } -func (x *Action) GetSwapClaim() *v1alpha14.SwapClaim { +func (x *Action) GetSwapClaim() *v1alpha15.SwapClaim { if x, ok := x.GetAction().(*Action_SwapClaim); ok { return x.SwapClaim } return nil } -func (x *Action) GetValidatorDefinition() *v1alpha15.ValidatorDefinition { +func (x *Action) GetValidatorDefinition() *v1alpha16.ValidatorDefinition { if x, ok := x.GetAction().(*Action_ValidatorDefinition); ok { return x.ValidatorDefinition } return nil } -func (x *Action) GetIbcRelayAction() *v1alpha16.IbcRelay { +func (x *Action) GetIbcRelayAction() *v1alpha17.IbcRelay { if x, ok := x.GetAction().(*Action_IbcRelayAction); ok { return x.IbcRelayAction } return nil } -func (x *Action) GetProposalSubmit() *v1alpha17.ProposalSubmit { +func (x *Action) GetProposalSubmit() *v1alpha18.ProposalSubmit { if x, ok := x.GetAction().(*Action_ProposalSubmit); ok { return x.ProposalSubmit } return nil } -func (x *Action) GetProposalWithdraw() *v1alpha17.ProposalWithdraw { +func (x *Action) GetProposalWithdraw() *v1alpha18.ProposalWithdraw { if x, ok := x.GetAction().(*Action_ProposalWithdraw); ok { return x.ProposalWithdraw } return nil } -func (x *Action) GetValidatorVote() *v1alpha17.ValidatorVote { +func (x *Action) GetValidatorVote() *v1alpha18.ValidatorVote { if x, ok := x.GetAction().(*Action_ValidatorVote); ok { return x.ValidatorVote } return nil } -func (x *Action) GetDelegatorVote() *v1alpha17.DelegatorVote { +func (x *Action) GetDelegatorVote() *v1alpha18.DelegatorVote { if x, ok := x.GetAction().(*Action_DelegatorVote); ok { return x.DelegatorVote } return nil } -func (x *Action) GetProposalDepositClaim() *v1alpha17.ProposalDepositClaim { +func (x *Action) GetProposalDepositClaim() *v1alpha18.ProposalDepositClaim { if x, ok := x.GetAction().(*Action_ProposalDepositClaim); ok { return x.ProposalDepositClaim } return nil } -func (x *Action) GetPositionOpen() *v1alpha14.PositionOpen { +func (x *Action) GetPositionOpen() *v1alpha15.PositionOpen { if x, ok := x.GetAction().(*Action_PositionOpen); ok { return x.PositionOpen } return nil } -func (x *Action) GetPositionClose() *v1alpha14.PositionClose { +func (x *Action) GetPositionClose() *v1alpha15.PositionClose { if x, ok := x.GetAction().(*Action_PositionClose); ok { return x.PositionClose } return nil } -func (x *Action) GetPositionWithdraw() *v1alpha14.PositionWithdraw { +func (x *Action) GetPositionWithdraw() *v1alpha15.PositionWithdraw { if x, ok := x.GetAction().(*Action_PositionWithdraw); ok { return x.PositionWithdraw } return nil } -func (x *Action) GetPositionRewardClaim() *v1alpha14.PositionRewardClaim { +func (x *Action) GetPositionRewardClaim() *v1alpha15.PositionRewardClaim { if x, ok := x.GetAction().(*Action_PositionRewardClaim); ok { return x.PositionRewardClaim } return nil } -func (x *Action) GetDelegate() *v1alpha15.Delegate { +func (x *Action) GetDelegate() *v1alpha16.Delegate { if x, ok := x.GetAction().(*Action_Delegate); ok { return x.Delegate } return nil } -func (x *Action) GetUndelegate() *v1alpha15.Undelegate { +func (x *Action) GetUndelegate() *v1alpha16.Undelegate { if x, ok := x.GetAction().(*Action_Undelegate); ok { return x.Undelegate } return nil } -func (x *Action) GetUndelegateClaim() *v1alpha15.UndelegateClaim { +func (x *Action) GetUndelegateClaim() *v1alpha16.UndelegateClaim { if x, ok := x.GetAction().(*Action_UndelegateClaim); ok { return x.UndelegateClaim } return nil } -func (x *Action) GetDaoSpend() *v1alpha17.DaoSpend { - if x, ok := x.GetAction().(*Action_DaoSpend); ok { - return x.DaoSpend +func (x *Action) GetCommunityPoolSpend() *v1alpha18.CommunityPoolSpend { + if x, ok := x.GetAction().(*Action_CommunityPoolSpend); ok { + return x.CommunityPoolSpend } return nil } -func (x *Action) GetDaoOutput() *v1alpha17.DaoOutput { - if x, ok := x.GetAction().(*Action_DaoOutput); ok { - return x.DaoOutput +func (x *Action) GetCommunityPoolOutput() *v1alpha18.CommunityPoolOutput { + if x, ok := x.GetAction().(*Action_CommunityPoolOutput); ok { + return x.CommunityPoolOutput } return nil } -func (x *Action) GetDaoDeposit() *v1alpha17.DaoDeposit { - if x, ok := x.GetAction().(*Action_DaoDeposit); ok { - return x.DaoDeposit +func (x *Action) GetCommunityPoolDeposit() *v1alpha18.CommunityPoolDeposit { + if x, ok := x.GetAction().(*Action_CommunityPoolDeposit); ok { + return x.CommunityPoolDeposit } return nil } -func (x *Action) GetIcs20Withdrawal() *v1alpha16.Ics20Withdrawal { +func (x *Action) GetIcs20Withdrawal() *v1alpha17.Ics20Withdrawal { if x, ok := x.GetAction().(*Action_Ics20Withdrawal); ok { return x.Ics20Withdrawal } @@ -624,95 +529,95 @@ type isAction_Action interface { type Action_Spend struct { // Common actions have numbers < 15, to save space. - Spend *v1alpha13.Spend `protobuf:"bytes,1,opt,name=spend,proto3,oneof"` + Spend *v1alpha14.Spend `protobuf:"bytes,1,opt,name=spend,proto3,oneof"` } type Action_Output struct { - Output *v1alpha13.Output `protobuf:"bytes,2,opt,name=output,proto3,oneof"` + Output *v1alpha14.Output `protobuf:"bytes,2,opt,name=output,proto3,oneof"` } type Action_Swap struct { - Swap *v1alpha14.Swap `protobuf:"bytes,3,opt,name=swap,proto3,oneof"` + Swap *v1alpha15.Swap `protobuf:"bytes,3,opt,name=swap,proto3,oneof"` } type Action_SwapClaim struct { - SwapClaim *v1alpha14.SwapClaim `protobuf:"bytes,4,opt,name=swap_claim,json=swapClaim,proto3,oneof"` + SwapClaim *v1alpha15.SwapClaim `protobuf:"bytes,4,opt,name=swap_claim,json=swapClaim,proto3,oneof"` } type Action_ValidatorDefinition struct { - ValidatorDefinition *v1alpha15.ValidatorDefinition `protobuf:"bytes,16,opt,name=validator_definition,json=validatorDefinition,proto3,oneof"` + ValidatorDefinition *v1alpha16.ValidatorDefinition `protobuf:"bytes,16,opt,name=validator_definition,json=validatorDefinition,proto3,oneof"` } type Action_IbcRelayAction struct { - IbcRelayAction *v1alpha16.IbcRelay `protobuf:"bytes,17,opt,name=ibc_relay_action,json=ibcRelayAction,proto3,oneof"` + IbcRelayAction *v1alpha17.IbcRelay `protobuf:"bytes,17,opt,name=ibc_relay_action,json=ibcRelayAction,proto3,oneof"` } type Action_ProposalSubmit struct { // Governance: - ProposalSubmit *v1alpha17.ProposalSubmit `protobuf:"bytes,18,opt,name=proposal_submit,json=proposalSubmit,proto3,oneof"` + ProposalSubmit *v1alpha18.ProposalSubmit `protobuf:"bytes,18,opt,name=proposal_submit,json=proposalSubmit,proto3,oneof"` } type Action_ProposalWithdraw struct { - ProposalWithdraw *v1alpha17.ProposalWithdraw `protobuf:"bytes,19,opt,name=proposal_withdraw,json=proposalWithdraw,proto3,oneof"` + ProposalWithdraw *v1alpha18.ProposalWithdraw `protobuf:"bytes,19,opt,name=proposal_withdraw,json=proposalWithdraw,proto3,oneof"` } type Action_ValidatorVote struct { - ValidatorVote *v1alpha17.ValidatorVote `protobuf:"bytes,20,opt,name=validator_vote,json=validatorVote,proto3,oneof"` + ValidatorVote *v1alpha18.ValidatorVote `protobuf:"bytes,20,opt,name=validator_vote,json=validatorVote,proto3,oneof"` } type Action_DelegatorVote struct { - DelegatorVote *v1alpha17.DelegatorVote `protobuf:"bytes,21,opt,name=delegator_vote,json=delegatorVote,proto3,oneof"` + DelegatorVote *v1alpha18.DelegatorVote `protobuf:"bytes,21,opt,name=delegator_vote,json=delegatorVote,proto3,oneof"` } type Action_ProposalDepositClaim struct { - ProposalDepositClaim *v1alpha17.ProposalDepositClaim `protobuf:"bytes,22,opt,name=proposal_deposit_claim,json=proposalDepositClaim,proto3,oneof"` + ProposalDepositClaim *v1alpha18.ProposalDepositClaim `protobuf:"bytes,22,opt,name=proposal_deposit_claim,json=proposalDepositClaim,proto3,oneof"` } type Action_PositionOpen struct { // Positions - PositionOpen *v1alpha14.PositionOpen `protobuf:"bytes,30,opt,name=position_open,json=positionOpen,proto3,oneof"` + PositionOpen *v1alpha15.PositionOpen `protobuf:"bytes,30,opt,name=position_open,json=positionOpen,proto3,oneof"` } type Action_PositionClose struct { - PositionClose *v1alpha14.PositionClose `protobuf:"bytes,31,opt,name=position_close,json=positionClose,proto3,oneof"` + PositionClose *v1alpha15.PositionClose `protobuf:"bytes,31,opt,name=position_close,json=positionClose,proto3,oneof"` } type Action_PositionWithdraw struct { - PositionWithdraw *v1alpha14.PositionWithdraw `protobuf:"bytes,32,opt,name=position_withdraw,json=positionWithdraw,proto3,oneof"` + PositionWithdraw *v1alpha15.PositionWithdraw `protobuf:"bytes,32,opt,name=position_withdraw,json=positionWithdraw,proto3,oneof"` } type Action_PositionRewardClaim struct { - PositionRewardClaim *v1alpha14.PositionRewardClaim `protobuf:"bytes,34,opt,name=position_reward_claim,json=positionRewardClaim,proto3,oneof"` + PositionRewardClaim *v1alpha15.PositionRewardClaim `protobuf:"bytes,34,opt,name=position_reward_claim,json=positionRewardClaim,proto3,oneof"` } type Action_Delegate struct { // (un)delegation - Delegate *v1alpha15.Delegate `protobuf:"bytes,40,opt,name=delegate,proto3,oneof"` + Delegate *v1alpha16.Delegate `protobuf:"bytes,40,opt,name=delegate,proto3,oneof"` } type Action_Undelegate struct { - Undelegate *v1alpha15.Undelegate `protobuf:"bytes,41,opt,name=undelegate,proto3,oneof"` + Undelegate *v1alpha16.Undelegate `protobuf:"bytes,41,opt,name=undelegate,proto3,oneof"` } type Action_UndelegateClaim struct { - UndelegateClaim *v1alpha15.UndelegateClaim `protobuf:"bytes,42,opt,name=undelegate_claim,json=undelegateClaim,proto3,oneof"` + UndelegateClaim *v1alpha16.UndelegateClaim `protobuf:"bytes,42,opt,name=undelegate_claim,json=undelegateClaim,proto3,oneof"` } -type Action_DaoSpend struct { - // DAO - DaoSpend *v1alpha17.DaoSpend `protobuf:"bytes,50,opt,name=dao_spend,json=daoSpend,proto3,oneof"` +type Action_CommunityPoolSpend struct { + // Community Pool + CommunityPoolSpend *v1alpha18.CommunityPoolSpend `protobuf:"bytes,50,opt,name=community_pool_spend,json=communityPoolSpend,proto3,oneof"` } -type Action_DaoOutput struct { - DaoOutput *v1alpha17.DaoOutput `protobuf:"bytes,51,opt,name=dao_output,json=daoOutput,proto3,oneof"` +type Action_CommunityPoolOutput struct { + CommunityPoolOutput *v1alpha18.CommunityPoolOutput `protobuf:"bytes,51,opt,name=community_pool_output,json=communityPoolOutput,proto3,oneof"` } -type Action_DaoDeposit struct { - DaoDeposit *v1alpha17.DaoDeposit `protobuf:"bytes,52,opt,name=dao_deposit,json=daoDeposit,proto3,oneof"` +type Action_CommunityPoolDeposit struct { + CommunityPoolDeposit *v1alpha18.CommunityPoolDeposit `protobuf:"bytes,52,opt,name=community_pool_deposit,json=communityPoolDeposit,proto3,oneof"` } type Action_Ics20Withdrawal struct { - Ics20Withdrawal *v1alpha16.Ics20Withdrawal `protobuf:"bytes,200,opt,name=ics20_withdrawal,json=ics20Withdrawal,proto3,oneof"` + Ics20Withdrawal *v1alpha17.Ics20Withdrawal `protobuf:"bytes,200,opt,name=ics20_withdrawal,json=ics20Withdrawal,proto3,oneof"` } func (*Action_Spend) isAction_Action() {} @@ -751,11 +656,11 @@ func (*Action_Undelegate) isAction_Action() {} func (*Action_UndelegateClaim) isAction_Action() {} -func (*Action_DaoSpend) isAction_Action() {} +func (*Action_CommunityPoolSpend) isAction_Action() {} -func (*Action_DaoOutput) isAction_Action() {} +func (*Action_CommunityPoolOutput) isAction_Action() {} -func (*Action_DaoDeposit) isAction_Action() {} +func (*Action_CommunityPoolDeposit) isAction_Action() {} func (*Action_Ics20Withdrawal) isAction_Action() {} @@ -770,19 +675,19 @@ type TransactionPerspective struct { SpendNullifiers []*NullifierWithNote `protobuf:"bytes,2,rep,name=spend_nullifiers,json=spendNullifiers,proto3" json:"spend_nullifiers,omitempty"` // The openings of note commitments referred to in the transaction // but not included in the transaction. - AdviceNotes []*v1alpha13.Note `protobuf:"bytes,3,rep,name=advice_notes,json=adviceNotes,proto3" json:"advice_notes,omitempty"` + AdviceNotes []*v1alpha14.Note `protobuf:"bytes,3,rep,name=advice_notes,json=adviceNotes,proto3" json:"advice_notes,omitempty"` // Any relevant address views. - AddressViews []*v1alpha18.AddressView `protobuf:"bytes,4,rep,name=address_views,json=addressViews,proto3" json:"address_views,omitempty"` + AddressViews []*v1alpha19.AddressView `protobuf:"bytes,4,rep,name=address_views,json=addressViews,proto3" json:"address_views,omitempty"` // Any relevant denoms for viewed assets. - Denoms []*v1alpha19.DenomMetadata `protobuf:"bytes,5,rep,name=denoms,proto3" json:"denoms,omitempty"` + Denoms []*v1alpha110.DenomMetadata `protobuf:"bytes,5,rep,name=denoms,proto3" json:"denoms,omitempty"` // The transaction ID associated with this TransactionPerspective - TransactionId *Id `protobuf:"bytes,6,opt,name=transaction_id,json=transactionId,proto3" json:"transaction_id,omitempty"` + TransactionId *v1alpha111.TransactionId `protobuf:"bytes,6,opt,name=transaction_id,json=transactionId,proto3" json:"transaction_id,omitempty"` } func (x *TransactionPerspective) Reset() { *x = TransactionPerspective{} if protoimpl.UnsafeEnabled { - mi := &file_penumbra_core_transaction_v1alpha1_transaction_proto_msgTypes[7] + mi := &file_penumbra_core_transaction_v1alpha1_transaction_proto_msgTypes[5] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -795,7 +700,7 @@ func (x *TransactionPerspective) String() string { func (*TransactionPerspective) ProtoMessage() {} func (x *TransactionPerspective) ProtoReflect() protoreflect.Message { - mi := &file_penumbra_core_transaction_v1alpha1_transaction_proto_msgTypes[7] + mi := &file_penumbra_core_transaction_v1alpha1_transaction_proto_msgTypes[5] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -808,7 +713,7 @@ func (x *TransactionPerspective) ProtoReflect() protoreflect.Message { // Deprecated: Use TransactionPerspective.ProtoReflect.Descriptor instead. func (*TransactionPerspective) Descriptor() ([]byte, []int) { - return file_penumbra_core_transaction_v1alpha1_transaction_proto_rawDescGZIP(), []int{7} + return file_penumbra_core_transaction_v1alpha1_transaction_proto_rawDescGZIP(), []int{5} } func (x *TransactionPerspective) GetPayloadKeys() []*PayloadKeyWithCommitment { @@ -825,28 +730,28 @@ func (x *TransactionPerspective) GetSpendNullifiers() []*NullifierWithNote { return nil } -func (x *TransactionPerspective) GetAdviceNotes() []*v1alpha13.Note { +func (x *TransactionPerspective) GetAdviceNotes() []*v1alpha14.Note { if x != nil { return x.AdviceNotes } return nil } -func (x *TransactionPerspective) GetAddressViews() []*v1alpha18.AddressView { +func (x *TransactionPerspective) GetAddressViews() []*v1alpha19.AddressView { if x != nil { return x.AddressViews } return nil } -func (x *TransactionPerspective) GetDenoms() []*v1alpha19.DenomMetadata { +func (x *TransactionPerspective) GetDenoms() []*v1alpha110.DenomMetadata { if x != nil { return x.Denoms } return nil } -func (x *TransactionPerspective) GetTransactionId() *Id { +func (x *TransactionPerspective) GetTransactionId() *v1alpha111.TransactionId { if x != nil { return x.TransactionId } @@ -858,14 +763,14 @@ type PayloadKeyWithCommitment struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - PayloadKey *v1alpha18.PayloadKey `protobuf:"bytes,1,opt,name=payload_key,json=payloadKey,proto3" json:"payload_key,omitempty"` - Commitment *v1alpha1.StateCommitment `protobuf:"bytes,2,opt,name=commitment,proto3" json:"commitment,omitempty"` + PayloadKey *v1alpha19.PayloadKey `protobuf:"bytes,1,opt,name=payload_key,json=payloadKey,proto3" json:"payload_key,omitempty"` + Commitment *v1alpha11.StateCommitment `protobuf:"bytes,2,opt,name=commitment,proto3" json:"commitment,omitempty"` } func (x *PayloadKeyWithCommitment) Reset() { *x = PayloadKeyWithCommitment{} if protoimpl.UnsafeEnabled { - mi := &file_penumbra_core_transaction_v1alpha1_transaction_proto_msgTypes[8] + mi := &file_penumbra_core_transaction_v1alpha1_transaction_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -878,7 +783,7 @@ func (x *PayloadKeyWithCommitment) String() string { func (*PayloadKeyWithCommitment) ProtoMessage() {} func (x *PayloadKeyWithCommitment) ProtoReflect() protoreflect.Message { - mi := &file_penumbra_core_transaction_v1alpha1_transaction_proto_msgTypes[8] + mi := &file_penumbra_core_transaction_v1alpha1_transaction_proto_msgTypes[6] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -891,17 +796,17 @@ func (x *PayloadKeyWithCommitment) ProtoReflect() protoreflect.Message { // Deprecated: Use PayloadKeyWithCommitment.ProtoReflect.Descriptor instead. func (*PayloadKeyWithCommitment) Descriptor() ([]byte, []int) { - return file_penumbra_core_transaction_v1alpha1_transaction_proto_rawDescGZIP(), []int{8} + return file_penumbra_core_transaction_v1alpha1_transaction_proto_rawDescGZIP(), []int{6} } -func (x *PayloadKeyWithCommitment) GetPayloadKey() *v1alpha18.PayloadKey { +func (x *PayloadKeyWithCommitment) GetPayloadKey() *v1alpha19.PayloadKey { if x != nil { return x.PayloadKey } return nil } -func (x *PayloadKeyWithCommitment) GetCommitment() *v1alpha1.StateCommitment { +func (x *PayloadKeyWithCommitment) GetCommitment() *v1alpha11.StateCommitment { if x != nil { return x.Commitment } @@ -913,14 +818,14 @@ type NullifierWithNote struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Nullifier *v1alpha110.Nullifier `protobuf:"bytes,1,opt,name=nullifier,proto3" json:"nullifier,omitempty"` - Note *v1alpha13.Note `protobuf:"bytes,2,opt,name=note,proto3" json:"note,omitempty"` + Nullifier *v1alpha112.Nullifier `protobuf:"bytes,1,opt,name=nullifier,proto3" json:"nullifier,omitempty"` + Note *v1alpha14.Note `protobuf:"bytes,2,opt,name=note,proto3" json:"note,omitempty"` } func (x *NullifierWithNote) Reset() { *x = NullifierWithNote{} if protoimpl.UnsafeEnabled { - mi := &file_penumbra_core_transaction_v1alpha1_transaction_proto_msgTypes[9] + mi := &file_penumbra_core_transaction_v1alpha1_transaction_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -933,7 +838,7 @@ func (x *NullifierWithNote) String() string { func (*NullifierWithNote) ProtoMessage() {} func (x *NullifierWithNote) ProtoReflect() protoreflect.Message { - mi := &file_penumbra_core_transaction_v1alpha1_transaction_proto_msgTypes[9] + mi := &file_penumbra_core_transaction_v1alpha1_transaction_proto_msgTypes[7] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -946,17 +851,17 @@ func (x *NullifierWithNote) ProtoReflect() protoreflect.Message { // Deprecated: Use NullifierWithNote.ProtoReflect.Descriptor instead. func (*NullifierWithNote) Descriptor() ([]byte, []int) { - return file_penumbra_core_transaction_v1alpha1_transaction_proto_rawDescGZIP(), []int{9} + return file_penumbra_core_transaction_v1alpha1_transaction_proto_rawDescGZIP(), []int{7} } -func (x *NullifierWithNote) GetNullifier() *v1alpha110.Nullifier { +func (x *NullifierWithNote) GetNullifier() *v1alpha112.Nullifier { if x != nil { return x.Nullifier } return nil } -func (x *NullifierWithNote) GetNote() *v1alpha13.Note { +func (x *NullifierWithNote) GetNote() *v1alpha14.Note { if x != nil { return x.Note } @@ -972,16 +877,16 @@ type TransactionView struct { // View of the transaction body BodyView *TransactionBodyView `protobuf:"bytes,1,opt,name=body_view,json=bodyView,proto3" json:"body_view,omitempty"` // The binding signature is stored separately from the transaction body that it signs. - BindingSig []byte `protobuf:"bytes,2,opt,name=binding_sig,json=bindingSig,proto3" json:"binding_sig,omitempty"` + BindingSig *v1alpha1.BindingSignature `protobuf:"bytes,2,opt,name=binding_sig,json=bindingSig,proto3" json:"binding_sig,omitempty"` // The root of some previous state of the state commitment tree, used as an anchor for all // ZK state transition proofs. - Anchor *v1alpha1.MerkleRoot `protobuf:"bytes,3,opt,name=anchor,proto3" json:"anchor,omitempty"` + Anchor *v1alpha11.MerkleRoot `protobuf:"bytes,3,opt,name=anchor,proto3" json:"anchor,omitempty"` } func (x *TransactionView) Reset() { *x = TransactionView{} if protoimpl.UnsafeEnabled { - mi := &file_penumbra_core_transaction_v1alpha1_transaction_proto_msgTypes[10] + mi := &file_penumbra_core_transaction_v1alpha1_transaction_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -994,7 +899,7 @@ func (x *TransactionView) String() string { func (*TransactionView) ProtoMessage() {} func (x *TransactionView) ProtoReflect() protoreflect.Message { - mi := &file_penumbra_core_transaction_v1alpha1_transaction_proto_msgTypes[10] + mi := &file_penumbra_core_transaction_v1alpha1_transaction_proto_msgTypes[8] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1007,7 +912,7 @@ func (x *TransactionView) ProtoReflect() protoreflect.Message { // Deprecated: Use TransactionView.ProtoReflect.Descriptor instead. func (*TransactionView) Descriptor() ([]byte, []int) { - return file_penumbra_core_transaction_v1alpha1_transaction_proto_rawDescGZIP(), []int{10} + return file_penumbra_core_transaction_v1alpha1_transaction_proto_rawDescGZIP(), []int{8} } func (x *TransactionView) GetBodyView() *TransactionBodyView { @@ -1017,14 +922,14 @@ func (x *TransactionView) GetBodyView() *TransactionBodyView { return nil } -func (x *TransactionView) GetBindingSig() []byte { +func (x *TransactionView) GetBindingSig() *v1alpha1.BindingSignature { if x != nil { return x.BindingSig } return nil } -func (x *TransactionView) GetAnchor() *v1alpha1.MerkleRoot { +func (x *TransactionView) GetAnchor() *v1alpha11.MerkleRoot { if x != nil { return x.Anchor } @@ -1040,8 +945,6 @@ type TransactionBodyView struct { ActionViews []*ActionView `protobuf:"bytes,1,rep,name=action_views,json=actionViews,proto3" json:"action_views,omitempty"` // Transaction parameters. TransactionParameters *TransactionParameters `protobuf:"bytes,2,opt,name=transaction_parameters,json=transactionParameters,proto3" json:"transaction_parameters,omitempty"` - // The transaction fee. - Fee *v1alpha11.Fee `protobuf:"bytes,3,opt,name=fee,proto3" json:"fee,omitempty"` // The detection data in this transaction, only populated if // there are outputs in the actions of this transaction. DetectionData *DetectionData `protobuf:"bytes,4,opt,name=detection_data,json=detectionData,proto3" json:"detection_data,omitempty"` @@ -1053,7 +956,7 @@ type TransactionBodyView struct { func (x *TransactionBodyView) Reset() { *x = TransactionBodyView{} if protoimpl.UnsafeEnabled { - mi := &file_penumbra_core_transaction_v1alpha1_transaction_proto_msgTypes[11] + mi := &file_penumbra_core_transaction_v1alpha1_transaction_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1066,7 +969,7 @@ func (x *TransactionBodyView) String() string { func (*TransactionBodyView) ProtoMessage() {} func (x *TransactionBodyView) ProtoReflect() protoreflect.Message { - mi := &file_penumbra_core_transaction_v1alpha1_transaction_proto_msgTypes[11] + mi := &file_penumbra_core_transaction_v1alpha1_transaction_proto_msgTypes[9] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1079,7 +982,7 @@ func (x *TransactionBodyView) ProtoReflect() protoreflect.Message { // Deprecated: Use TransactionBodyView.ProtoReflect.Descriptor instead. func (*TransactionBodyView) Descriptor() ([]byte, []int) { - return file_penumbra_core_transaction_v1alpha1_transaction_proto_rawDescGZIP(), []int{11} + return file_penumbra_core_transaction_v1alpha1_transaction_proto_rawDescGZIP(), []int{9} } func (x *TransactionBodyView) GetActionViews() []*ActionView { @@ -1096,13 +999,6 @@ func (x *TransactionBodyView) GetTransactionParameters() *TransactionParameters return nil } -func (x *TransactionBodyView) GetFee() *v1alpha11.Fee { - if x != nil { - return x.Fee - } - return nil -} - func (x *TransactionBodyView) GetDetectionData() *DetectionData { if x != nil { return x.DetectionData @@ -1142,9 +1038,9 @@ type ActionView struct { // *ActionView_PositionRewardClaim // *ActionView_Delegate // *ActionView_Undelegate - // *ActionView_DaoSpend - // *ActionView_DaoOutput - // *ActionView_DaoDeposit + // *ActionView_CommunityPoolSpend + // *ActionView_CommunityPoolOutput + // *ActionView_CommunityPoolDeposit // *ActionView_UndelegateClaim // *ActionView_Ics20Withdrawal ActionView isActionView_ActionView `protobuf_oneof:"action_view"` @@ -1153,7 +1049,7 @@ type ActionView struct { func (x *ActionView) Reset() { *x = ActionView{} if protoimpl.UnsafeEnabled { - mi := &file_penumbra_core_transaction_v1alpha1_transaction_proto_msgTypes[12] + mi := &file_penumbra_core_transaction_v1alpha1_transaction_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1166,7 +1062,7 @@ func (x *ActionView) String() string { func (*ActionView) ProtoMessage() {} func (x *ActionView) ProtoReflect() protoreflect.Message { - mi := &file_penumbra_core_transaction_v1alpha1_transaction_proto_msgTypes[12] + mi := &file_penumbra_core_transaction_v1alpha1_transaction_proto_msgTypes[10] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1179,7 +1075,7 @@ func (x *ActionView) ProtoReflect() protoreflect.Message { // Deprecated: Use ActionView.ProtoReflect.Descriptor instead. func (*ActionView) Descriptor() ([]byte, []int) { - return file_penumbra_core_transaction_v1alpha1_transaction_proto_rawDescGZIP(), []int{12} + return file_penumbra_core_transaction_v1alpha1_transaction_proto_rawDescGZIP(), []int{10} } func (m *ActionView) GetActionView() isActionView_ActionView { @@ -1189,154 +1085,154 @@ func (m *ActionView) GetActionView() isActionView_ActionView { return nil } -func (x *ActionView) GetSpend() *v1alpha13.SpendView { +func (x *ActionView) GetSpend() *v1alpha14.SpendView { if x, ok := x.GetActionView().(*ActionView_Spend); ok { return x.Spend } return nil } -func (x *ActionView) GetOutput() *v1alpha13.OutputView { +func (x *ActionView) GetOutput() *v1alpha14.OutputView { if x, ok := x.GetActionView().(*ActionView_Output); ok { return x.Output } return nil } -func (x *ActionView) GetSwap() *v1alpha14.SwapView { +func (x *ActionView) GetSwap() *v1alpha15.SwapView { if x, ok := x.GetActionView().(*ActionView_Swap); ok { return x.Swap } return nil } -func (x *ActionView) GetSwapClaim() *v1alpha14.SwapClaimView { +func (x *ActionView) GetSwapClaim() *v1alpha15.SwapClaimView { if x, ok := x.GetActionView().(*ActionView_SwapClaim); ok { return x.SwapClaim } return nil } -func (x *ActionView) GetValidatorDefinition() *v1alpha15.ValidatorDefinition { +func (x *ActionView) GetValidatorDefinition() *v1alpha16.ValidatorDefinition { if x, ok := x.GetActionView().(*ActionView_ValidatorDefinition); ok { return x.ValidatorDefinition } return nil } -func (x *ActionView) GetIbcRelayAction() *v1alpha16.IbcRelay { +func (x *ActionView) GetIbcRelayAction() *v1alpha17.IbcRelay { if x, ok := x.GetActionView().(*ActionView_IbcRelayAction); ok { return x.IbcRelayAction } return nil } -func (x *ActionView) GetProposalSubmit() *v1alpha17.ProposalSubmit { +func (x *ActionView) GetProposalSubmit() *v1alpha18.ProposalSubmit { if x, ok := x.GetActionView().(*ActionView_ProposalSubmit); ok { return x.ProposalSubmit } return nil } -func (x *ActionView) GetProposalWithdraw() *v1alpha17.ProposalWithdraw { +func (x *ActionView) GetProposalWithdraw() *v1alpha18.ProposalWithdraw { if x, ok := x.GetActionView().(*ActionView_ProposalWithdraw); ok { return x.ProposalWithdraw } return nil } -func (x *ActionView) GetValidatorVote() *v1alpha17.ValidatorVote { +func (x *ActionView) GetValidatorVote() *v1alpha18.ValidatorVote { if x, ok := x.GetActionView().(*ActionView_ValidatorVote); ok { return x.ValidatorVote } return nil } -func (x *ActionView) GetDelegatorVote() *v1alpha17.DelegatorVoteView { +func (x *ActionView) GetDelegatorVote() *v1alpha18.DelegatorVoteView { if x, ok := x.GetActionView().(*ActionView_DelegatorVote); ok { return x.DelegatorVote } return nil } -func (x *ActionView) GetProposalDepositClaim() *v1alpha17.ProposalDepositClaim { +func (x *ActionView) GetProposalDepositClaim() *v1alpha18.ProposalDepositClaim { if x, ok := x.GetActionView().(*ActionView_ProposalDepositClaim); ok { return x.ProposalDepositClaim } return nil } -func (x *ActionView) GetPositionOpen() *v1alpha14.PositionOpen { +func (x *ActionView) GetPositionOpen() *v1alpha15.PositionOpen { if x, ok := x.GetActionView().(*ActionView_PositionOpen); ok { return x.PositionOpen } return nil } -func (x *ActionView) GetPositionClose() *v1alpha14.PositionClose { +func (x *ActionView) GetPositionClose() *v1alpha15.PositionClose { if x, ok := x.GetActionView().(*ActionView_PositionClose); ok { return x.PositionClose } return nil } -func (x *ActionView) GetPositionWithdraw() *v1alpha14.PositionWithdraw { +func (x *ActionView) GetPositionWithdraw() *v1alpha15.PositionWithdraw { if x, ok := x.GetActionView().(*ActionView_PositionWithdraw); ok { return x.PositionWithdraw } return nil } -func (x *ActionView) GetPositionRewardClaim() *v1alpha14.PositionRewardClaim { +func (x *ActionView) GetPositionRewardClaim() *v1alpha15.PositionRewardClaim { if x, ok := x.GetActionView().(*ActionView_PositionRewardClaim); ok { return x.PositionRewardClaim } return nil } -func (x *ActionView) GetDelegate() *v1alpha15.Delegate { +func (x *ActionView) GetDelegate() *v1alpha16.Delegate { if x, ok := x.GetActionView().(*ActionView_Delegate); ok { return x.Delegate } return nil } -func (x *ActionView) GetUndelegate() *v1alpha15.Undelegate { +func (x *ActionView) GetUndelegate() *v1alpha16.Undelegate { if x, ok := x.GetActionView().(*ActionView_Undelegate); ok { return x.Undelegate } return nil } -func (x *ActionView) GetDaoSpend() *v1alpha17.DaoSpend { - if x, ok := x.GetActionView().(*ActionView_DaoSpend); ok { - return x.DaoSpend +func (x *ActionView) GetCommunityPoolSpend() *v1alpha18.CommunityPoolSpend { + if x, ok := x.GetActionView().(*ActionView_CommunityPoolSpend); ok { + return x.CommunityPoolSpend } return nil } -func (x *ActionView) GetDaoOutput() *v1alpha17.DaoOutput { - if x, ok := x.GetActionView().(*ActionView_DaoOutput); ok { - return x.DaoOutput +func (x *ActionView) GetCommunityPoolOutput() *v1alpha18.CommunityPoolOutput { + if x, ok := x.GetActionView().(*ActionView_CommunityPoolOutput); ok { + return x.CommunityPoolOutput } return nil } -func (x *ActionView) GetDaoDeposit() *v1alpha17.DaoDeposit { - if x, ok := x.GetActionView().(*ActionView_DaoDeposit); ok { - return x.DaoDeposit +func (x *ActionView) GetCommunityPoolDeposit() *v1alpha18.CommunityPoolDeposit { + if x, ok := x.GetActionView().(*ActionView_CommunityPoolDeposit); ok { + return x.CommunityPoolDeposit } return nil } -func (x *ActionView) GetUndelegateClaim() *v1alpha15.UndelegateClaim { +func (x *ActionView) GetUndelegateClaim() *v1alpha16.UndelegateClaim { if x, ok := x.GetActionView().(*ActionView_UndelegateClaim); ok { return x.UndelegateClaim } return nil } -func (x *ActionView) GetIcs20Withdrawal() *v1alpha16.Ics20Withdrawal { +func (x *ActionView) GetIcs20Withdrawal() *v1alpha17.Ics20Withdrawal { if x, ok := x.GetActionView().(*ActionView_Ics20Withdrawal); ok { return x.Ics20Withdrawal } @@ -1349,97 +1245,97 @@ type isActionView_ActionView interface { type ActionView_Spend struct { // Action types with visible/opaque variants - Spend *v1alpha13.SpendView `protobuf:"bytes,1,opt,name=spend,proto3,oneof"` + Spend *v1alpha14.SpendView `protobuf:"bytes,1,opt,name=spend,proto3,oneof"` } type ActionView_Output struct { - Output *v1alpha13.OutputView `protobuf:"bytes,2,opt,name=output,proto3,oneof"` + Output *v1alpha14.OutputView `protobuf:"bytes,2,opt,name=output,proto3,oneof"` } type ActionView_Swap struct { - Swap *v1alpha14.SwapView `protobuf:"bytes,3,opt,name=swap,proto3,oneof"` + Swap *v1alpha15.SwapView `protobuf:"bytes,3,opt,name=swap,proto3,oneof"` } type ActionView_SwapClaim struct { - SwapClaim *v1alpha14.SwapClaimView `protobuf:"bytes,4,opt,name=swap_claim,json=swapClaim,proto3,oneof"` + SwapClaim *v1alpha15.SwapClaimView `protobuf:"bytes,4,opt,name=swap_claim,json=swapClaim,proto3,oneof"` } type ActionView_ValidatorDefinition struct { // Action types without visible/opaque variants - ValidatorDefinition *v1alpha15.ValidatorDefinition `protobuf:"bytes,16,opt,name=validator_definition,json=validatorDefinition,proto3,oneof"` + ValidatorDefinition *v1alpha16.ValidatorDefinition `protobuf:"bytes,16,opt,name=validator_definition,json=validatorDefinition,proto3,oneof"` } type ActionView_IbcRelayAction struct { - IbcRelayAction *v1alpha16.IbcRelay `protobuf:"bytes,17,opt,name=ibc_relay_action,json=ibcRelayAction,proto3,oneof"` + IbcRelayAction *v1alpha17.IbcRelay `protobuf:"bytes,17,opt,name=ibc_relay_action,json=ibcRelayAction,proto3,oneof"` } type ActionView_ProposalSubmit struct { // Governance: - ProposalSubmit *v1alpha17.ProposalSubmit `protobuf:"bytes,18,opt,name=proposal_submit,json=proposalSubmit,proto3,oneof"` + ProposalSubmit *v1alpha18.ProposalSubmit `protobuf:"bytes,18,opt,name=proposal_submit,json=proposalSubmit,proto3,oneof"` } type ActionView_ProposalWithdraw struct { - ProposalWithdraw *v1alpha17.ProposalWithdraw `protobuf:"bytes,19,opt,name=proposal_withdraw,json=proposalWithdraw,proto3,oneof"` + ProposalWithdraw *v1alpha18.ProposalWithdraw `protobuf:"bytes,19,opt,name=proposal_withdraw,json=proposalWithdraw,proto3,oneof"` } type ActionView_ValidatorVote struct { - ValidatorVote *v1alpha17.ValidatorVote `protobuf:"bytes,20,opt,name=validator_vote,json=validatorVote,proto3,oneof"` + ValidatorVote *v1alpha18.ValidatorVote `protobuf:"bytes,20,opt,name=validator_vote,json=validatorVote,proto3,oneof"` } type ActionView_DelegatorVote struct { - DelegatorVote *v1alpha17.DelegatorVoteView `protobuf:"bytes,21,opt,name=delegator_vote,json=delegatorVote,proto3,oneof"` + DelegatorVote *v1alpha18.DelegatorVoteView `protobuf:"bytes,21,opt,name=delegator_vote,json=delegatorVote,proto3,oneof"` } type ActionView_ProposalDepositClaim struct { - ProposalDepositClaim *v1alpha17.ProposalDepositClaim `protobuf:"bytes,22,opt,name=proposal_deposit_claim,json=proposalDepositClaim,proto3,oneof"` + ProposalDepositClaim *v1alpha18.ProposalDepositClaim `protobuf:"bytes,22,opt,name=proposal_deposit_claim,json=proposalDepositClaim,proto3,oneof"` } type ActionView_PositionOpen struct { - PositionOpen *v1alpha14.PositionOpen `protobuf:"bytes,30,opt,name=position_open,json=positionOpen,proto3,oneof"` + PositionOpen *v1alpha15.PositionOpen `protobuf:"bytes,30,opt,name=position_open,json=positionOpen,proto3,oneof"` } type ActionView_PositionClose struct { - PositionClose *v1alpha14.PositionClose `protobuf:"bytes,31,opt,name=position_close,json=positionClose,proto3,oneof"` + PositionClose *v1alpha15.PositionClose `protobuf:"bytes,31,opt,name=position_close,json=positionClose,proto3,oneof"` } type ActionView_PositionWithdraw struct { - PositionWithdraw *v1alpha14.PositionWithdraw `protobuf:"bytes,32,opt,name=position_withdraw,json=positionWithdraw,proto3,oneof"` + PositionWithdraw *v1alpha15.PositionWithdraw `protobuf:"bytes,32,opt,name=position_withdraw,json=positionWithdraw,proto3,oneof"` } type ActionView_PositionRewardClaim struct { - PositionRewardClaim *v1alpha14.PositionRewardClaim `protobuf:"bytes,34,opt,name=position_reward_claim,json=positionRewardClaim,proto3,oneof"` + PositionRewardClaim *v1alpha15.PositionRewardClaim `protobuf:"bytes,34,opt,name=position_reward_claim,json=positionRewardClaim,proto3,oneof"` } type ActionView_Delegate struct { - Delegate *v1alpha15.Delegate `protobuf:"bytes,41,opt,name=delegate,proto3,oneof"` + Delegate *v1alpha16.Delegate `protobuf:"bytes,41,opt,name=delegate,proto3,oneof"` } type ActionView_Undelegate struct { - Undelegate *v1alpha15.Undelegate `protobuf:"bytes,42,opt,name=undelegate,proto3,oneof"` + Undelegate *v1alpha16.Undelegate `protobuf:"bytes,42,opt,name=undelegate,proto3,oneof"` } -type ActionView_DaoSpend struct { - // DAO - DaoSpend *v1alpha17.DaoSpend `protobuf:"bytes,50,opt,name=dao_spend,json=daoSpend,proto3,oneof"` +type ActionView_CommunityPoolSpend struct { + // Community Pool + CommunityPoolSpend *v1alpha18.CommunityPoolSpend `protobuf:"bytes,50,opt,name=community_pool_spend,json=communityPoolSpend,proto3,oneof"` } -type ActionView_DaoOutput struct { - DaoOutput *v1alpha17.DaoOutput `protobuf:"bytes,51,opt,name=dao_output,json=daoOutput,proto3,oneof"` +type ActionView_CommunityPoolOutput struct { + CommunityPoolOutput *v1alpha18.CommunityPoolOutput `protobuf:"bytes,51,opt,name=community_pool_output,json=communityPoolOutput,proto3,oneof"` } -type ActionView_DaoDeposit struct { - DaoDeposit *v1alpha17.DaoDeposit `protobuf:"bytes,52,opt,name=dao_deposit,json=daoDeposit,proto3,oneof"` +type ActionView_CommunityPoolDeposit struct { + CommunityPoolDeposit *v1alpha18.CommunityPoolDeposit `protobuf:"bytes,52,opt,name=community_pool_deposit,json=communityPoolDeposit,proto3,oneof"` } type ActionView_UndelegateClaim struct { // TODO: we have no way to recover the opening of the undelegate_claim's // balance commitment, and can only infer the value from looking at the rest // of the transaction. is that fine? - UndelegateClaim *v1alpha15.UndelegateClaim `protobuf:"bytes,43,opt,name=undelegate_claim,json=undelegateClaim,proto3,oneof"` + UndelegateClaim *v1alpha16.UndelegateClaim `protobuf:"bytes,43,opt,name=undelegate_claim,json=undelegateClaim,proto3,oneof"` } type ActionView_Ics20Withdrawal struct { - Ics20Withdrawal *v1alpha16.Ics20Withdrawal `protobuf:"bytes,200,opt,name=ics20_withdrawal,json=ics20Withdrawal,proto3,oneof"` + Ics20Withdrawal *v1alpha17.Ics20Withdrawal `protobuf:"bytes,200,opt,name=ics20_withdrawal,json=ics20Withdrawal,proto3,oneof"` } func (*ActionView_Spend) isActionView_ActionView() {} @@ -1476,64 +1372,16 @@ func (*ActionView_Delegate) isActionView_ActionView() {} func (*ActionView_Undelegate) isActionView_ActionView() {} -func (*ActionView_DaoSpend) isActionView_ActionView() {} +func (*ActionView_CommunityPoolSpend) isActionView_ActionView() {} -func (*ActionView_DaoOutput) isActionView_ActionView() {} +func (*ActionView_CommunityPoolOutput) isActionView_ActionView() {} -func (*ActionView_DaoDeposit) isActionView_ActionView() {} +func (*ActionView_CommunityPoolDeposit) isActionView_ActionView() {} func (*ActionView_UndelegateClaim) isActionView_ActionView() {} func (*ActionView_Ics20Withdrawal) isActionView_ActionView() {} -// An authorization hash for a Penumbra transaction. -type EffectHash struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Inner []byte `protobuf:"bytes,1,opt,name=inner,proto3" json:"inner,omitempty"` -} - -func (x *EffectHash) Reset() { - *x = EffectHash{} - if protoimpl.UnsafeEnabled { - mi := &file_penumbra_core_transaction_v1alpha1_transaction_proto_msgTypes[13] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *EffectHash) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*EffectHash) ProtoMessage() {} - -func (x *EffectHash) ProtoReflect() protoreflect.Message { - mi := &file_penumbra_core_transaction_v1alpha1_transaction_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 EffectHash.ProtoReflect.Descriptor instead. -func (*EffectHash) Descriptor() ([]byte, []int) { - return file_penumbra_core_transaction_v1alpha1_transaction_proto_rawDescGZIP(), []int{13} -} - -func (x *EffectHash) GetInner() []byte { - if x != nil { - return x.Inner - } - return nil -} - // The data required to authorize a transaction plan. type AuthorizationData struct { state protoimpl.MessageState @@ -1541,19 +1389,19 @@ type AuthorizationData struct { unknownFields protoimpl.UnknownFields // The computed auth hash for the approved transaction plan. - EffectHash *EffectHash `protobuf:"bytes,1,opt,name=effect_hash,json=effectHash,proto3" json:"effect_hash,omitempty"` + EffectHash *v1alpha111.EffectHash `protobuf:"bytes,1,opt,name=effect_hash,json=effectHash,proto3" json:"effect_hash,omitempty"` // The required spend authorizations, returned in the same order as the // Spend actions in the original request. - SpendAuths []*v1alpha111.SpendAuthSignature `protobuf:"bytes,2,rep,name=spend_auths,json=spendAuths,proto3" json:"spend_auths,omitempty"` + SpendAuths []*v1alpha1.SpendAuthSignature `protobuf:"bytes,2,rep,name=spend_auths,json=spendAuths,proto3" json:"spend_auths,omitempty"` // The required delegator vote authorizations, returned in the same order as the // DelegatorVote actions in the original request. - DelegatorVoteAuths []*v1alpha111.SpendAuthSignature `protobuf:"bytes,3,rep,name=delegator_vote_auths,json=delegatorVoteAuths,proto3" json:"delegator_vote_auths,omitempty"` + DelegatorVoteAuths []*v1alpha1.SpendAuthSignature `protobuf:"bytes,3,rep,name=delegator_vote_auths,json=delegatorVoteAuths,proto3" json:"delegator_vote_auths,omitempty"` } func (x *AuthorizationData) Reset() { *x = AuthorizationData{} if protoimpl.UnsafeEnabled { - mi := &file_penumbra_core_transaction_v1alpha1_transaction_proto_msgTypes[14] + mi := &file_penumbra_core_transaction_v1alpha1_transaction_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1566,7 +1414,7 @@ func (x *AuthorizationData) String() string { func (*AuthorizationData) ProtoMessage() {} func (x *AuthorizationData) ProtoReflect() protoreflect.Message { - mi := &file_penumbra_core_transaction_v1alpha1_transaction_proto_msgTypes[14] + mi := &file_penumbra_core_transaction_v1alpha1_transaction_proto_msgTypes[11] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1579,24 +1427,24 @@ func (x *AuthorizationData) ProtoReflect() protoreflect.Message { // Deprecated: Use AuthorizationData.ProtoReflect.Descriptor instead. func (*AuthorizationData) Descriptor() ([]byte, []int) { - return file_penumbra_core_transaction_v1alpha1_transaction_proto_rawDescGZIP(), []int{14} + return file_penumbra_core_transaction_v1alpha1_transaction_proto_rawDescGZIP(), []int{11} } -func (x *AuthorizationData) GetEffectHash() *EffectHash { +func (x *AuthorizationData) GetEffectHash() *v1alpha111.EffectHash { if x != nil { return x.EffectHash } return nil } -func (x *AuthorizationData) GetSpendAuths() []*v1alpha111.SpendAuthSignature { +func (x *AuthorizationData) GetSpendAuths() []*v1alpha1.SpendAuthSignature { if x != nil { return x.SpendAuths } return nil } -func (x *AuthorizationData) GetDelegatorVoteAuths() []*v1alpha111.SpendAuthSignature { +func (x *AuthorizationData) GetDelegatorVoteAuths() []*v1alpha1.SpendAuthSignature { if x != nil { return x.DelegatorVoteAuths } @@ -1610,16 +1458,16 @@ type WitnessData struct { unknownFields protoimpl.UnknownFields // The anchor for the state transition proofs. - Anchor *v1alpha1.MerkleRoot `protobuf:"bytes,1,opt,name=anchor,proto3" json:"anchor,omitempty"` + Anchor *v1alpha11.MerkleRoot `protobuf:"bytes,1,opt,name=anchor,proto3" json:"anchor,omitempty"` // The auth paths for the notes the transaction spends, in the // same order as the spends in the transaction plan. - StateCommitmentProofs []*v1alpha1.StateCommitmentProof `protobuf:"bytes,2,rep,name=state_commitment_proofs,json=stateCommitmentProofs,proto3" json:"state_commitment_proofs,omitempty"` + StateCommitmentProofs []*v1alpha11.StateCommitmentProof `protobuf:"bytes,2,rep,name=state_commitment_proofs,json=stateCommitmentProofs,proto3" json:"state_commitment_proofs,omitempty"` } func (x *WitnessData) Reset() { *x = WitnessData{} if protoimpl.UnsafeEnabled { - mi := &file_penumbra_core_transaction_v1alpha1_transaction_proto_msgTypes[15] + mi := &file_penumbra_core_transaction_v1alpha1_transaction_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1632,7 +1480,7 @@ func (x *WitnessData) String() string { func (*WitnessData) ProtoMessage() {} func (x *WitnessData) ProtoReflect() protoreflect.Message { - mi := &file_penumbra_core_transaction_v1alpha1_transaction_proto_msgTypes[15] + mi := &file_penumbra_core_transaction_v1alpha1_transaction_proto_msgTypes[12] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1645,17 +1493,17 @@ func (x *WitnessData) ProtoReflect() protoreflect.Message { // Deprecated: Use WitnessData.ProtoReflect.Descriptor instead. func (*WitnessData) Descriptor() ([]byte, []int) { - return file_penumbra_core_transaction_v1alpha1_transaction_proto_rawDescGZIP(), []int{15} + return file_penumbra_core_transaction_v1alpha1_transaction_proto_rawDescGZIP(), []int{12} } -func (x *WitnessData) GetAnchor() *v1alpha1.MerkleRoot { +func (x *WitnessData) GetAnchor() *v1alpha11.MerkleRoot { if x != nil { return x.Anchor } return nil } -func (x *WitnessData) GetStateCommitmentProofs() []*v1alpha1.StateCommitmentProof { +func (x *WitnessData) GetStateCommitmentProofs() []*v1alpha11.StateCommitmentProof { if x != nil { return x.StateCommitmentProofs } @@ -1664,28 +1512,28 @@ func (x *WitnessData) GetStateCommitmentProofs() []*v1alpha1.StateCommitmentProo // Describes a planned transaction. Permits clients to prepare a transaction // prior submission, so that a user can review it prior to authorizing its execution. +// +// The `TransactionPlan` is a fully determined bundle binding all of a transaction's effects. +// The only thing it does not include is the witness data used for proving. type TransactionPlan struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - // The planner interface(s) for Actions to be performed, such as a Spend, Swap, - // or Delegation. See the ActionPlan docs for a full list of options. + // The sequence of actions planned for this transaction. Actions []*ActionPlan `protobuf:"bytes,1,rep,name=actions,proto3" json:"actions,omitempty"` - // Time, as block height, after which TransactionPlan should be considered invalid. - ExpiryHeight uint64 `protobuf:"varint,2,opt,name=expiry_height,json=expiryHeight,proto3" json:"expiry_height,omitempty"` - // The name of the network for which this TransactionPlan was built. - ChainId string `protobuf:"bytes,3,opt,name=chain_id,json=chainId,proto3" json:"chain_id,omitempty"` - Fee *v1alpha11.Fee `protobuf:"bytes,4,opt,name=fee,proto3" json:"fee,omitempty"` - CluePlans []*CluePlan `protobuf:"bytes,5,rep,name=clue_plans,json=cluePlans,proto3" json:"clue_plans,omitempty"` - // Planning interface for constructing an optional Memo for the Transaction. - MemoPlan *MemoPlan `protobuf:"bytes,6,opt,name=memo_plan,json=memoPlan,proto3" json:"memo_plan,omitempty"` + // Parameters determining if a transaction should be accepted by this chain. + TransactionParameters *TransactionParameters `protobuf:"bytes,2,opt,name=transaction_parameters,json=transactionParameters,proto3" json:"transaction_parameters,omitempty"` + // Detection data for use with Fuzzy Message Detection + DetectionData *DetectionDataPlan `protobuf:"bytes,4,opt,name=detection_data,json=detectionData,proto3" json:"detection_data,omitempty"` + // The memo plan for this transaction. + Memo *MemoPlan `protobuf:"bytes,5,opt,name=memo,proto3" json:"memo,omitempty"` } func (x *TransactionPlan) Reset() { *x = TransactionPlan{} if protoimpl.UnsafeEnabled { - mi := &file_penumbra_core_transaction_v1alpha1_transaction_proto_msgTypes[16] + mi := &file_penumbra_core_transaction_v1alpha1_transaction_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1698,7 +1546,7 @@ func (x *TransactionPlan) String() string { func (*TransactionPlan) ProtoMessage() {} func (x *TransactionPlan) ProtoReflect() protoreflect.Message { - mi := &file_penumbra_core_transaction_v1alpha1_transaction_proto_msgTypes[16] + mi := &file_penumbra_core_transaction_v1alpha1_transaction_proto_msgTypes[13] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1711,7 +1559,7 @@ func (x *TransactionPlan) ProtoReflect() protoreflect.Message { // Deprecated: Use TransactionPlan.ProtoReflect.Descriptor instead. func (*TransactionPlan) Descriptor() ([]byte, []int) { - return file_penumbra_core_transaction_v1alpha1_transaction_proto_rawDescGZIP(), []int{16} + return file_penumbra_core_transaction_v1alpha1_transaction_proto_rawDescGZIP(), []int{13} } func (x *TransactionPlan) GetActions() []*ActionPlan { @@ -1721,37 +1569,70 @@ func (x *TransactionPlan) GetActions() []*ActionPlan { return nil } -func (x *TransactionPlan) GetExpiryHeight() uint64 { +func (x *TransactionPlan) GetTransactionParameters() *TransactionParameters { if x != nil { - return x.ExpiryHeight + return x.TransactionParameters } - return 0 + return nil } -func (x *TransactionPlan) GetChainId() string { +func (x *TransactionPlan) GetDetectionData() *DetectionDataPlan { if x != nil { - return x.ChainId + return x.DetectionData } - return "" + return nil } -func (x *TransactionPlan) GetFee() *v1alpha11.Fee { +func (x *TransactionPlan) GetMemo() *MemoPlan { if x != nil { - return x.Fee + return x.Memo } return nil } -func (x *TransactionPlan) GetCluePlans() []*CluePlan { - if x != nil { - return x.CluePlans +type DetectionDataPlan struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + CluePlans []*CluePlan `protobuf:"bytes,5,rep,name=clue_plans,json=cluePlans,proto3" json:"clue_plans,omitempty"` +} + +func (x *DetectionDataPlan) Reset() { + *x = DetectionDataPlan{} + if protoimpl.UnsafeEnabled { + mi := &file_penumbra_core_transaction_v1alpha1_transaction_proto_msgTypes[14] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return nil } -func (x *TransactionPlan) GetMemoPlan() *MemoPlan { +func (x *DetectionDataPlan) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DetectionDataPlan) ProtoMessage() {} + +func (x *DetectionDataPlan) ProtoReflect() protoreflect.Message { + mi := &file_penumbra_core_transaction_v1alpha1_transaction_proto_msgTypes[14] + 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 DetectionDataPlan.ProtoReflect.Descriptor instead. +func (*DetectionDataPlan) Descriptor() ([]byte, []int) { + return file_penumbra_core_transaction_v1alpha1_transaction_proto_rawDescGZIP(), []int{14} +} + +func (x *DetectionDataPlan) GetCluePlans() []*CluePlan { if x != nil { - return x.MemoPlan + return x.CluePlans } return nil } @@ -1786,16 +1667,16 @@ type ActionPlan struct { // *ActionPlan_Delegate // *ActionPlan_Undelegate // *ActionPlan_UndelegateClaim - // *ActionPlan_DaoSpend - // *ActionPlan_DaoOutput - // *ActionPlan_DaoDeposit + // *ActionPlan_CommunityPoolSpend + // *ActionPlan_CommunityPoolOutput + // *ActionPlan_CommunityPoolDeposit Action isActionPlan_Action `protobuf_oneof:"action"` } func (x *ActionPlan) Reset() { *x = ActionPlan{} if protoimpl.UnsafeEnabled { - mi := &file_penumbra_core_transaction_v1alpha1_transaction_proto_msgTypes[17] + mi := &file_penumbra_core_transaction_v1alpha1_transaction_proto_msgTypes[15] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1808,7 +1689,7 @@ func (x *ActionPlan) String() string { func (*ActionPlan) ProtoMessage() {} func (x *ActionPlan) ProtoReflect() protoreflect.Message { - mi := &file_penumbra_core_transaction_v1alpha1_transaction_proto_msgTypes[17] + mi := &file_penumbra_core_transaction_v1alpha1_transaction_proto_msgTypes[15] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1821,7 +1702,7 @@ func (x *ActionPlan) ProtoReflect() protoreflect.Message { // Deprecated: Use ActionPlan.ProtoReflect.Descriptor instead. func (*ActionPlan) Descriptor() ([]byte, []int) { - return file_penumbra_core_transaction_v1alpha1_transaction_proto_rawDescGZIP(), []int{17} + return file_penumbra_core_transaction_v1alpha1_transaction_proto_rawDescGZIP(), []int{15} } func (m *ActionPlan) GetAction() isActionPlan_Action { @@ -1831,156 +1712,156 @@ func (m *ActionPlan) GetAction() isActionPlan_Action { return nil } -func (x *ActionPlan) GetSpend() *v1alpha13.SpendPlan { +func (x *ActionPlan) GetSpend() *v1alpha14.SpendPlan { if x, ok := x.GetAction().(*ActionPlan_Spend); ok { return x.Spend } return nil } -func (x *ActionPlan) GetOutput() *v1alpha13.OutputPlan { +func (x *ActionPlan) GetOutput() *v1alpha14.OutputPlan { if x, ok := x.GetAction().(*ActionPlan_Output); ok { return x.Output } return nil } -func (x *ActionPlan) GetSwap() *v1alpha14.SwapPlan { +func (x *ActionPlan) GetSwap() *v1alpha15.SwapPlan { if x, ok := x.GetAction().(*ActionPlan_Swap); ok { return x.Swap } return nil } -func (x *ActionPlan) GetSwapClaim() *v1alpha14.SwapClaimPlan { +func (x *ActionPlan) GetSwapClaim() *v1alpha15.SwapClaimPlan { if x, ok := x.GetAction().(*ActionPlan_SwapClaim); ok { return x.SwapClaim } return nil } -func (x *ActionPlan) GetValidatorDefinition() *v1alpha15.ValidatorDefinition { +func (x *ActionPlan) GetValidatorDefinition() *v1alpha16.ValidatorDefinition { if x, ok := x.GetAction().(*ActionPlan_ValidatorDefinition); ok { return x.ValidatorDefinition } return nil } -func (x *ActionPlan) GetIbcRelayAction() *v1alpha16.IbcRelay { +func (x *ActionPlan) GetIbcRelayAction() *v1alpha17.IbcRelay { if x, ok := x.GetAction().(*ActionPlan_IbcRelayAction); ok { return x.IbcRelayAction } return nil } -func (x *ActionPlan) GetProposalSubmit() *v1alpha17.ProposalSubmit { +func (x *ActionPlan) GetProposalSubmit() *v1alpha18.ProposalSubmit { if x, ok := x.GetAction().(*ActionPlan_ProposalSubmit); ok { return x.ProposalSubmit } return nil } -func (x *ActionPlan) GetProposalWithdraw() *v1alpha17.ProposalWithdraw { +func (x *ActionPlan) GetProposalWithdraw() *v1alpha18.ProposalWithdraw { if x, ok := x.GetAction().(*ActionPlan_ProposalWithdraw); ok { return x.ProposalWithdraw } return nil } -func (x *ActionPlan) GetValidatorVote() *v1alpha17.ValidatorVote { +func (x *ActionPlan) GetValidatorVote() *v1alpha18.ValidatorVote { if x, ok := x.GetAction().(*ActionPlan_ValidatorVote); ok { return x.ValidatorVote } return nil } -func (x *ActionPlan) GetDelegatorVote() *v1alpha17.DelegatorVotePlan { +func (x *ActionPlan) GetDelegatorVote() *v1alpha18.DelegatorVotePlan { if x, ok := x.GetAction().(*ActionPlan_DelegatorVote); ok { return x.DelegatorVote } return nil } -func (x *ActionPlan) GetProposalDepositClaim() *v1alpha17.ProposalDepositClaim { +func (x *ActionPlan) GetProposalDepositClaim() *v1alpha18.ProposalDepositClaim { if x, ok := x.GetAction().(*ActionPlan_ProposalDepositClaim); ok { return x.ProposalDepositClaim } return nil } -func (x *ActionPlan) GetWithdrawal() *v1alpha16.Ics20Withdrawal { +func (x *ActionPlan) GetWithdrawal() *v1alpha17.Ics20Withdrawal { if x, ok := x.GetAction().(*ActionPlan_Withdrawal); ok { return x.Withdrawal } return nil } -func (x *ActionPlan) GetPositionOpen() *v1alpha14.PositionOpen { +func (x *ActionPlan) GetPositionOpen() *v1alpha15.PositionOpen { if x, ok := x.GetAction().(*ActionPlan_PositionOpen); ok { return x.PositionOpen } return nil } -func (x *ActionPlan) GetPositionClose() *v1alpha14.PositionClose { +func (x *ActionPlan) GetPositionClose() *v1alpha15.PositionClose { if x, ok := x.GetAction().(*ActionPlan_PositionClose); ok { return x.PositionClose } return nil } -func (x *ActionPlan) GetPositionWithdraw() *v1alpha14.PositionWithdrawPlan { +func (x *ActionPlan) GetPositionWithdraw() *v1alpha15.PositionWithdrawPlan { if x, ok := x.GetAction().(*ActionPlan_PositionWithdraw); ok { return x.PositionWithdraw } return nil } -func (x *ActionPlan) GetPositionRewardClaim() *v1alpha14.PositionRewardClaimPlan { +func (x *ActionPlan) GetPositionRewardClaim() *v1alpha15.PositionRewardClaimPlan { if x, ok := x.GetAction().(*ActionPlan_PositionRewardClaim); ok { return x.PositionRewardClaim } return nil } -func (x *ActionPlan) GetDelegate() *v1alpha15.Delegate { +func (x *ActionPlan) GetDelegate() *v1alpha16.Delegate { if x, ok := x.GetAction().(*ActionPlan_Delegate); ok { return x.Delegate } return nil } -func (x *ActionPlan) GetUndelegate() *v1alpha15.Undelegate { +func (x *ActionPlan) GetUndelegate() *v1alpha16.Undelegate { if x, ok := x.GetAction().(*ActionPlan_Undelegate); ok { return x.Undelegate } return nil } -func (x *ActionPlan) GetUndelegateClaim() *v1alpha15.UndelegateClaimPlan { +func (x *ActionPlan) GetUndelegateClaim() *v1alpha16.UndelegateClaimPlan { if x, ok := x.GetAction().(*ActionPlan_UndelegateClaim); ok { return x.UndelegateClaim } return nil } -func (x *ActionPlan) GetDaoSpend() *v1alpha17.DaoSpend { - if x, ok := x.GetAction().(*ActionPlan_DaoSpend); ok { - return x.DaoSpend +func (x *ActionPlan) GetCommunityPoolSpend() *v1alpha18.CommunityPoolSpend { + if x, ok := x.GetAction().(*ActionPlan_CommunityPoolSpend); ok { + return x.CommunityPoolSpend } return nil } -func (x *ActionPlan) GetDaoOutput() *v1alpha17.DaoOutput { - if x, ok := x.GetAction().(*ActionPlan_DaoOutput); ok { - return x.DaoOutput +func (x *ActionPlan) GetCommunityPoolOutput() *v1alpha18.CommunityPoolOutput { + if x, ok := x.GetAction().(*ActionPlan_CommunityPoolOutput); ok { + return x.CommunityPoolOutput } return nil } -func (x *ActionPlan) GetDaoDeposit() *v1alpha17.DaoDeposit { - if x, ok := x.GetAction().(*ActionPlan_DaoDeposit); ok { - return x.DaoDeposit +func (x *ActionPlan) GetCommunityPoolDeposit() *v1alpha18.CommunityPoolDeposit { + if x, ok := x.GetAction().(*ActionPlan_CommunityPoolDeposit); ok { + return x.CommunityPoolDeposit } return nil } @@ -1990,100 +1871,100 @@ type isActionPlan_Action interface { } type ActionPlan_Spend struct { - Spend *v1alpha13.SpendPlan `protobuf:"bytes,1,opt,name=spend,proto3,oneof"` + Spend *v1alpha14.SpendPlan `protobuf:"bytes,1,opt,name=spend,proto3,oneof"` } type ActionPlan_Output struct { - Output *v1alpha13.OutputPlan `protobuf:"bytes,2,opt,name=output,proto3,oneof"` + Output *v1alpha14.OutputPlan `protobuf:"bytes,2,opt,name=output,proto3,oneof"` } type ActionPlan_Swap struct { - Swap *v1alpha14.SwapPlan `protobuf:"bytes,3,opt,name=swap,proto3,oneof"` + Swap *v1alpha15.SwapPlan `protobuf:"bytes,3,opt,name=swap,proto3,oneof"` } type ActionPlan_SwapClaim struct { - SwapClaim *v1alpha14.SwapClaimPlan `protobuf:"bytes,4,opt,name=swap_claim,json=swapClaim,proto3,oneof"` + SwapClaim *v1alpha15.SwapClaimPlan `protobuf:"bytes,4,opt,name=swap_claim,json=swapClaim,proto3,oneof"` } type ActionPlan_ValidatorDefinition struct { // This is just a message relayed to the chain. - ValidatorDefinition *v1alpha15.ValidatorDefinition `protobuf:"bytes,16,opt,name=validator_definition,json=validatorDefinition,proto3,oneof"` + ValidatorDefinition *v1alpha16.ValidatorDefinition `protobuf:"bytes,16,opt,name=validator_definition,json=validatorDefinition,proto3,oneof"` } type ActionPlan_IbcRelayAction struct { // This is just a message relayed to the chain. - IbcRelayAction *v1alpha16.IbcRelay `protobuf:"bytes,17,opt,name=ibc_relay_action,json=ibcRelayAction,proto3,oneof"` + IbcRelayAction *v1alpha17.IbcRelay `protobuf:"bytes,17,opt,name=ibc_relay_action,json=ibcRelayAction,proto3,oneof"` } type ActionPlan_ProposalSubmit struct { // Governance: - ProposalSubmit *v1alpha17.ProposalSubmit `protobuf:"bytes,18,opt,name=proposal_submit,json=proposalSubmit,proto3,oneof"` + ProposalSubmit *v1alpha18.ProposalSubmit `protobuf:"bytes,18,opt,name=proposal_submit,json=proposalSubmit,proto3,oneof"` } type ActionPlan_ProposalWithdraw struct { - ProposalWithdraw *v1alpha17.ProposalWithdraw `protobuf:"bytes,19,opt,name=proposal_withdraw,json=proposalWithdraw,proto3,oneof"` + ProposalWithdraw *v1alpha18.ProposalWithdraw `protobuf:"bytes,19,opt,name=proposal_withdraw,json=proposalWithdraw,proto3,oneof"` } type ActionPlan_ValidatorVote struct { - ValidatorVote *v1alpha17.ValidatorVote `protobuf:"bytes,20,opt,name=validator_vote,json=validatorVote,proto3,oneof"` + ValidatorVote *v1alpha18.ValidatorVote `protobuf:"bytes,20,opt,name=validator_vote,json=validatorVote,proto3,oneof"` } type ActionPlan_DelegatorVote struct { - DelegatorVote *v1alpha17.DelegatorVotePlan `protobuf:"bytes,21,opt,name=delegator_vote,json=delegatorVote,proto3,oneof"` + DelegatorVote *v1alpha18.DelegatorVotePlan `protobuf:"bytes,21,opt,name=delegator_vote,json=delegatorVote,proto3,oneof"` } type ActionPlan_ProposalDepositClaim struct { - ProposalDepositClaim *v1alpha17.ProposalDepositClaim `protobuf:"bytes,22,opt,name=proposal_deposit_claim,json=proposalDepositClaim,proto3,oneof"` + ProposalDepositClaim *v1alpha18.ProposalDepositClaim `protobuf:"bytes,22,opt,name=proposal_deposit_claim,json=proposalDepositClaim,proto3,oneof"` } type ActionPlan_Withdrawal struct { - Withdrawal *v1alpha16.Ics20Withdrawal `protobuf:"bytes,23,opt,name=withdrawal,proto3,oneof"` + Withdrawal *v1alpha17.Ics20Withdrawal `protobuf:"bytes,23,opt,name=withdrawal,proto3,oneof"` } type ActionPlan_PositionOpen struct { - PositionOpen *v1alpha14.PositionOpen `protobuf:"bytes,30,opt,name=position_open,json=positionOpen,proto3,oneof"` + PositionOpen *v1alpha15.PositionOpen `protobuf:"bytes,30,opt,name=position_open,json=positionOpen,proto3,oneof"` } type ActionPlan_PositionClose struct { - PositionClose *v1alpha14.PositionClose `protobuf:"bytes,31,opt,name=position_close,json=positionClose,proto3,oneof"` + PositionClose *v1alpha15.PositionClose `protobuf:"bytes,31,opt,name=position_close,json=positionClose,proto3,oneof"` } type ActionPlan_PositionWithdraw struct { // The position withdraw/reward claim actions require balance information so they have Plan types. - PositionWithdraw *v1alpha14.PositionWithdrawPlan `protobuf:"bytes,32,opt,name=position_withdraw,json=positionWithdraw,proto3,oneof"` + PositionWithdraw *v1alpha15.PositionWithdrawPlan `protobuf:"bytes,32,opt,name=position_withdraw,json=positionWithdraw,proto3,oneof"` } type ActionPlan_PositionRewardClaim struct { - PositionRewardClaim *v1alpha14.PositionRewardClaimPlan `protobuf:"bytes,34,opt,name=position_reward_claim,json=positionRewardClaim,proto3,oneof"` + PositionRewardClaim *v1alpha15.PositionRewardClaimPlan `protobuf:"bytes,34,opt,name=position_reward_claim,json=positionRewardClaim,proto3,oneof"` } type ActionPlan_Delegate struct { // We don't need any extra information (yet) to understand delegations, // because we don't yet use flow encryption. - Delegate *v1alpha15.Delegate `protobuf:"bytes,40,opt,name=delegate,proto3,oneof"` + Delegate *v1alpha16.Delegate `protobuf:"bytes,40,opt,name=delegate,proto3,oneof"` } type ActionPlan_Undelegate struct { // We don't need any extra information (yet) to understand undelegations, // because we don't yet use flow encryption. - Undelegate *v1alpha15.Undelegate `protobuf:"bytes,41,opt,name=undelegate,proto3,oneof"` + Undelegate *v1alpha16.Undelegate `protobuf:"bytes,41,opt,name=undelegate,proto3,oneof"` } type ActionPlan_UndelegateClaim struct { - UndelegateClaim *v1alpha15.UndelegateClaimPlan `protobuf:"bytes,42,opt,name=undelegate_claim,json=undelegateClaim,proto3,oneof"` + UndelegateClaim *v1alpha16.UndelegateClaimPlan `protobuf:"bytes,42,opt,name=undelegate_claim,json=undelegateClaim,proto3,oneof"` } -type ActionPlan_DaoSpend struct { - // DAO - DaoSpend *v1alpha17.DaoSpend `protobuf:"bytes,50,opt,name=dao_spend,json=daoSpend,proto3,oneof"` +type ActionPlan_CommunityPoolSpend struct { + // Community Pool + CommunityPoolSpend *v1alpha18.CommunityPoolSpend `protobuf:"bytes,50,opt,name=community_pool_spend,json=communityPoolSpend,proto3,oneof"` } -type ActionPlan_DaoOutput struct { - DaoOutput *v1alpha17.DaoOutput `protobuf:"bytes,51,opt,name=dao_output,json=daoOutput,proto3,oneof"` +type ActionPlan_CommunityPoolOutput struct { + CommunityPoolOutput *v1alpha18.CommunityPoolOutput `protobuf:"bytes,51,opt,name=community_pool_output,json=communityPoolOutput,proto3,oneof"` } -type ActionPlan_DaoDeposit struct { - DaoDeposit *v1alpha17.DaoDeposit `protobuf:"bytes,52,opt,name=dao_deposit,json=daoDeposit,proto3,oneof"` +type ActionPlan_CommunityPoolDeposit struct { + CommunityPoolDeposit *v1alpha18.CommunityPoolDeposit `protobuf:"bytes,52,opt,name=community_pool_deposit,json=communityPoolDeposit,proto3,oneof"` } func (*ActionPlan_Spend) isActionPlan_Action() {} @@ -2124,11 +2005,11 @@ func (*ActionPlan_Undelegate) isActionPlan_Action() {} func (*ActionPlan_UndelegateClaim) isActionPlan_Action() {} -func (*ActionPlan_DaoSpend) isActionPlan_Action() {} +func (*ActionPlan_CommunityPoolSpend) isActionPlan_Action() {} -func (*ActionPlan_DaoOutput) isActionPlan_Action() {} +func (*ActionPlan_CommunityPoolOutput) isActionPlan_Action() {} -func (*ActionPlan_DaoDeposit) isActionPlan_Action() {} +func (*ActionPlan_CommunityPoolDeposit) isActionPlan_Action() {} // Describes a plan for forming a `Clue`. type CluePlan struct { @@ -2137,7 +2018,7 @@ type CluePlan struct { unknownFields protoimpl.UnknownFields // The address. - Address *v1alpha18.Address `protobuf:"bytes,1,opt,name=address,proto3" json:"address,omitempty"` + Address *v1alpha19.Address `protobuf:"bytes,1,opt,name=address,proto3" json:"address,omitempty"` // The random seed to use for the clue plan. Rseed []byte `protobuf:"bytes,2,opt,name=rseed,proto3" json:"rseed,omitempty"` // The bits of precision. @@ -2147,7 +2028,7 @@ type CluePlan struct { func (x *CluePlan) Reset() { *x = CluePlan{} if protoimpl.UnsafeEnabled { - mi := &file_penumbra_core_transaction_v1alpha1_transaction_proto_msgTypes[18] + mi := &file_penumbra_core_transaction_v1alpha1_transaction_proto_msgTypes[16] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2160,7 +2041,7 @@ func (x *CluePlan) String() string { func (*CluePlan) ProtoMessage() {} func (x *CluePlan) ProtoReflect() protoreflect.Message { - mi := &file_penumbra_core_transaction_v1alpha1_transaction_proto_msgTypes[18] + mi := &file_penumbra_core_transaction_v1alpha1_transaction_proto_msgTypes[16] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2173,10 +2054,10 @@ func (x *CluePlan) ProtoReflect() protoreflect.Message { // Deprecated: Use CluePlan.ProtoReflect.Descriptor instead. func (*CluePlan) Descriptor() ([]byte, []int) { - return file_penumbra_core_transaction_v1alpha1_transaction_proto_rawDescGZIP(), []int{18} + return file_penumbra_core_transaction_v1alpha1_transaction_proto_rawDescGZIP(), []int{16} } -func (x *CluePlan) GetAddress() *v1alpha18.Address { +func (x *CluePlan) GetAddress() *v1alpha19.Address { if x != nil { return x.Address } @@ -2197,7 +2078,7 @@ func (x *CluePlan) GetPrecisionBits() uint64 { return 0 } -// Describes a plan for forming a `Memo`. +// Describes a plan for forming the transaction memo. type MemoPlan struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -2212,7 +2093,7 @@ type MemoPlan struct { func (x *MemoPlan) Reset() { *x = MemoPlan{} if protoimpl.UnsafeEnabled { - mi := &file_penumbra_core_transaction_v1alpha1_transaction_proto_msgTypes[19] + mi := &file_penumbra_core_transaction_v1alpha1_transaction_proto_msgTypes[17] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2225,7 +2106,7 @@ func (x *MemoPlan) String() string { func (*MemoPlan) ProtoMessage() {} func (x *MemoPlan) ProtoReflect() protoreflect.Message { - mi := &file_penumbra_core_transaction_v1alpha1_transaction_proto_msgTypes[19] + mi := &file_penumbra_core_transaction_v1alpha1_transaction_proto_msgTypes[17] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2238,7 +2119,7 @@ func (x *MemoPlan) ProtoReflect() protoreflect.Message { // Deprecated: Use MemoPlan.ProtoReflect.Descriptor instead. func (*MemoPlan) Descriptor() ([]byte, []int) { - return file_penumbra_core_transaction_v1alpha1_transaction_proto_rawDescGZIP(), []int{19} + return file_penumbra_core_transaction_v1alpha1_transaction_proto_rawDescGZIP(), []int{17} } func (x *MemoPlan) GetPlaintext() *MemoPlaintext { @@ -2255,18 +2136,20 @@ func (x *MemoPlan) GetKey() []byte { return nil } +// The encrypted memo data describing information about the purpose of a transaction. type MemoCiphertext struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields + // The encrypted data. 528 bytes. Inner []byte `protobuf:"bytes,1,opt,name=inner,proto3" json:"inner,omitempty"` } func (x *MemoCiphertext) Reset() { *x = MemoCiphertext{} if protoimpl.UnsafeEnabled { - mi := &file_penumbra_core_transaction_v1alpha1_transaction_proto_msgTypes[20] + mi := &file_penumbra_core_transaction_v1alpha1_transaction_proto_msgTypes[18] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2279,7 +2162,7 @@ func (x *MemoCiphertext) String() string { func (*MemoCiphertext) ProtoMessage() {} func (x *MemoCiphertext) ProtoReflect() protoreflect.Message { - mi := &file_penumbra_core_transaction_v1alpha1_transaction_proto_msgTypes[20] + mi := &file_penumbra_core_transaction_v1alpha1_transaction_proto_msgTypes[18] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2292,7 +2175,7 @@ func (x *MemoCiphertext) ProtoReflect() protoreflect.Message { // Deprecated: Use MemoCiphertext.ProtoReflect.Descriptor instead. func (*MemoCiphertext) Descriptor() ([]byte, []int) { - return file_penumbra_core_transaction_v1alpha1_transaction_proto_rawDescGZIP(), []int{20} + return file_penumbra_core_transaction_v1alpha1_transaction_proto_rawDescGZIP(), []int{18} } func (x *MemoCiphertext) GetInner() []byte { @@ -2302,19 +2185,25 @@ func (x *MemoCiphertext) GetInner() []byte { return nil } +// The plaintext describing information about the purpose of a transaction. type MemoPlaintext struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - ReturnAddress *v1alpha18.Address `protobuf:"bytes,1,opt,name=return_address,json=returnAddress,proto3" json:"return_address,omitempty"` - Text string `protobuf:"bytes,2,opt,name=text,proto3" json:"text,omitempty"` + // The sender's return address. + // + // This should always be a valid address; the sender is responsible for ensuring + // that if the receiver returns funds to this address, they will not be lost. + ReturnAddress *v1alpha19.Address `protobuf:"bytes,1,opt,name=return_address,json=returnAddress,proto3" json:"return_address,omitempty"` + // Free-form text, up to 432 bytes long. + Text string `protobuf:"bytes,2,opt,name=text,proto3" json:"text,omitempty"` } func (x *MemoPlaintext) Reset() { *x = MemoPlaintext{} if protoimpl.UnsafeEnabled { - mi := &file_penumbra_core_transaction_v1alpha1_transaction_proto_msgTypes[21] + mi := &file_penumbra_core_transaction_v1alpha1_transaction_proto_msgTypes[19] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2327,7 +2216,7 @@ func (x *MemoPlaintext) String() string { func (*MemoPlaintext) ProtoMessage() {} func (x *MemoPlaintext) ProtoReflect() protoreflect.Message { - mi := &file_penumbra_core_transaction_v1alpha1_transaction_proto_msgTypes[21] + mi := &file_penumbra_core_transaction_v1alpha1_transaction_proto_msgTypes[19] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2340,10 +2229,10 @@ func (x *MemoPlaintext) ProtoReflect() protoreflect.Message { // Deprecated: Use MemoPlaintext.ProtoReflect.Descriptor instead. func (*MemoPlaintext) Descriptor() ([]byte, []int) { - return file_penumbra_core_transaction_v1alpha1_transaction_proto_rawDescGZIP(), []int{21} + return file_penumbra_core_transaction_v1alpha1_transaction_proto_rawDescGZIP(), []int{19} } -func (x *MemoPlaintext) GetReturnAddress() *v1alpha18.Address { +func (x *MemoPlaintext) GetReturnAddress() *v1alpha19.Address { if x != nil { return x.ReturnAddress } @@ -2362,14 +2251,14 @@ type MemoPlaintextView struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - ReturnAddress *v1alpha18.AddressView `protobuf:"bytes,1,opt,name=return_address,json=returnAddress,proto3" json:"return_address,omitempty"` + ReturnAddress *v1alpha19.AddressView `protobuf:"bytes,1,opt,name=return_address,json=returnAddress,proto3" json:"return_address,omitempty"` Text string `protobuf:"bytes,2,opt,name=text,proto3" json:"text,omitempty"` } func (x *MemoPlaintextView) Reset() { *x = MemoPlaintextView{} if protoimpl.UnsafeEnabled { - mi := &file_penumbra_core_transaction_v1alpha1_transaction_proto_msgTypes[22] + mi := &file_penumbra_core_transaction_v1alpha1_transaction_proto_msgTypes[20] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2382,7 +2271,7 @@ func (x *MemoPlaintextView) String() string { func (*MemoPlaintextView) ProtoMessage() {} func (x *MemoPlaintextView) ProtoReflect() protoreflect.Message { - mi := &file_penumbra_core_transaction_v1alpha1_transaction_proto_msgTypes[22] + mi := &file_penumbra_core_transaction_v1alpha1_transaction_proto_msgTypes[20] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2395,10 +2284,10 @@ func (x *MemoPlaintextView) ProtoReflect() protoreflect.Message { // Deprecated: Use MemoPlaintextView.ProtoReflect.Descriptor instead. func (*MemoPlaintextView) Descriptor() ([]byte, []int) { - return file_penumbra_core_transaction_v1alpha1_transaction_proto_rawDescGZIP(), []int{22} + return file_penumbra_core_transaction_v1alpha1_transaction_proto_rawDescGZIP(), []int{20} } -func (x *MemoPlaintextView) GetReturnAddress() *v1alpha18.AddressView { +func (x *MemoPlaintextView) GetReturnAddress() *v1alpha19.AddressView { if x != nil { return x.ReturnAddress } @@ -2427,7 +2316,7 @@ type MemoView struct { func (x *MemoView) Reset() { *x = MemoView{} if protoimpl.UnsafeEnabled { - mi := &file_penumbra_core_transaction_v1alpha1_transaction_proto_msgTypes[23] + mi := &file_penumbra_core_transaction_v1alpha1_transaction_proto_msgTypes[21] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2440,7 +2329,7 @@ func (x *MemoView) String() string { func (*MemoView) ProtoMessage() {} func (x *MemoView) ProtoReflect() protoreflect.Message { - mi := &file_penumbra_core_transaction_v1alpha1_transaction_proto_msgTypes[23] + mi := &file_penumbra_core_transaction_v1alpha1_transaction_proto_msgTypes[21] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2453,7 +2342,7 @@ func (x *MemoView) ProtoReflect() protoreflect.Message { // Deprecated: Use MemoView.ProtoReflect.Descriptor instead. func (*MemoView) Descriptor() ([]byte, []int) { - return file_penumbra_core_transaction_v1alpha1_transaction_proto_rawDescGZIP(), []int{23} + return file_penumbra_core_transaction_v1alpha1_transaction_proto_rawDescGZIP(), []int{21} } func (m *MemoView) GetMemoView() isMemoView_MemoView { @@ -2505,7 +2394,7 @@ type MemoView_Visible struct { func (x *MemoView_Visible) Reset() { *x = MemoView_Visible{} if protoimpl.UnsafeEnabled { - mi := &file_penumbra_core_transaction_v1alpha1_transaction_proto_msgTypes[24] + mi := &file_penumbra_core_transaction_v1alpha1_transaction_proto_msgTypes[22] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2518,7 +2407,7 @@ func (x *MemoView_Visible) String() string { func (*MemoView_Visible) ProtoMessage() {} func (x *MemoView_Visible) ProtoReflect() protoreflect.Message { - mi := &file_penumbra_core_transaction_v1alpha1_transaction_proto_msgTypes[24] + mi := &file_penumbra_core_transaction_v1alpha1_transaction_proto_msgTypes[22] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2531,7 +2420,7 @@ func (x *MemoView_Visible) ProtoReflect() protoreflect.Message { // Deprecated: Use MemoView_Visible.ProtoReflect.Descriptor instead. func (*MemoView_Visible) Descriptor() ([]byte, []int) { - return file_penumbra_core_transaction_v1alpha1_transaction_proto_rawDescGZIP(), []int{23, 0} + return file_penumbra_core_transaction_v1alpha1_transaction_proto_rawDescGZIP(), []int{21, 0} } func (x *MemoView_Visible) GetCiphertext() *MemoCiphertext { @@ -2559,7 +2448,7 @@ type MemoView_Opaque struct { func (x *MemoView_Opaque) Reset() { *x = MemoView_Opaque{} if protoimpl.UnsafeEnabled { - mi := &file_penumbra_core_transaction_v1alpha1_transaction_proto_msgTypes[25] + mi := &file_penumbra_core_transaction_v1alpha1_transaction_proto_msgTypes[23] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2572,7 +2461,7 @@ func (x *MemoView_Opaque) String() string { func (*MemoView_Opaque) ProtoMessage() {} func (x *MemoView_Opaque) ProtoReflect() protoreflect.Message { - mi := &file_penumbra_core_transaction_v1alpha1_transaction_proto_msgTypes[25] + mi := &file_penumbra_core_transaction_v1alpha1_transaction_proto_msgTypes[23] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2585,7 +2474,7 @@ func (x *MemoView_Opaque) ProtoReflect() protoreflect.Message { // Deprecated: Use MemoView_Opaque.ProtoReflect.Descriptor instead. func (*MemoView_Opaque) Descriptor() ([]byte, []int) { - return file_penumbra_core_transaction_v1alpha1_transaction_proto_rawDescGZIP(), []int{23, 1} + return file_penumbra_core_transaction_v1alpha1_transaction_proto_rawDescGZIP(), []int{21, 1} } func (x *MemoView_Opaque) GetCiphertext() *MemoCiphertext { @@ -2632,707 +2521,729 @@ var file_penumbra_core_transaction_v1alpha1_transaction_proto_rawDesc = []byte{ 0x74, 0x61, 0x6b, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x26, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x6b, 0x65, 0x79, 0x73, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x6b, 0x65, 0x79, 0x73, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x1a, 0x38, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2f, 0x63, 0x72, 0x79, - 0x70, 0x74, 0x6f, 0x2f, 0x64, 0x65, 0x63, 0x61, 0x66, 0x33, 0x37, 0x37, 0x5f, 0x66, 0x6d, 0x64, - 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x64, 0x65, 0x63, 0x61, 0x66, 0x33, - 0x37, 0x37, 0x5f, 0x66, 0x6d, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x3a, 0x70, 0x65, - 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2f, 0x63, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x2f, 0x64, 0x65, - 0x63, 0x61, 0x66, 0x33, 0x37, 0x37, 0x5f, 0x72, 0x64, 0x73, 0x61, 0x2f, 0x76, 0x31, 0x61, 0x6c, - 0x70, 0x68, 0x61, 0x31, 0x2f, 0x64, 0x65, 0x63, 0x61, 0x66, 0x33, 0x37, 0x37, 0x5f, 0x72, 0x64, - 0x73, 0x61, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x26, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, - 0x72, 0x61, 0x2f, 0x63, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x2f, 0x74, 0x63, 0x74, 0x2f, 0x76, 0x31, - 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x74, 0x63, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x22, 0xb9, 0x01, 0x0a, 0x0b, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x12, 0x47, 0x0a, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x33, - 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, - 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, - 0x68, 0x61, 0x31, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x42, - 0x6f, 0x64, 0x79, 0x52, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x12, 0x1f, 0x0a, 0x0b, 0x62, 0x69, 0x6e, - 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x73, 0x69, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0a, - 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x53, 0x69, 0x67, 0x12, 0x40, 0x0a, 0x06, 0x61, 0x6e, - 0x63, 0x68, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x70, 0x65, 0x6e, - 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x2e, 0x74, 0x63, 0x74, - 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4d, 0x65, 0x72, 0x6b, 0x6c, 0x65, - 0x52, 0x6f, 0x6f, 0x74, 0x52, 0x06, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x22, 0x18, 0x0a, 0x02, - 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x61, 0x73, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, - 0x52, 0x04, 0x68, 0x61, 0x73, 0x68, 0x22, 0xab, 0x03, 0x0a, 0x0f, 0x54, 0x72, 0x61, 0x6e, 0x73, - 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x6f, 0x64, 0x79, 0x12, 0x44, 0x0a, 0x07, 0x61, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x70, 0x65, - 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, - 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, - 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x12, 0x70, 0x0a, 0x16, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, - 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x39, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, - 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x61, - 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x52, 0x15, 0x74, 0x72, 0x61, - 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, - 0x72, 0x73, 0x12, 0x3b, 0x0a, 0x03, 0x66, 0x65, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x29, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, - 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x66, 0x65, 0x65, 0x2e, 0x76, 0x31, - 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x46, 0x65, 0x65, 0x52, 0x03, 0x66, 0x65, 0x65, 0x12, - 0x58, 0x0a, 0x0e, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x61, 0x74, - 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, + 0x74, 0x6f, 0x1a, 0x2a, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2f, 0x63, 0x6f, 0x72, + 0x65, 0x2f, 0x74, 0x78, 0x68, 0x61, 0x73, 0x68, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, + 0x31, 0x2f, 0x74, 0x78, 0x68, 0x61, 0x73, 0x68, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x38, + 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2f, 0x63, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x2f, + 0x64, 0x65, 0x63, 0x61, 0x66, 0x33, 0x37, 0x37, 0x5f, 0x66, 0x6d, 0x64, 0x2f, 0x76, 0x31, 0x61, + 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x64, 0x65, 0x63, 0x61, 0x66, 0x33, 0x37, 0x37, 0x5f, 0x66, + 0x6d, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x3a, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, + 0x72, 0x61, 0x2f, 0x63, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x2f, 0x64, 0x65, 0x63, 0x61, 0x66, 0x33, + 0x37, 0x37, 0x5f, 0x72, 0x64, 0x73, 0x61, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, + 0x2f, 0x64, 0x65, 0x63, 0x61, 0x66, 0x33, 0x37, 0x37, 0x5f, 0x72, 0x64, 0x73, 0x61, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x26, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2f, 0x63, + 0x72, 0x79, 0x70, 0x74, 0x6f, 0x2f, 0x74, 0x63, 0x74, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, + 0x61, 0x31, 0x2f, 0x74, 0x63, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xf3, 0x01, 0x0a, + 0x0b, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x47, 0x0a, 0x04, + 0x62, 0x6f, 0x64, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x70, 0x65, 0x6e, + 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, + 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, + 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x6f, 0x64, 0x79, 0x52, + 0x04, 0x62, 0x6f, 0x64, 0x79, 0x12, 0x59, 0x0a, 0x0b, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, + 0x5f, 0x73, 0x69, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x70, 0x65, 0x6e, + 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x2e, 0x64, 0x65, 0x63, + 0x61, 0x66, 0x33, 0x37, 0x37, 0x5f, 0x72, 0x64, 0x73, 0x61, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, + 0x68, 0x61, 0x31, 0x2e, 0x42, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x53, 0x69, 0x67, 0x6e, 0x61, + 0x74, 0x75, 0x72, 0x65, 0x52, 0x0a, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x53, 0x69, 0x67, + 0x12, 0x40, 0x0a, 0x06, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x28, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x72, 0x79, 0x70, + 0x74, 0x6f, 0x2e, 0x74, 0x63, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, + 0x4d, 0x65, 0x72, 0x6b, 0x6c, 0x65, 0x52, 0x6f, 0x6f, 0x74, 0x52, 0x06, 0x61, 0x6e, 0x63, 0x68, + 0x6f, 0x72, 0x22, 0xeb, 0x02, 0x0a, 0x0f, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x42, 0x6f, 0x64, 0x79, 0x12, 0x44, 0x0a, 0x07, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, 0x65, 0x74, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x52, 0x0d, 0x64, 0x65, 0x74, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x12, 0x49, 0x0a, 0x09, 0x6d, 0x65, 0x6d, - 0x6f, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x70, + 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x41, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x70, 0x0a, 0x16, + 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x61, 0x72, 0x61, + 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, - 0x31, 0x2e, 0x4d, 0x65, 0x6d, 0x6f, 0x44, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x6d, 0x6f, - 0x44, 0x61, 0x74, 0x61, 0x22, 0x31, 0x0a, 0x08, 0x4d, 0x65, 0x6d, 0x6f, 0x44, 0x61, 0x74, 0x61, - 0x12, 0x25, 0x0a, 0x0e, 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x65, 0x64, 0x5f, 0x6d, 0x65, - 0x6d, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0d, 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, - 0x74, 0x65, 0x64, 0x4d, 0x65, 0x6d, 0x6f, 0x22, 0x57, 0x0a, 0x15, 0x54, 0x72, 0x61, 0x6e, 0x73, - 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, - 0x12, 0x23, 0x0a, 0x0d, 0x65, 0x78, 0x70, 0x69, 0x72, 0x79, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, - 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x65, 0x78, 0x70, 0x69, 0x72, 0x79, 0x48, - 0x65, 0x69, 0x67, 0x68, 0x74, 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, - 0x22, 0x59, 0x0a, 0x0d, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, - 0x61, 0x12, 0x48, 0x0a, 0x09, 0x66, 0x6d, 0x64, 0x5f, 0x63, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x04, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, - 0x63, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x2e, 0x64, 0x65, 0x63, 0x61, 0x66, 0x33, 0x37, 0x37, 0x5f, - 0x66, 0x6d, 0x64, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x43, 0x6c, 0x75, - 0x65, 0x52, 0x08, 0x66, 0x6d, 0x64, 0x43, 0x6c, 0x75, 0x65, 0x73, 0x22, 0xbd, 0x10, 0x0a, 0x06, - 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x4d, 0x0a, 0x05, 0x73, 0x70, 0x65, 0x6e, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, - 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, - 0x73, 0x68, 0x69, 0x65, 0x6c, 0x64, 0x65, 0x64, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x2e, 0x76, 0x31, - 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x70, 0x65, 0x6e, 0x64, 0x48, 0x00, 0x52, 0x05, - 0x73, 0x70, 0x65, 0x6e, 0x64, 0x12, 0x50, 0x0a, 0x06, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, - 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, - 0x73, 0x68, 0x69, 0x65, 0x6c, 0x64, 0x65, 0x64, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x2e, 0x76, 0x31, - 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x48, 0x00, 0x52, - 0x06, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x40, 0x0a, 0x04, 0x73, 0x77, 0x61, 0x70, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, - 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, - 0x64, 0x65, 0x78, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x77, 0x61, - 0x70, 0x48, 0x00, 0x52, 0x04, 0x73, 0x77, 0x61, 0x70, 0x12, 0x50, 0x0a, 0x0a, 0x73, 0x77, 0x61, - 0x70, 0x5f, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, - 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, - 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x64, 0x65, 0x78, 0x2e, 0x76, 0x31, 0x61, 0x6c, - 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x77, 0x61, 0x70, 0x43, 0x6c, 0x61, 0x69, 0x6d, 0x48, 0x00, - 0x52, 0x09, 0x73, 0x77, 0x61, 0x70, 0x43, 0x6c, 0x61, 0x69, 0x6d, 0x12, 0x70, 0x0a, 0x14, 0x76, - 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, - 0x69, 0x6f, 0x6e, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3b, 0x2e, 0x70, 0x65, 0x6e, 0x75, - 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, - 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x74, 0x61, 0x6b, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, - 0x61, 0x31, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x44, 0x65, 0x66, 0x69, - 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x13, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, - 0x74, 0x6f, 0x72, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x5a, 0x0a, - 0x10, 0x69, 0x62, 0x63, 0x5f, 0x72, 0x65, 0x6c, 0x61, 0x79, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, + 0x31, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x72, + 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x52, 0x15, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x12, 0x58, + 0x0a, 0x0e, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x61, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, + 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, 0x65, 0x74, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x52, 0x0d, 0x64, 0x65, 0x74, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x12, 0x46, 0x0a, 0x04, 0x6d, 0x65, 0x6d, 0x6f, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, + 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4d, 0x65, 0x6d, 0x6f, + 0x43, 0x69, 0x70, 0x68, 0x65, 0x72, 0x74, 0x65, 0x78, 0x74, 0x52, 0x04, 0x6d, 0x65, 0x6d, 0x6f, + 0x22, 0x94, 0x01, 0x0a, 0x15, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x65, 0x78, + 0x70, 0x69, 0x72, 0x79, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x0c, 0x65, 0x78, 0x70, 0x69, 0x72, 0x79, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 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, 0x3b, 0x0a, 0x03, 0x66, 0x65, + 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, - 0x74, 0x2e, 0x69, 0x62, 0x63, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x49, - 0x62, 0x63, 0x52, 0x65, 0x6c, 0x61, 0x79, 0x48, 0x00, 0x52, 0x0e, 0x69, 0x62, 0x63, 0x52, 0x65, - 0x6c, 0x61, 0x79, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x66, 0x0a, 0x0f, 0x70, 0x72, 0x6f, - 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x5f, 0x73, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x18, 0x12, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x3b, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, - 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x6f, 0x76, - 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, - 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x48, - 0x00, 0x52, 0x0e, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x53, 0x75, 0x62, 0x6d, 0x69, - 0x74, 0x12, 0x6c, 0x0a, 0x11, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x5f, 0x77, 0x69, - 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x18, 0x13, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3d, 0x2e, 0x70, + 0x74, 0x2e, 0x66, 0x65, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x46, + 0x65, 0x65, 0x52, 0x03, 0x66, 0x65, 0x65, 0x22, 0x59, 0x0a, 0x0d, 0x44, 0x65, 0x74, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x12, 0x48, 0x0a, 0x09, 0x66, 0x6d, 0x64, 0x5f, + 0x63, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x70, 0x65, + 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x2e, 0x64, 0x65, + 0x63, 0x61, 0x66, 0x33, 0x37, 0x37, 0x5f, 0x66, 0x6d, 0x64, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, + 0x68, 0x61, 0x31, 0x2e, 0x43, 0x6c, 0x75, 0x65, 0x52, 0x08, 0x66, 0x6d, 0x64, 0x43, 0x6c, 0x75, + 0x65, 0x73, 0x22, 0x9a, 0x11, 0x0a, 0x06, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x4d, 0x0a, + 0x05, 0x73, 0x70, 0x65, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, - 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, - 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x6f, - 0x73, 0x61, 0x6c, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x48, 0x00, 0x52, 0x10, 0x70, - 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x12, - 0x63, 0x0a, 0x0e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x76, 0x6f, 0x74, - 0x65, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, - 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, - 0x74, 0x2e, 0x67, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, - 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x56, - 0x6f, 0x74, 0x65, 0x48, 0x00, 0x52, 0x0d, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, - 0x56, 0x6f, 0x74, 0x65, 0x12, 0x63, 0x0a, 0x0e, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x6f, - 0x72, 0x5f, 0x76, 0x6f, 0x74, 0x65, 0x18, 0x15, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x70, + 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x68, 0x69, 0x65, 0x6c, 0x64, 0x65, 0x64, 0x5f, + 0x70, 0x6f, 0x6f, 0x6c, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x70, + 0x65, 0x6e, 0x64, 0x48, 0x00, 0x52, 0x05, 0x73, 0x70, 0x65, 0x6e, 0x64, 0x12, 0x50, 0x0a, 0x06, + 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, - 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, - 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x67, - 0x61, 0x74, 0x6f, 0x72, 0x56, 0x6f, 0x74, 0x65, 0x48, 0x00, 0x52, 0x0d, 0x64, 0x65, 0x6c, 0x65, - 0x67, 0x61, 0x74, 0x6f, 0x72, 0x56, 0x6f, 0x74, 0x65, 0x12, 0x79, 0x0a, 0x16, 0x70, 0x72, 0x6f, - 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x5f, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x5f, 0x63, 0x6c, - 0x61, 0x69, 0x6d, 0x18, 0x16, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x41, 0x2e, 0x70, 0x65, 0x6e, 0x75, + 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x68, 0x69, 0x65, 0x6c, 0x64, 0x65, 0x64, 0x5f, + 0x70, 0x6f, 0x6f, 0x6c, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4f, 0x75, + 0x74, 0x70, 0x75, 0x74, 0x48, 0x00, 0x52, 0x06, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x40, + 0x0a, 0x04, 0x73, 0x77, 0x61, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x70, + 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, + 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x64, 0x65, 0x78, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, + 0x68, 0x61, 0x31, 0x2e, 0x53, 0x77, 0x61, 0x70, 0x48, 0x00, 0x52, 0x04, 0x73, 0x77, 0x61, 0x70, + 0x12, 0x50, 0x0a, 0x0a, 0x73, 0x77, 0x61, 0x70, 0x5f, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, + 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x64, + 0x65, 0x78, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x77, 0x61, 0x70, + 0x43, 0x6c, 0x61, 0x69, 0x6d, 0x48, 0x00, 0x52, 0x09, 0x73, 0x77, 0x61, 0x70, 0x43, 0x6c, 0x61, + 0x69, 0x6d, 0x12, 0x70, 0x0a, 0x14, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x5f, + 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x3b, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, + 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x74, 0x61, 0x6b, 0x65, + 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, + 0x74, 0x6f, 0x72, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, + 0x13, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x5a, 0x0a, 0x10, 0x69, 0x62, 0x63, 0x5f, 0x72, 0x65, 0x6c, 0x61, + 0x79, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, + 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, + 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x69, 0x62, 0x63, 0x2e, 0x76, 0x31, 0x61, + 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x49, 0x62, 0x63, 0x52, 0x65, 0x6c, 0x61, 0x79, 0x48, 0x00, + 0x52, 0x0e, 0x69, 0x62, 0x63, 0x52, 0x65, 0x6c, 0x61, 0x79, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x12, 0x66, 0x0a, 0x0f, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x5f, 0x73, 0x75, 0x62, + 0x6d, 0x69, 0x74, 0x18, 0x12, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3b, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, - 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x43, 0x6c, 0x61, 0x69, 0x6d, 0x48, 0x00, 0x52, 0x14, - 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x43, - 0x6c, 0x61, 0x69, 0x6d, 0x12, 0x59, 0x0a, 0x0d, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, - 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x18, 0x1e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x70, 0x65, - 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, - 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x64, 0x65, 0x78, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, - 0x61, 0x31, 0x2e, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x4f, 0x70, 0x65, 0x6e, 0x48, - 0x00, 0x52, 0x0c, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x4f, 0x70, 0x65, 0x6e, 0x12, - 0x5c, 0x0a, 0x0e, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x6c, 0x6f, 0x73, - 0x65, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, - 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, - 0x74, 0x2e, 0x64, 0x65, 0x78, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, - 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x48, 0x00, 0x52, 0x0d, - 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x12, 0x65, 0x0a, - 0x11, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x64, 0x72, - 0x61, 0x77, 0x18, 0x20, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, - 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, - 0x6e, 0x74, 0x2e, 0x64, 0x65, 0x78, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, - 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, - 0x48, 0x00, 0x52, 0x10, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x69, 0x74, 0x68, - 0x64, 0x72, 0x61, 0x77, 0x12, 0x6f, 0x0a, 0x15, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, - 0x5f, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x5f, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x18, 0x22, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, - 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x64, 0x65, - 0x78, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x6f, 0x73, 0x69, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x43, 0x6c, 0x61, 0x69, 0x6d, 0x48, 0x00, - 0x52, 0x13, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, - 0x43, 0x6c, 0x61, 0x69, 0x6d, 0x12, 0x4e, 0x0a, 0x08, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, - 0x65, 0x18, 0x28, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, - 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, - 0x74, 0x2e, 0x73, 0x74, 0x61, 0x6b, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, - 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x65, 0x48, 0x00, 0x52, 0x08, 0x64, 0x65, 0x6c, - 0x65, 0x67, 0x61, 0x74, 0x65, 0x12, 0x54, 0x0a, 0x0a, 0x75, 0x6e, 0x64, 0x65, 0x6c, 0x65, 0x67, - 0x61, 0x74, 0x65, 0x18, 0x29, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x70, 0x65, 0x6e, 0x75, - 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, - 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x74, 0x61, 0x6b, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, - 0x61, 0x31, 0x2e, 0x55, 0x6e, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x65, 0x48, 0x00, 0x52, - 0x0a, 0x75, 0x6e, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x65, 0x12, 0x64, 0x0a, 0x10, 0x75, - 0x6e, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x65, 0x5f, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x18, - 0x2a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, - 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, - 0x73, 0x74, 0x61, 0x6b, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x55, - 0x6e, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x65, 0x43, 0x6c, 0x61, 0x69, 0x6d, 0x48, 0x00, - 0x52, 0x0f, 0x75, 0x6e, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x65, 0x43, 0x6c, 0x61, 0x69, - 0x6d, 0x12, 0x54, 0x0a, 0x09, 0x64, 0x61, 0x6f, 0x5f, 0x73, 0x70, 0x65, 0x6e, 0x64, 0x18, 0x32, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, - 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x67, - 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, - 0x61, 0x31, 0x2e, 0x44, 0x61, 0x6f, 0x53, 0x70, 0x65, 0x6e, 0x64, 0x48, 0x00, 0x52, 0x08, 0x64, - 0x61, 0x6f, 0x53, 0x70, 0x65, 0x6e, 0x64, 0x12, 0x57, 0x0a, 0x0a, 0x64, 0x61, 0x6f, 0x5f, 0x6f, - 0x75, 0x74, 0x70, 0x75, 0x74, 0x18, 0x33, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x70, 0x65, - 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, - 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, - 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, 0x61, 0x6f, 0x4f, 0x75, 0x74, - 0x70, 0x75, 0x74, 0x48, 0x00, 0x52, 0x09, 0x64, 0x61, 0x6f, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, - 0x12, 0x5a, 0x0a, 0x0b, 0x64, 0x61, 0x6f, 0x5f, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x18, - 0x34, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, - 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, - 0x67, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, - 0x68, 0x61, 0x31, 0x2e, 0x44, 0x61, 0x6f, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x48, 0x00, - 0x52, 0x0a, 0x64, 0x61, 0x6f, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x12, 0x63, 0x0a, 0x10, - 0x69, 0x63, 0x73, 0x32, 0x30, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, - 0x18, 0xc8, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, - 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, - 0x74, 0x2e, 0x69, 0x62, 0x63, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x49, - 0x63, 0x73, 0x32, 0x30, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x48, 0x00, - 0x52, 0x0f, 0x69, 0x63, 0x73, 0x32, 0x30, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, - 0x6c, 0x42, 0x08, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x97, 0x04, 0x0a, 0x16, - 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x72, 0x73, 0x70, - 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x12, 0x5f, 0x0a, 0x0c, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, - 0x64, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3c, 0x2e, 0x70, - 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72, 0x61, - 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, - 0x31, 0x2e, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x4b, 0x65, 0x79, 0x57, 0x69, 0x74, 0x68, - 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0b, 0x70, 0x61, 0x79, 0x6c, - 0x6f, 0x61, 0x64, 0x4b, 0x65, 0x79, 0x73, 0x12, 0x60, 0x0a, 0x10, 0x73, 0x70, 0x65, 0x6e, 0x64, - 0x5f, 0x6e, 0x75, 0x6c, 0x6c, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x35, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, - 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, - 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x69, 0x66, 0x69, 0x65, 0x72, - 0x57, 0x69, 0x74, 0x68, 0x4e, 0x6f, 0x74, 0x65, 0x52, 0x0f, 0x73, 0x70, 0x65, 0x6e, 0x64, 0x4e, - 0x75, 0x6c, 0x6c, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x12, 0x57, 0x0a, 0x0c, 0x61, 0x64, 0x76, - 0x69, 0x63, 0x65, 0x5f, 0x6e, 0x6f, 0x74, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x34, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, - 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x68, 0x69, 0x65, 0x6c, 0x64, - 0x65, 0x64, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, - 0x2e, 0x4e, 0x6f, 0x74, 0x65, 0x52, 0x0b, 0x61, 0x64, 0x76, 0x69, 0x63, 0x65, 0x4e, 0x6f, 0x74, - 0x65, 0x73, 0x12, 0x4d, 0x0a, 0x0d, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x5f, 0x76, 0x69, - 0x65, 0x77, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x70, 0x65, 0x6e, 0x75, - 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6b, 0x65, 0x79, 0x73, 0x2e, 0x76, - 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x56, - 0x69, 0x65, 0x77, 0x52, 0x0c, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x56, 0x69, 0x65, 0x77, - 0x73, 0x12, 0x43, 0x0a, 0x06, 0x64, 0x65, 0x6e, 0x6f, 0x6d, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x2b, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, - 0x65, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, - 0x2e, 0x44, 0x65, 0x6e, 0x6f, 0x6d, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x06, - 0x64, 0x65, 0x6e, 0x6f, 0x6d, 0x73, 0x12, 0x4d, 0x0a, 0x0e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, - 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, - 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, - 0x68, 0x61, 0x31, 0x2e, 0x49, 0x64, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x22, 0xb3, 0x01, 0x0a, 0x18, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, - 0x64, 0x4b, 0x65, 0x79, 0x57, 0x69, 0x74, 0x68, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, - 0x6e, 0x74, 0x12, 0x48, 0x0a, 0x0b, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x6b, 0x65, - 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, - 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6b, 0x65, 0x79, 0x73, 0x2e, 0x76, 0x31, 0x61, - 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x4b, 0x65, 0x79, - 0x52, 0x0a, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x4b, 0x65, 0x79, 0x12, 0x4d, 0x0a, 0x0a, - 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x2d, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x72, 0x79, 0x70, - 0x74, 0x6f, 0x2e, 0x74, 0x63, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, - 0x53, 0x74, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x52, - 0x0a, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0xac, 0x01, 0x0a, 0x11, - 0x4e, 0x75, 0x6c, 0x6c, 0x69, 0x66, 0x69, 0x65, 0x72, 0x57, 0x69, 0x74, 0x68, 0x4e, 0x6f, 0x74, - 0x65, 0x12, 0x4d, 0x0a, 0x09, 0x6e, 0x75, 0x6c, 0x6c, 0x69, 0x66, 0x69, 0x65, 0x72, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, - 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x73, - 0x63, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, - 0x69, 0x66, 0x69, 0x65, 0x72, 0x52, 0x09, 0x6e, 0x75, 0x6c, 0x6c, 0x69, 0x66, 0x69, 0x65, 0x72, - 0x12, 0x48, 0x0a, 0x04, 0x6e, 0x6f, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x34, + 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x48, 0x00, 0x52, 0x0e, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, + 0x61, 0x6c, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x12, 0x6c, 0x0a, 0x11, 0x70, 0x72, 0x6f, 0x70, + 0x6f, 0x73, 0x61, 0x6c, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x18, 0x13, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x3d, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, + 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x6f, + 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, + 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, + 0x61, 0x77, 0x48, 0x00, 0x52, 0x10, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x57, 0x69, + 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x12, 0x63, 0x0a, 0x0e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, + 0x74, 0x6f, 0x72, 0x5f, 0x76, 0x6f, 0x74, 0x65, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, - 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x68, 0x69, 0x65, 0x6c, 0x64, 0x65, - 0x64, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, - 0x4e, 0x6f, 0x74, 0x65, 0x52, 0x04, 0x6e, 0x6f, 0x74, 0x65, 0x22, 0xca, 0x01, 0x0a, 0x0f, 0x54, - 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x69, 0x65, 0x77, 0x12, 0x54, - 0x0a, 0x09, 0x62, 0x6f, 0x64, 0x79, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x37, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, - 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, - 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x42, 0x6f, 0x64, 0x79, 0x56, 0x69, 0x65, 0x77, 0x52, 0x08, 0x62, 0x6f, 0x64, 0x79, - 0x56, 0x69, 0x65, 0x77, 0x12, 0x1f, 0x0a, 0x0b, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, - 0x73, 0x69, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0a, 0x62, 0x69, 0x6e, 0x64, 0x69, - 0x6e, 0x67, 0x53, 0x69, 0x67, 0x12, 0x40, 0x0a, 0x06, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, - 0x2e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x2e, 0x74, 0x63, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, - 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4d, 0x65, 0x72, 0x6b, 0x6c, 0x65, 0x52, 0x6f, 0x6f, 0x74, 0x52, - 0x06, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x22, 0xbc, 0x03, 0x0a, 0x13, 0x54, 0x72, 0x61, 0x6e, - 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x6f, 0x64, 0x79, 0x56, 0x69, 0x65, 0x77, 0x12, - 0x51, 0x0a, 0x0c, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, - 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x56, 0x69, 0x65, 0x77, 0x52, 0x0b, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x69, 0x65, - 0x77, 0x73, 0x12, 0x70, 0x0a, 0x16, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, - 0x72, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, - 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x52, 0x15, 0x74, - 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, - 0x74, 0x65, 0x72, 0x73, 0x12, 0x3b, 0x0a, 0x03, 0x66, 0x65, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x29, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, - 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x66, 0x65, 0x65, 0x2e, - 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x46, 0x65, 0x65, 0x52, 0x03, 0x66, 0x65, - 0x65, 0x12, 0x58, 0x0a, 0x0e, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, - 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x70, 0x65, 0x6e, 0x75, - 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, - 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x52, 0x0d, 0x64, 0x65, - 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x12, 0x49, 0x0a, 0x09, 0x6d, - 0x65, 0x6d, 0x6f, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, - 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, - 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, - 0x68, 0x61, 0x31, 0x2e, 0x4d, 0x65, 0x6d, 0x6f, 0x56, 0x69, 0x65, 0x77, 0x52, 0x08, 0x6d, 0x65, - 0x6d, 0x6f, 0x56, 0x69, 0x65, 0x77, 0x22, 0xda, 0x10, 0x0a, 0x0a, 0x41, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x56, 0x69, 0x65, 0x77, 0x12, 0x51, 0x0a, 0x05, 0x73, 0x70, 0x65, 0x6e, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, - 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x73, - 0x68, 0x69, 0x65, 0x6c, 0x64, 0x65, 0x64, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x2e, 0x76, 0x31, 0x61, - 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x70, 0x65, 0x6e, 0x64, 0x56, 0x69, 0x65, 0x77, 0x48, - 0x00, 0x52, 0x05, 0x73, 0x70, 0x65, 0x6e, 0x64, 0x12, 0x54, 0x0a, 0x06, 0x6f, 0x75, 0x74, 0x70, - 0x75, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, - 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, - 0x6e, 0x74, 0x2e, 0x73, 0x68, 0x69, 0x65, 0x6c, 0x64, 0x65, 0x64, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, - 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, - 0x56, 0x69, 0x65, 0x77, 0x48, 0x00, 0x52, 0x06, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x44, - 0x0a, 0x04, 0x73, 0x77, 0x61, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x70, - 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, - 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x64, 0x65, 0x78, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, - 0x68, 0x61, 0x31, 0x2e, 0x53, 0x77, 0x61, 0x70, 0x56, 0x69, 0x65, 0x77, 0x48, 0x00, 0x52, 0x04, - 0x73, 0x77, 0x61, 0x70, 0x12, 0x54, 0x0a, 0x0a, 0x73, 0x77, 0x61, 0x70, 0x5f, 0x63, 0x6c, 0x61, - 0x69, 0x6d, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, - 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, - 0x6e, 0x74, 0x2e, 0x64, 0x65, 0x78, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, - 0x53, 0x77, 0x61, 0x70, 0x43, 0x6c, 0x61, 0x69, 0x6d, 0x56, 0x69, 0x65, 0x77, 0x48, 0x00, 0x52, - 0x09, 0x73, 0x77, 0x61, 0x70, 0x43, 0x6c, 0x61, 0x69, 0x6d, 0x12, 0x70, 0x0a, 0x14, 0x76, 0x61, - 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, - 0x6f, 0x6e, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3b, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, - 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, - 0x6e, 0x74, 0x2e, 0x73, 0x74, 0x61, 0x6b, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, - 0x31, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x44, 0x65, 0x66, 0x69, 0x6e, - 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x13, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, - 0x6f, 0x72, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x5a, 0x0a, 0x10, - 0x69, 0x62, 0x63, 0x5f, 0x72, 0x65, 0x6c, 0x61, 0x79, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x18, 0x11, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, - 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, - 0x2e, 0x69, 0x62, 0x63, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x49, 0x62, - 0x63, 0x52, 0x65, 0x6c, 0x61, 0x79, 0x48, 0x00, 0x52, 0x0e, 0x69, 0x62, 0x63, 0x52, 0x65, 0x6c, - 0x61, 0x79, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x66, 0x0a, 0x0f, 0x70, 0x72, 0x6f, 0x70, - 0x6f, 0x73, 0x61, 0x6c, 0x5f, 0x73, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x18, 0x12, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x3b, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, - 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x6f, 0x76, 0x65, - 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, - 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x48, 0x00, - 0x52, 0x0e, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, - 0x12, 0x6c, 0x0a, 0x11, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x5f, 0x77, 0x69, 0x74, - 0x68, 0x64, 0x72, 0x61, 0x77, 0x18, 0x13, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3d, 0x2e, 0x70, 0x65, - 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, - 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, - 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, - 0x61, 0x6c, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x48, 0x00, 0x52, 0x10, 0x70, 0x72, - 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x12, 0x63, - 0x0a, 0x0e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x76, 0x6f, 0x74, 0x65, - 0x18, 0x14, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, - 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, - 0x2e, 0x67, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, - 0x70, 0x68, 0x61, 0x31, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x56, 0x6f, - 0x74, 0x65, 0x48, 0x00, 0x52, 0x0d, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x56, - 0x6f, 0x74, 0x65, 0x12, 0x67, 0x0a, 0x0e, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, - 0x5f, 0x76, 0x6f, 0x74, 0x65, 0x18, 0x15, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3e, 0x2e, 0x70, 0x65, - 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, - 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, - 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x67, 0x61, - 0x74, 0x6f, 0x72, 0x56, 0x6f, 0x74, 0x65, 0x56, 0x69, 0x65, 0x77, 0x48, 0x00, 0x52, 0x0d, 0x64, - 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x56, 0x6f, 0x74, 0x65, 0x12, 0x79, 0x0a, 0x16, - 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x5f, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, - 0x5f, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x18, 0x16, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x41, 0x2e, 0x70, - 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, - 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, - 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x6f, - 0x73, 0x61, 0x6c, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x43, 0x6c, 0x61, 0x69, 0x6d, 0x48, - 0x00, 0x52, 0x14, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x44, 0x65, 0x70, 0x6f, 0x73, - 0x69, 0x74, 0x43, 0x6c, 0x61, 0x69, 0x6d, 0x12, 0x59, 0x0a, 0x0d, 0x70, 0x6f, 0x73, 0x69, 0x74, - 0x69, 0x6f, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x18, 0x1e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x32, + 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, + 0x6e, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x56, 0x61, 0x6c, + 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x56, 0x6f, 0x74, 0x65, 0x48, 0x00, 0x52, 0x0d, 0x76, 0x61, + 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x56, 0x6f, 0x74, 0x65, 0x12, 0x63, 0x0a, 0x0e, 0x64, + 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x76, 0x6f, 0x74, 0x65, 0x18, 0x15, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, + 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x6f, + 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, + 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x56, 0x6f, 0x74, 0x65, 0x48, + 0x00, 0x52, 0x0d, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x56, 0x6f, 0x74, 0x65, + 0x12, 0x79, 0x0a, 0x16, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x5f, 0x64, 0x65, 0x70, + 0x6f, 0x73, 0x69, 0x74, 0x5f, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x18, 0x16, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x41, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, + 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x6f, 0x76, 0x65, 0x72, + 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, + 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x43, 0x6c, + 0x61, 0x69, 0x6d, 0x48, 0x00, 0x52, 0x14, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x44, + 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x43, 0x6c, 0x61, 0x69, 0x6d, 0x12, 0x59, 0x0a, 0x0d, 0x70, + 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x18, 0x1e, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, + 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x64, 0x65, 0x78, + 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x4f, 0x70, 0x65, 0x6e, 0x48, 0x00, 0x52, 0x0c, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x4f, 0x70, 0x65, 0x6e, 0x12, 0x5c, 0x0a, 0x0e, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x5f, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x64, 0x65, 0x78, 0x2e, 0x76, 0x31, 0x61, - 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x4f, 0x70, - 0x65, 0x6e, 0x48, 0x00, 0x52, 0x0c, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x4f, 0x70, - 0x65, 0x6e, 0x12, 0x5c, 0x0a, 0x0e, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, - 0x6c, 0x6f, 0x73, 0x65, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x70, 0x65, 0x6e, + 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6c, + 0x6f, 0x73, 0x65, 0x48, 0x00, 0x52, 0x0d, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x43, + 0x6c, 0x6f, 0x73, 0x65, 0x12, 0x65, 0x0a, 0x11, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x5f, 0x77, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x18, 0x20, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x36, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, + 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x64, 0x65, 0x78, 0x2e, 0x76, 0x31, + 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x57, + 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x48, 0x00, 0x52, 0x10, 0x70, 0x6f, 0x73, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x12, 0x6f, 0x0a, 0x15, 0x70, + 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x5f, 0x63, + 0x6c, 0x61, 0x69, 0x6d, 0x18, 0x22, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x64, 0x65, 0x78, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, - 0x31, 0x2e, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x48, - 0x00, 0x52, 0x0d, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6c, 0x6f, 0x73, 0x65, - 0x12, 0x65, 0x0a, 0x11, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x77, 0x69, 0x74, - 0x68, 0x64, 0x72, 0x61, 0x77, 0x18, 0x20, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x70, 0x65, - 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, - 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x64, 0x65, 0x78, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, - 0x61, 0x31, 0x2e, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x69, 0x74, 0x68, 0x64, - 0x72, 0x61, 0x77, 0x48, 0x00, 0x52, 0x10, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x57, - 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x12, 0x6f, 0x0a, 0x15, 0x70, 0x6f, 0x73, 0x69, 0x74, - 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x5f, 0x63, 0x6c, 0x61, 0x69, 0x6d, - 0x18, 0x22, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, - 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, - 0x2e, 0x64, 0x65, 0x78, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x6f, - 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x43, 0x6c, 0x61, 0x69, - 0x6d, 0x48, 0x00, 0x52, 0x13, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x77, - 0x61, 0x72, 0x64, 0x43, 0x6c, 0x61, 0x69, 0x6d, 0x12, 0x4e, 0x0a, 0x08, 0x64, 0x65, 0x6c, 0x65, - 0x67, 0x61, 0x74, 0x65, 0x18, 0x29, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x70, 0x65, 0x6e, - 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, - 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x74, 0x61, 0x6b, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, - 0x68, 0x61, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x65, 0x48, 0x00, 0x52, 0x08, - 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x65, 0x12, 0x54, 0x0a, 0x0a, 0x75, 0x6e, 0x64, 0x65, - 0x6c, 0x65, 0x67, 0x61, 0x74, 0x65, 0x18, 0x2a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x70, + 0x31, 0x2e, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, + 0x43, 0x6c, 0x61, 0x69, 0x6d, 0x48, 0x00, 0x52, 0x13, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x43, 0x6c, 0x61, 0x69, 0x6d, 0x12, 0x4e, 0x0a, 0x08, + 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x65, 0x18, 0x28, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, + 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, + 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x74, 0x61, 0x6b, 0x65, 0x2e, 0x76, + 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x65, + 0x48, 0x00, 0x52, 0x08, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x65, 0x12, 0x54, 0x0a, 0x0a, + 0x75, 0x6e, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x65, 0x18, 0x29, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x32, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, + 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x74, 0x61, 0x6b, 0x65, + 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x55, 0x6e, 0x64, 0x65, 0x6c, 0x65, + 0x67, 0x61, 0x74, 0x65, 0x48, 0x00, 0x52, 0x0a, 0x75, 0x6e, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, + 0x74, 0x65, 0x12, 0x64, 0x0a, 0x10, 0x75, 0x6e, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x65, + 0x5f, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x18, 0x2a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x74, 0x61, 0x6b, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x55, 0x6e, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x65, - 0x48, 0x00, 0x52, 0x0a, 0x75, 0x6e, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x65, 0x12, 0x54, - 0x0a, 0x09, 0x64, 0x61, 0x6f, 0x5f, 0x73, 0x70, 0x65, 0x6e, 0x64, 0x18, 0x32, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x35, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, - 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x6f, 0x76, 0x65, - 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, - 0x44, 0x61, 0x6f, 0x53, 0x70, 0x65, 0x6e, 0x64, 0x48, 0x00, 0x52, 0x08, 0x64, 0x61, 0x6f, 0x53, - 0x70, 0x65, 0x6e, 0x64, 0x12, 0x57, 0x0a, 0x0a, 0x64, 0x61, 0x6f, 0x5f, 0x6f, 0x75, 0x74, 0x70, - 0x75, 0x74, 0x18, 0x33, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, + 0x43, 0x6c, 0x61, 0x69, 0x6d, 0x48, 0x00, 0x52, 0x0f, 0x75, 0x6e, 0x64, 0x65, 0x6c, 0x65, 0x67, + 0x61, 0x74, 0x65, 0x43, 0x6c, 0x61, 0x69, 0x6d, 0x12, 0x73, 0x0a, 0x14, 0x63, 0x6f, 0x6d, 0x6d, + 0x75, 0x6e, 0x69, 0x74, 0x79, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x73, 0x70, 0x65, 0x6e, 0x64, + 0x18, 0x32, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3f, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, + 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, + 0x2e, 0x67, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, + 0x70, 0x68, 0x61, 0x31, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x74, 0x79, 0x50, 0x6f, + 0x6f, 0x6c, 0x53, 0x70, 0x65, 0x6e, 0x64, 0x48, 0x00, 0x52, 0x12, 0x63, 0x6f, 0x6d, 0x6d, 0x75, + 0x6e, 0x69, 0x74, 0x79, 0x50, 0x6f, 0x6f, 0x6c, 0x53, 0x70, 0x65, 0x6e, 0x64, 0x12, 0x76, 0x0a, + 0x15, 0x63, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x74, 0x79, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, + 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x18, 0x33, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x40, 0x2e, 0x70, + 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, + 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, + 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x75, + 0x6e, 0x69, 0x74, 0x79, 0x50, 0x6f, 0x6f, 0x6c, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x48, 0x00, + 0x52, 0x13, 0x63, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x74, 0x79, 0x50, 0x6f, 0x6f, 0x6c, 0x4f, + 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x79, 0x0a, 0x16, 0x63, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, + 0x74, 0x79, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x18, + 0x34, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x41, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, + 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, + 0x67, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, + 0x68, 0x61, 0x31, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x74, 0x79, 0x50, 0x6f, 0x6f, + 0x6c, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x48, 0x00, 0x52, 0x14, 0x63, 0x6f, 0x6d, 0x6d, + 0x75, 0x6e, 0x69, 0x74, 0x79, 0x50, 0x6f, 0x6f, 0x6c, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, + 0x12, 0x63, 0x0a, 0x10, 0x69, 0x63, 0x73, 0x32, 0x30, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x64, 0x72, + 0x61, 0x77, 0x61, 0x6c, 0x18, 0xc8, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x70, 0x65, + 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, + 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x69, 0x62, 0x63, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, + 0x61, 0x31, 0x2e, 0x49, 0x63, 0x73, 0x32, 0x30, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, + 0x61, 0x6c, 0x48, 0x00, 0x52, 0x0f, 0x69, 0x63, 0x73, 0x32, 0x30, 0x57, 0x69, 0x74, 0x68, 0x64, + 0x72, 0x61, 0x77, 0x61, 0x6c, 0x42, 0x08, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x9d, 0x04, 0x0a, 0x16, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, + 0x65, 0x72, 0x73, 0x70, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x12, 0x5f, 0x0a, 0x0c, 0x70, 0x61, + 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x3c, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, + 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x61, + 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x4b, 0x65, 0x79, + 0x57, 0x69, 0x74, 0x68, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0b, + 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x4b, 0x65, 0x79, 0x73, 0x12, 0x60, 0x0a, 0x10, 0x73, + 0x70, 0x65, 0x6e, 0x64, 0x5f, 0x6e, 0x75, 0x6c, 0x6c, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x18, + 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, + 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x69, + 0x66, 0x69, 0x65, 0x72, 0x57, 0x69, 0x74, 0x68, 0x4e, 0x6f, 0x74, 0x65, 0x52, 0x0f, 0x73, 0x70, + 0x65, 0x6e, 0x64, 0x4e, 0x75, 0x6c, 0x6c, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x12, 0x57, 0x0a, + 0x0c, 0x61, 0x64, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x6e, 0x6f, 0x74, 0x65, 0x73, 0x18, 0x03, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, + 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x68, + 0x69, 0x65, 0x6c, 0x64, 0x65, 0x64, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x2e, 0x76, 0x31, 0x61, 0x6c, + 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4e, 0x6f, 0x74, 0x65, 0x52, 0x0b, 0x61, 0x64, 0x76, 0x69, 0x63, + 0x65, 0x4e, 0x6f, 0x74, 0x65, 0x73, 0x12, 0x4d, 0x0a, 0x0d, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, + 0x73, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, + 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6b, 0x65, + 0x79, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x72, + 0x65, 0x73, 0x73, 0x56, 0x69, 0x65, 0x77, 0x52, 0x0c, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, + 0x56, 0x69, 0x65, 0x77, 0x73, 0x12, 0x43, 0x0a, 0x06, 0x64, 0x65, 0x6e, 0x6f, 0x6d, 0x73, 0x18, + 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, + 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, + 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, 0x65, 0x6e, 0x6f, 0x6d, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, + 0x74, 0x61, 0x52, 0x06, 0x64, 0x65, 0x6e, 0x6f, 0x6d, 0x73, 0x12, 0x53, 0x0a, 0x0e, 0x74, 0x72, + 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, + 0x72, 0x65, 0x2e, 0x74, 0x78, 0x68, 0x61, 0x73, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, + 0x61, 0x31, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, + 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x22, + 0xb3, 0x01, 0x0a, 0x18, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x4b, 0x65, 0x79, 0x57, 0x69, + 0x74, 0x68, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x48, 0x0a, 0x0b, + 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x27, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, + 0x65, 0x2e, 0x6b, 0x65, 0x79, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, + 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x4b, 0x65, 0x79, 0x52, 0x0a, 0x70, 0x61, 0x79, 0x6c, + 0x6f, 0x61, 0x64, 0x4b, 0x65, 0x79, 0x12, 0x4d, 0x0a, 0x0a, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, + 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x70, 0x65, 0x6e, + 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x2e, 0x74, 0x63, 0x74, + 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x43, + 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0a, 0x63, 0x6f, 0x6d, 0x6d, 0x69, + 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0xac, 0x01, 0x0a, 0x11, 0x4e, 0x75, 0x6c, 0x6c, 0x69, 0x66, + 0x69, 0x65, 0x72, 0x57, 0x69, 0x74, 0x68, 0x4e, 0x6f, 0x74, 0x65, 0x12, 0x4d, 0x0a, 0x09, 0x6e, + 0x75, 0x6c, 0x6c, 0x69, 0x66, 0x69, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, + 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, + 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x63, 0x74, 0x2e, 0x76, 0x31, 0x61, + 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x69, 0x66, 0x69, 0x65, 0x72, 0x52, + 0x09, 0x6e, 0x75, 0x6c, 0x6c, 0x69, 0x66, 0x69, 0x65, 0x72, 0x12, 0x48, 0x0a, 0x04, 0x6e, 0x6f, + 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, + 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, + 0x6e, 0x74, 0x2e, 0x73, 0x68, 0x69, 0x65, 0x6c, 0x64, 0x65, 0x64, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, + 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4e, 0x6f, 0x74, 0x65, 0x52, 0x04, + 0x6e, 0x6f, 0x74, 0x65, 0x22, 0x84, 0x02, 0x0a, 0x0f, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x69, 0x65, 0x77, 0x12, 0x54, 0x0a, 0x09, 0x62, 0x6f, 0x64, 0x79, + 0x5f, 0x76, 0x69, 0x65, 0x77, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x70, 0x65, + 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, + 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, + 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x6f, 0x64, 0x79, + 0x56, 0x69, 0x65, 0x77, 0x52, 0x08, 0x62, 0x6f, 0x64, 0x79, 0x56, 0x69, 0x65, 0x77, 0x12, 0x59, + 0x0a, 0x0b, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x73, 0x69, 0x67, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, + 0x72, 0x79, 0x70, 0x74, 0x6f, 0x2e, 0x64, 0x65, 0x63, 0x61, 0x66, 0x33, 0x37, 0x37, 0x5f, 0x72, + 0x64, 0x73, 0x61, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x42, 0x69, 0x6e, + 0x64, 0x69, 0x6e, 0x67, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x52, 0x0a, 0x62, + 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x53, 0x69, 0x67, 0x12, 0x40, 0x0a, 0x06, 0x61, 0x6e, 0x63, + 0x68, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x70, 0x65, 0x6e, 0x75, + 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x2e, 0x74, 0x63, 0x74, 0x2e, + 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4d, 0x65, 0x72, 0x6b, 0x6c, 0x65, 0x52, + 0x6f, 0x6f, 0x74, 0x52, 0x06, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x22, 0xff, 0x02, 0x0a, 0x13, + 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x6f, 0x64, 0x79, 0x56, + 0x69, 0x65, 0x77, 0x12, 0x51, 0x0a, 0x0c, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x76, 0x69, + 0x65, 0x77, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x70, 0x65, 0x6e, 0x75, + 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x41, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x69, 0x65, 0x77, 0x52, 0x0b, 0x61, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x56, 0x69, 0x65, 0x77, 0x73, 0x12, 0x70, 0x0a, 0x16, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, + 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x54, 0x72, 0x61, 0x6e, + 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, + 0x73, 0x52, 0x15, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x61, + 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x12, 0x58, 0x0a, 0x0e, 0x64, 0x65, 0x74, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x31, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, + 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x61, + 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, + 0x61, 0x74, 0x61, 0x52, 0x0d, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, + 0x74, 0x61, 0x12, 0x49, 0x0a, 0x09, 0x6d, 0x65, 0x6d, 0x6f, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, + 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4d, 0x65, 0x6d, 0x6f, 0x56, + 0x69, 0x65, 0x77, 0x52, 0x08, 0x6d, 0x65, 0x6d, 0x6f, 0x56, 0x69, 0x65, 0x77, 0x22, 0xb7, 0x11, + 0x0a, 0x0a, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x69, 0x65, 0x77, 0x12, 0x51, 0x0a, 0x05, + 0x73, 0x70, 0x65, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x70, 0x65, + 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, + 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x68, 0x69, 0x65, 0x6c, 0x64, 0x65, 0x64, 0x5f, 0x70, + 0x6f, 0x6f, 0x6c, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x70, 0x65, + 0x6e, 0x64, 0x56, 0x69, 0x65, 0x77, 0x48, 0x00, 0x52, 0x05, 0x73, 0x70, 0x65, 0x6e, 0x64, 0x12, + 0x54, 0x0a, 0x06, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x3a, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, + 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x68, 0x69, 0x65, 0x6c, 0x64, + 0x65, 0x64, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, + 0x2e, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x56, 0x69, 0x65, 0x77, 0x48, 0x00, 0x52, 0x06, 0x6f, + 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x44, 0x0a, 0x04, 0x73, 0x77, 0x61, 0x70, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, + 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x64, 0x65, + 0x78, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x77, 0x61, 0x70, 0x56, + 0x69, 0x65, 0x77, 0x48, 0x00, 0x52, 0x04, 0x73, 0x77, 0x61, 0x70, 0x12, 0x54, 0x0a, 0x0a, 0x73, + 0x77, 0x61, 0x70, 0x5f, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x33, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, + 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x64, 0x65, 0x78, 0x2e, 0x76, 0x31, + 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x77, 0x61, 0x70, 0x43, 0x6c, 0x61, 0x69, 0x6d, + 0x56, 0x69, 0x65, 0x77, 0x48, 0x00, 0x52, 0x09, 0x73, 0x77, 0x61, 0x70, 0x43, 0x6c, 0x61, 0x69, + 0x6d, 0x12, 0x70, 0x0a, 0x14, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x64, + 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x3b, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, + 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x74, 0x61, 0x6b, 0x65, 0x2e, + 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, + 0x6f, 0x72, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x13, + 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x5a, 0x0a, 0x10, 0x69, 0x62, 0x63, 0x5f, 0x72, 0x65, 0x6c, 0x61, 0x79, + 0x5f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, + 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, + 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x69, 0x62, 0x63, 0x2e, 0x76, 0x31, 0x61, 0x6c, + 0x70, 0x68, 0x61, 0x31, 0x2e, 0x49, 0x62, 0x63, 0x52, 0x65, 0x6c, 0x61, 0x79, 0x48, 0x00, 0x52, + 0x0e, 0x69, 0x62, 0x63, 0x52, 0x65, 0x6c, 0x61, 0x79, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x66, 0x0a, 0x0f, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x5f, 0x73, 0x75, 0x62, 0x6d, + 0x69, 0x74, 0x18, 0x12, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3b, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x76, 0x31, - 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, 0x61, 0x6f, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, - 0x48, 0x00, 0x52, 0x09, 0x64, 0x61, 0x6f, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x5a, 0x0a, - 0x0b, 0x64, 0x61, 0x6f, 0x5f, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x18, 0x34, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, + 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x53, + 0x75, 0x62, 0x6d, 0x69, 0x74, 0x48, 0x00, 0x52, 0x0e, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, + 0x6c, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x12, 0x6c, 0x0a, 0x11, 0x70, 0x72, 0x6f, 0x70, 0x6f, + 0x73, 0x61, 0x6c, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x18, 0x13, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x3d, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, - 0x2e, 0x44, 0x61, 0x6f, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x48, 0x00, 0x52, 0x0a, 0x64, - 0x61, 0x6f, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x12, 0x64, 0x0a, 0x10, 0x75, 0x6e, 0x64, - 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x65, 0x5f, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x18, 0x2b, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, + 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, + 0x77, 0x48, 0x00, 0x52, 0x10, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x57, 0x69, 0x74, + 0x68, 0x64, 0x72, 0x61, 0x77, 0x12, 0x63, 0x0a, 0x0e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, + 0x6f, 0x72, 0x5f, 0x76, 0x6f, 0x74, 0x65, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3a, 0x2e, + 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, + 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, + 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x56, 0x61, 0x6c, 0x69, + 0x64, 0x61, 0x74, 0x6f, 0x72, 0x56, 0x6f, 0x74, 0x65, 0x48, 0x00, 0x52, 0x0d, 0x76, 0x61, 0x6c, + 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x56, 0x6f, 0x74, 0x65, 0x12, 0x67, 0x0a, 0x0e, 0x64, 0x65, + 0x6c, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x76, 0x6f, 0x74, 0x65, 0x18, 0x15, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x3e, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, + 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x6f, 0x76, + 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, + 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x56, 0x6f, 0x74, 0x65, 0x56, 0x69, + 0x65, 0x77, 0x48, 0x00, 0x52, 0x0d, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x56, + 0x6f, 0x74, 0x65, 0x12, 0x79, 0x0a, 0x16, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x5f, + 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x5f, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x18, 0x16, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x41, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, + 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x6f, + 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, + 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, + 0x74, 0x43, 0x6c, 0x61, 0x69, 0x6d, 0x48, 0x00, 0x52, 0x14, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, + 0x61, 0x6c, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x43, 0x6c, 0x61, 0x69, 0x6d, 0x12, 0x59, + 0x0a, 0x0d, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x18, + 0x1e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, + 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, + 0x64, 0x65, 0x78, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x6f, 0x73, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x4f, 0x70, 0x65, 0x6e, 0x48, 0x00, 0x52, 0x0c, 0x70, 0x6f, 0x73, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x4f, 0x70, 0x65, 0x6e, 0x12, 0x5c, 0x0a, 0x0e, 0x70, 0x6f, 0x73, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x18, 0x1f, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x33, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, + 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x64, 0x65, 0x78, 0x2e, + 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, + 0x6e, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x48, 0x00, 0x52, 0x0d, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x12, 0x65, 0x0a, 0x11, 0x70, 0x6f, 0x73, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x18, 0x20, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, + 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x64, 0x65, 0x78, + 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x48, 0x00, 0x52, 0x10, 0x70, 0x6f, + 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x12, 0x6f, + 0x0a, 0x15, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x65, 0x77, 0x61, 0x72, + 0x64, 0x5f, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x18, 0x22, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x39, 0x2e, + 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, + 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x64, 0x65, 0x78, 0x2e, 0x76, 0x31, 0x61, 0x6c, + 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x77, + 0x61, 0x72, 0x64, 0x43, 0x6c, 0x61, 0x69, 0x6d, 0x48, 0x00, 0x52, 0x13, 0x70, 0x6f, 0x73, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x43, 0x6c, 0x61, 0x69, 0x6d, 0x12, + 0x4e, 0x0a, 0x08, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x65, 0x18, 0x29, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x30, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, + 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x74, 0x61, 0x6b, + 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x67, + 0x61, 0x74, 0x65, 0x48, 0x00, 0x52, 0x08, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x65, 0x12, + 0x54, 0x0a, 0x0a, 0x75, 0x6e, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x65, 0x18, 0x2a, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x74, 0x61, 0x6b, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x55, 0x6e, 0x64, - 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x65, 0x43, 0x6c, 0x61, 0x69, 0x6d, 0x48, 0x00, 0x52, 0x0f, - 0x75, 0x6e, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x65, 0x43, 0x6c, 0x61, 0x69, 0x6d, 0x12, - 0x63, 0x0a, 0x10, 0x69, 0x63, 0x73, 0x32, 0x30, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, - 0x77, 0x61, 0x6c, 0x18, 0xc8, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x70, 0x65, 0x6e, - 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, - 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x69, 0x62, 0x63, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, - 0x31, 0x2e, 0x49, 0x63, 0x73, 0x32, 0x30, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, - 0x6c, 0x48, 0x00, 0x52, 0x0f, 0x69, 0x63, 0x73, 0x32, 0x30, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, - 0x61, 0x77, 0x61, 0x6c, 0x42, 0x0d, 0x0a, 0x0b, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x76, - 0x69, 0x65, 0x77, 0x22, 0x22, 0x0a, 0x0a, 0x45, 0x66, 0x66, 0x65, 0x63, 0x74, 0x48, 0x61, 0x73, - 0x68, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, - 0x52, 0x05, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x22, 0xaf, 0x02, 0x0a, 0x11, 0x41, 0x75, 0x74, 0x68, - 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x12, 0x4f, 0x0a, + 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x65, 0x48, 0x00, 0x52, 0x0a, 0x75, 0x6e, 0x64, 0x65, 0x6c, + 0x65, 0x67, 0x61, 0x74, 0x65, 0x12, 0x73, 0x0a, 0x14, 0x63, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, + 0x74, 0x79, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x73, 0x70, 0x65, 0x6e, 0x64, 0x18, 0x32, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x3f, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, + 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x6f, + 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, + 0x31, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x74, 0x79, 0x50, 0x6f, 0x6f, 0x6c, 0x53, + 0x70, 0x65, 0x6e, 0x64, 0x48, 0x00, 0x52, 0x12, 0x63, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x74, + 0x79, 0x50, 0x6f, 0x6f, 0x6c, 0x53, 0x70, 0x65, 0x6e, 0x64, 0x12, 0x76, 0x0a, 0x15, 0x63, 0x6f, + 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x74, 0x79, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x6f, 0x75, 0x74, + 0x70, 0x75, 0x74, 0x18, 0x33, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x40, 0x2e, 0x70, 0x65, 0x6e, 0x75, + 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, + 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x76, + 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x74, + 0x79, 0x50, 0x6f, 0x6f, 0x6c, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x48, 0x00, 0x52, 0x13, 0x63, + 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x74, 0x79, 0x50, 0x6f, 0x6f, 0x6c, 0x4f, 0x75, 0x74, 0x70, + 0x75, 0x74, 0x12, 0x79, 0x0a, 0x16, 0x63, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x74, 0x79, 0x5f, + 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x18, 0x34, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x41, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, + 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x6f, 0x76, + 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, + 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x74, 0x79, 0x50, 0x6f, 0x6f, 0x6c, 0x44, 0x65, + 0x70, 0x6f, 0x73, 0x69, 0x74, 0x48, 0x00, 0x52, 0x14, 0x63, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, + 0x74, 0x79, 0x50, 0x6f, 0x6f, 0x6c, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x12, 0x64, 0x0a, + 0x10, 0x75, 0x6e, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x65, 0x5f, 0x63, 0x6c, 0x61, 0x69, + 0x6d, 0x18, 0x2b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, + 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, + 0x74, 0x2e, 0x73, 0x74, 0x61, 0x6b, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, + 0x2e, 0x55, 0x6e, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x65, 0x43, 0x6c, 0x61, 0x69, 0x6d, + 0x48, 0x00, 0x52, 0x0f, 0x75, 0x6e, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x65, 0x43, 0x6c, + 0x61, 0x69, 0x6d, 0x12, 0x63, 0x0a, 0x10, 0x69, 0x63, 0x73, 0x32, 0x30, 0x5f, 0x77, 0x69, 0x74, + 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x18, 0xc8, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x35, + 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, + 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x69, 0x62, 0x63, 0x2e, 0x76, 0x31, 0x61, + 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x49, 0x63, 0x73, 0x32, 0x30, 0x57, 0x69, 0x74, 0x68, 0x64, + 0x72, 0x61, 0x77, 0x61, 0x6c, 0x48, 0x00, 0x52, 0x0f, 0x69, 0x63, 0x73, 0x32, 0x30, 0x57, 0x69, + 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x42, 0x0d, 0x0a, 0x0b, 0x61, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x22, 0xaa, 0x02, 0x0a, 0x11, 0x41, 0x75, 0x74, 0x68, + 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x12, 0x4a, 0x0a, 0x0b, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, - 0x72, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, - 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x45, 0x66, 0x66, 0x65, 0x63, 0x74, 0x48, 0x61, - 0x73, 0x68, 0x52, 0x0a, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x48, 0x61, 0x73, 0x68, 0x12, 0x5b, - 0x0a, 0x0b, 0x73, 0x70, 0x65, 0x6e, 0x64, 0x5f, 0x61, 0x75, 0x74, 0x68, 0x73, 0x18, 0x02, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, - 0x72, 0x79, 0x70, 0x74, 0x6f, 0x2e, 0x64, 0x65, 0x63, 0x61, 0x66, 0x33, 0x37, 0x37, 0x5f, 0x72, - 0x64, 0x73, 0x61, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x70, 0x65, - 0x6e, 0x64, 0x41, 0x75, 0x74, 0x68, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x52, - 0x0a, 0x73, 0x70, 0x65, 0x6e, 0x64, 0x41, 0x75, 0x74, 0x68, 0x73, 0x12, 0x6c, 0x0a, 0x14, 0x64, - 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x76, 0x6f, 0x74, 0x65, 0x5f, 0x61, 0x75, - 0x74, 0x68, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x70, 0x65, 0x6e, 0x75, - 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x2e, 0x64, 0x65, 0x63, 0x61, - 0x66, 0x33, 0x37, 0x37, 0x5f, 0x72, 0x64, 0x73, 0x61, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, - 0x61, 0x31, 0x2e, 0x53, 0x70, 0x65, 0x6e, 0x64, 0x41, 0x75, 0x74, 0x68, 0x53, 0x69, 0x67, 0x6e, - 0x61, 0x74, 0x75, 0x72, 0x65, 0x52, 0x12, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, - 0x56, 0x6f, 0x74, 0x65, 0x41, 0x75, 0x74, 0x68, 0x73, 0x22, 0xbb, 0x01, 0x0a, 0x0b, 0x57, 0x69, - 0x74, 0x6e, 0x65, 0x73, 0x73, 0x44, 0x61, 0x74, 0x61, 0x12, 0x40, 0x0a, 0x06, 0x61, 0x6e, 0x63, - 0x68, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x70, 0x65, 0x6e, 0x75, - 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x2e, 0x74, 0x63, 0x74, 0x2e, - 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4d, 0x65, 0x72, 0x6b, 0x6c, 0x65, 0x52, - 0x6f, 0x6f, 0x74, 0x52, 0x06, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x12, 0x6a, 0x0a, 0x17, 0x73, - 0x74, 0x61, 0x74, 0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x5f, - 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x70, - 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x2e, 0x74, - 0x63, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x74, - 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, - 0x52, 0x15, 0x73, 0x74, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, - 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x73, 0x22, 0xf0, 0x02, 0x0a, 0x0f, 0x54, 0x72, 0x61, 0x6e, - 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6c, 0x61, 0x6e, 0x12, 0x48, 0x0a, 0x07, 0x61, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x70, - 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72, 0x61, - 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, - 0x31, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6c, 0x61, 0x6e, 0x52, 0x07, 0x61, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x65, 0x78, 0x70, 0x69, 0x72, 0x79, 0x5f, - 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x65, 0x78, - 0x70, 0x69, 0x72, 0x79, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 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, 0x3b, 0x0a, 0x03, 0x66, 0x65, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, - 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x66, 0x65, 0x65, - 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x46, 0x65, 0x65, 0x52, 0x03, 0x66, - 0x65, 0x65, 0x12, 0x4b, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x65, 0x5f, 0x70, 0x6c, 0x61, 0x6e, 0x73, - 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, - 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x43, 0x6c, 0x75, 0x65, - 0x50, 0x6c, 0x61, 0x6e, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x65, 0x50, 0x6c, 0x61, 0x6e, 0x73, 0x12, - 0x49, 0x0a, 0x09, 0x6d, 0x65, 0x6d, 0x6f, 0x5f, 0x70, 0x6c, 0x61, 0x6e, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, - 0x72, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, - 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4d, 0x65, 0x6d, 0x6f, 0x50, 0x6c, 0x61, 0x6e, - 0x52, 0x08, 0x6d, 0x65, 0x6d, 0x6f, 0x50, 0x6c, 0x61, 0x6e, 0x22, 0xd5, 0x10, 0x0a, 0x0a, 0x41, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6c, 0x61, 0x6e, 0x12, 0x51, 0x0a, 0x05, 0x73, 0x70, 0x65, - 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, - 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, - 0x6e, 0x74, 0x2e, 0x73, 0x68, 0x69, 0x65, 0x6c, 0x64, 0x65, 0x64, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, - 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x70, 0x65, 0x6e, 0x64, 0x50, - 0x6c, 0x61, 0x6e, 0x48, 0x00, 0x52, 0x05, 0x73, 0x70, 0x65, 0x6e, 0x64, 0x12, 0x54, 0x0a, 0x06, - 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x70, - 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, - 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x68, 0x69, 0x65, 0x6c, 0x64, 0x65, 0x64, 0x5f, - 0x70, 0x6f, 0x6f, 0x6c, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4f, 0x75, - 0x74, 0x70, 0x75, 0x74, 0x50, 0x6c, 0x61, 0x6e, 0x48, 0x00, 0x52, 0x06, 0x6f, 0x75, 0x74, 0x70, - 0x75, 0x74, 0x12, 0x44, 0x0a, 0x04, 0x73, 0x77, 0x61, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x2e, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, - 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x64, 0x65, 0x78, 0x2e, 0x76, - 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x77, 0x61, 0x70, 0x50, 0x6c, 0x61, 0x6e, - 0x48, 0x00, 0x52, 0x04, 0x73, 0x77, 0x61, 0x70, 0x12, 0x54, 0x0a, 0x0a, 0x73, 0x77, 0x61, 0x70, - 0x5f, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x70, - 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, - 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x64, 0x65, 0x78, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, - 0x68, 0x61, 0x31, 0x2e, 0x53, 0x77, 0x61, 0x70, 0x43, 0x6c, 0x61, 0x69, 0x6d, 0x50, 0x6c, 0x61, - 0x6e, 0x48, 0x00, 0x52, 0x09, 0x73, 0x77, 0x61, 0x70, 0x43, 0x6c, 0x61, 0x69, 0x6d, 0x12, 0x70, - 0x0a, 0x14, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x64, 0x65, 0x66, 0x69, - 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3b, 0x2e, 0x70, - 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, - 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x74, 0x61, 0x6b, 0x65, 0x2e, 0x76, 0x31, 0x61, - 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x44, - 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x13, 0x76, 0x61, 0x6c, - 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, - 0x12, 0x5a, 0x0a, 0x10, 0x69, 0x62, 0x63, 0x5f, 0x72, 0x65, 0x6c, 0x61, 0x79, 0x5f, 0x61, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x70, 0x65, 0x6e, + 0x72, 0x65, 0x2e, 0x74, 0x78, 0x68, 0x61, 0x73, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, + 0x61, 0x31, 0x2e, 0x45, 0x66, 0x66, 0x65, 0x63, 0x74, 0x48, 0x61, 0x73, 0x68, 0x52, 0x0a, 0x65, + 0x66, 0x66, 0x65, 0x63, 0x74, 0x48, 0x61, 0x73, 0x68, 0x12, 0x5b, 0x0a, 0x0b, 0x73, 0x70, 0x65, + 0x6e, 0x64, 0x5f, 0x61, 0x75, 0x74, 0x68, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3a, + 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x6f, + 0x2e, 0x64, 0x65, 0x63, 0x61, 0x66, 0x33, 0x37, 0x37, 0x5f, 0x72, 0x64, 0x73, 0x61, 0x2e, 0x76, + 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x70, 0x65, 0x6e, 0x64, 0x41, 0x75, 0x74, + 0x68, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x52, 0x0a, 0x73, 0x70, 0x65, 0x6e, + 0x64, 0x41, 0x75, 0x74, 0x68, 0x73, 0x12, 0x6c, 0x0a, 0x14, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, + 0x74, 0x6f, 0x72, 0x5f, 0x76, 0x6f, 0x74, 0x65, 0x5f, 0x61, 0x75, 0x74, 0x68, 0x73, 0x18, 0x03, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, + 0x63, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x2e, 0x64, 0x65, 0x63, 0x61, 0x66, 0x33, 0x37, 0x37, 0x5f, + 0x72, 0x64, 0x73, 0x61, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x70, + 0x65, 0x6e, 0x64, 0x41, 0x75, 0x74, 0x68, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, + 0x52, 0x12, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x56, 0x6f, 0x74, 0x65, 0x41, + 0x75, 0x74, 0x68, 0x73, 0x22, 0xbb, 0x01, 0x0a, 0x0b, 0x57, 0x69, 0x74, 0x6e, 0x65, 0x73, 0x73, + 0x44, 0x61, 0x74, 0x61, 0x12, 0x40, 0x0a, 0x06, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, + 0x63, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x2e, 0x74, 0x63, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, + 0x68, 0x61, 0x31, 0x2e, 0x4d, 0x65, 0x72, 0x6b, 0x6c, 0x65, 0x52, 0x6f, 0x6f, 0x74, 0x52, 0x06, + 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x12, 0x6a, 0x0a, 0x17, 0x73, 0x74, 0x61, 0x74, 0x65, 0x5f, + 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x70, 0x72, 0x6f, 0x6f, 0x66, + 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, + 0x72, 0x61, 0x2e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x2e, 0x74, 0x63, 0x74, 0x2e, 0x76, 0x31, + 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6d, 0x6d, + 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x15, 0x73, 0x74, 0x61, + 0x74, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x6f, + 0x66, 0x73, 0x22, 0xed, 0x02, 0x0a, 0x0f, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x50, 0x6c, 0x61, 0x6e, 0x12, 0x48, 0x0a, 0x07, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, + 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x41, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x50, 0x6c, 0x61, 0x6e, 0x52, 0x07, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x12, 0x70, 0x0a, 0x16, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, + 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x39, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, + 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x61, + 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x52, 0x15, 0x74, 0x72, 0x61, + 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, + 0x72, 0x73, 0x12, 0x5c, 0x0a, 0x0e, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, + 0x64, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x70, 0x65, 0x6e, + 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, + 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, + 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x50, 0x6c, 0x61, + 0x6e, 0x52, 0x0d, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, + 0x12, 0x40, 0x0a, 0x04, 0x6d, 0x65, 0x6d, 0x6f, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, + 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, + 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, + 0x68, 0x61, 0x31, 0x2e, 0x4d, 0x65, 0x6d, 0x6f, 0x50, 0x6c, 0x61, 0x6e, 0x52, 0x04, 0x6d, 0x65, + 0x6d, 0x6f, 0x22, 0x60, 0x0a, 0x11, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, + 0x61, 0x74, 0x61, 0x50, 0x6c, 0x61, 0x6e, 0x12, 0x4b, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x65, 0x5f, + 0x70, 0x6c, 0x61, 0x6e, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x70, 0x65, + 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, + 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, + 0x2e, 0x43, 0x6c, 0x75, 0x65, 0x50, 0x6c, 0x61, 0x6e, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x65, 0x50, + 0x6c, 0x61, 0x6e, 0x73, 0x22, 0xb2, 0x11, 0x0a, 0x0a, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, + 0x6c, 0x61, 0x6e, 0x12, 0x51, 0x0a, 0x05, 0x73, 0x70, 0x65, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, + 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x68, 0x69, + 0x65, 0x6c, 0x64, 0x65, 0x64, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, + 0x68, 0x61, 0x31, 0x2e, 0x53, 0x70, 0x65, 0x6e, 0x64, 0x50, 0x6c, 0x61, 0x6e, 0x48, 0x00, 0x52, + 0x05, 0x73, 0x70, 0x65, 0x6e, 0x64, 0x12, 0x54, 0x0a, 0x06, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, + 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, + 0x2e, 0x73, 0x68, 0x69, 0x65, 0x6c, 0x64, 0x65, 0x64, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x2e, 0x76, + 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x50, 0x6c, + 0x61, 0x6e, 0x48, 0x00, 0x52, 0x06, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x44, 0x0a, 0x04, + 0x73, 0x77, 0x61, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, - 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x69, 0x62, 0x63, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, - 0x31, 0x2e, 0x49, 0x62, 0x63, 0x52, 0x65, 0x6c, 0x61, 0x79, 0x48, 0x00, 0x52, 0x0e, 0x69, 0x62, - 0x63, 0x52, 0x65, 0x6c, 0x61, 0x79, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x66, 0x0a, 0x0f, - 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x5f, 0x73, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x18, - 0x12, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3b, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, - 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, - 0x67, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, - 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x53, 0x75, 0x62, 0x6d, - 0x69, 0x74, 0x48, 0x00, 0x52, 0x0e, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x53, 0x75, - 0x62, 0x6d, 0x69, 0x74, 0x12, 0x6c, 0x0a, 0x11, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, - 0x5f, 0x77, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x18, 0x13, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x3d, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, + 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x64, 0x65, 0x78, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, + 0x31, 0x2e, 0x53, 0x77, 0x61, 0x70, 0x50, 0x6c, 0x61, 0x6e, 0x48, 0x00, 0x52, 0x04, 0x73, 0x77, + 0x61, 0x70, 0x12, 0x54, 0x0a, 0x0a, 0x73, 0x77, 0x61, 0x70, 0x5f, 0x63, 0x6c, 0x61, 0x69, 0x6d, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, + 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, + 0x2e, 0x64, 0x65, 0x78, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x77, + 0x61, 0x70, 0x43, 0x6c, 0x61, 0x69, 0x6d, 0x50, 0x6c, 0x61, 0x6e, 0x48, 0x00, 0x52, 0x09, 0x73, + 0x77, 0x61, 0x70, 0x43, 0x6c, 0x61, 0x69, 0x6d, 0x12, 0x70, 0x0a, 0x14, 0x76, 0x61, 0x6c, 0x69, + 0x64, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3b, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, + 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, + 0x2e, 0x73, 0x74, 0x61, 0x6b, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, + 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x13, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, + 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x5a, 0x0a, 0x10, 0x69, 0x62, + 0x63, 0x5f, 0x72, 0x65, 0x6c, 0x61, 0x79, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x11, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, + 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x69, + 0x62, 0x63, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x49, 0x62, 0x63, 0x52, + 0x65, 0x6c, 0x61, 0x79, 0x48, 0x00, 0x52, 0x0e, 0x69, 0x62, 0x63, 0x52, 0x65, 0x6c, 0x61, 0x79, + 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x66, 0x0a, 0x0f, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, + 0x61, 0x6c, 0x5f, 0x73, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x18, 0x12, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x3b, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, - 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x48, 0x00, - 0x52, 0x10, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, - 0x61, 0x77, 0x12, 0x63, 0x0a, 0x0e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x5f, - 0x76, 0x6f, 0x74, 0x65, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x70, 0x65, 0x6e, + 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x48, 0x00, 0x52, 0x0e, + 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x12, 0x6c, + 0x0a, 0x11, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x64, + 0x72, 0x61, 0x77, 0x18, 0x13, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3d, 0x2e, 0x70, 0x65, 0x6e, 0x75, + 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, + 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x76, + 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, + 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x48, 0x00, 0x52, 0x10, 0x70, 0x72, 0x6f, 0x70, + 0x6f, 0x73, 0x61, 0x6c, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x12, 0x63, 0x0a, 0x0e, + 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x76, 0x6f, 0x74, 0x65, 0x18, 0x14, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, + 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x67, + 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, + 0x61, 0x31, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x56, 0x6f, 0x74, 0x65, + 0x48, 0x00, 0x52, 0x0d, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x56, 0x6f, 0x74, + 0x65, 0x12, 0x67, 0x0a, 0x0e, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x76, + 0x6f, 0x74, 0x65, 0x18, 0x15, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3e, 0x2e, 0x70, 0x65, 0x6e, 0x75, + 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, + 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x76, + 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x6f, + 0x72, 0x56, 0x6f, 0x74, 0x65, 0x50, 0x6c, 0x61, 0x6e, 0x48, 0x00, 0x52, 0x0d, 0x64, 0x65, 0x6c, + 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x56, 0x6f, 0x74, 0x65, 0x12, 0x79, 0x0a, 0x16, 0x70, 0x72, + 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x5f, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x5f, 0x63, + 0x6c, 0x61, 0x69, 0x6d, 0x18, 0x16, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x41, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x2e, - 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, - 0x6f, 0x72, 0x56, 0x6f, 0x74, 0x65, 0x48, 0x00, 0x52, 0x0d, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, - 0x74, 0x6f, 0x72, 0x56, 0x6f, 0x74, 0x65, 0x12, 0x67, 0x0a, 0x0e, 0x64, 0x65, 0x6c, 0x65, 0x67, - 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x76, 0x6f, 0x74, 0x65, 0x18, 0x15, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x3e, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, - 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x6f, 0x76, 0x65, 0x72, 0x6e, - 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, 0x65, - 0x6c, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x56, 0x6f, 0x74, 0x65, 0x50, 0x6c, 0x61, 0x6e, 0x48, - 0x00, 0x52, 0x0d, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x56, 0x6f, 0x74, 0x65, - 0x12, 0x79, 0x0a, 0x16, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x5f, 0x64, 0x65, 0x70, - 0x6f, 0x73, 0x69, 0x74, 0x5f, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x18, 0x16, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x41, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, - 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x6f, 0x76, 0x65, 0x72, - 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, - 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x43, 0x6c, - 0x61, 0x69, 0x6d, 0x48, 0x00, 0x52, 0x14, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x44, - 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x43, 0x6c, 0x61, 0x69, 0x6d, 0x12, 0x57, 0x0a, 0x0a, 0x77, - 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x18, 0x17, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x35, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, - 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x69, 0x62, 0x63, 0x2e, 0x76, 0x31, - 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x49, 0x63, 0x73, 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, 0x59, 0x0a, 0x0d, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, - 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x18, 0x1e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x70, 0x65, + 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, + 0x6c, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x43, 0x6c, 0x61, 0x69, 0x6d, 0x48, 0x00, 0x52, + 0x14, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, + 0x43, 0x6c, 0x61, 0x69, 0x6d, 0x12, 0x57, 0x0a, 0x0a, 0x77, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, + 0x77, 0x61, 0x6c, 0x18, 0x17, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x70, 0x65, 0x6e, 0x75, + 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, + 0x65, 0x6e, 0x74, 0x2e, 0x69, 0x62, 0x63, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, + 0x2e, 0x49, 0x63, 0x73, 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, 0x59, + 0x0a, 0x0d, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x18, + 0x1e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, + 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, + 0x64, 0x65, 0x78, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x6f, 0x73, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x4f, 0x70, 0x65, 0x6e, 0x48, 0x00, 0x52, 0x0c, 0x70, 0x6f, 0x73, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x4f, 0x70, 0x65, 0x6e, 0x12, 0x5c, 0x0a, 0x0e, 0x70, 0x6f, 0x73, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x18, 0x1f, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x33, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, + 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x64, 0x65, 0x78, 0x2e, + 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, + 0x6e, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x48, 0x00, 0x52, 0x0d, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x12, 0x69, 0x0a, 0x11, 0x70, 0x6f, 0x73, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x18, 0x20, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, + 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x64, 0x65, 0x78, + 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x50, 0x6c, 0x61, 0x6e, 0x48, 0x00, + 0x52, 0x10, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, + 0x61, 0x77, 0x12, 0x73, 0x0a, 0x15, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72, + 0x65, 0x77, 0x61, 0x72, 0x64, 0x5f, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x18, 0x22, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x3d, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, + 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x64, 0x65, 0x78, 0x2e, + 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x43, 0x6c, 0x61, 0x69, 0x6d, 0x50, 0x6c, 0x61, 0x6e, + 0x48, 0x00, 0x52, 0x13, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x77, 0x61, + 0x72, 0x64, 0x43, 0x6c, 0x61, 0x69, 0x6d, 0x12, 0x4e, 0x0a, 0x08, 0x64, 0x65, 0x6c, 0x65, 0x67, + 0x61, 0x74, 0x65, 0x18, 0x28, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x70, 0x65, 0x6e, 0x75, + 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, + 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x74, 0x61, 0x6b, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, + 0x61, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x65, 0x48, 0x00, 0x52, 0x08, 0x64, + 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x65, 0x12, 0x54, 0x0a, 0x0a, 0x75, 0x6e, 0x64, 0x65, 0x6c, + 0x65, 0x67, 0x61, 0x74, 0x65, 0x18, 0x29, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, - 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x64, 0x65, 0x78, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, - 0x61, 0x31, 0x2e, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x4f, 0x70, 0x65, 0x6e, 0x48, - 0x00, 0x52, 0x0c, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x4f, 0x70, 0x65, 0x6e, 0x12, - 0x5c, 0x0a, 0x0e, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x6c, 0x6f, 0x73, - 0x65, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, - 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, - 0x74, 0x2e, 0x64, 0x65, 0x78, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, - 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x48, 0x00, 0x52, 0x0d, - 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x12, 0x69, 0x0a, - 0x11, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x64, 0x72, - 0x61, 0x77, 0x18, 0x20, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, - 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, - 0x6e, 0x74, 0x2e, 0x64, 0x65, 0x78, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, - 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, - 0x50, 0x6c, 0x61, 0x6e, 0x48, 0x00, 0x52, 0x10, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, - 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x12, 0x73, 0x0a, 0x15, 0x70, 0x6f, 0x73, 0x69, - 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x5f, 0x63, 0x6c, 0x61, 0x69, - 0x6d, 0x18, 0x22, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3d, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, + 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x74, 0x61, 0x6b, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, + 0x70, 0x68, 0x61, 0x31, 0x2e, 0x55, 0x6e, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x65, 0x48, + 0x00, 0x52, 0x0a, 0x75, 0x6e, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x65, 0x12, 0x68, 0x0a, + 0x10, 0x75, 0x6e, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x65, 0x5f, 0x63, 0x6c, 0x61, 0x69, + 0x6d, 0x18, 0x2a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3b, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, - 0x74, 0x2e, 0x64, 0x65, 0x78, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, - 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x43, 0x6c, 0x61, - 0x69, 0x6d, 0x50, 0x6c, 0x61, 0x6e, 0x48, 0x00, 0x52, 0x13, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, - 0x6f, 0x6e, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x43, 0x6c, 0x61, 0x69, 0x6d, 0x12, 0x4e, 0x0a, - 0x08, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x65, 0x18, 0x28, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x30, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, - 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x74, 0x61, 0x6b, 0x65, 0x2e, - 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, - 0x65, 0x48, 0x00, 0x52, 0x08, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x65, 0x12, 0x54, 0x0a, - 0x0a, 0x75, 0x6e, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x65, 0x18, 0x29, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x32, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, - 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x74, 0x61, 0x6b, - 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x55, 0x6e, 0x64, 0x65, 0x6c, - 0x65, 0x67, 0x61, 0x74, 0x65, 0x48, 0x00, 0x52, 0x0a, 0x75, 0x6e, 0x64, 0x65, 0x6c, 0x65, 0x67, - 0x61, 0x74, 0x65, 0x12, 0x68, 0x0a, 0x10, 0x75, 0x6e, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, - 0x65, 0x5f, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x18, 0x2a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3b, 0x2e, - 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, - 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x74, 0x61, 0x6b, 0x65, 0x2e, 0x76, 0x31, - 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x55, 0x6e, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, - 0x65, 0x43, 0x6c, 0x61, 0x69, 0x6d, 0x50, 0x6c, 0x61, 0x6e, 0x48, 0x00, 0x52, 0x0f, 0x75, 0x6e, - 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x65, 0x43, 0x6c, 0x61, 0x69, 0x6d, 0x12, 0x54, 0x0a, - 0x09, 0x64, 0x61, 0x6f, 0x5f, 0x73, 0x70, 0x65, 0x6e, 0x64, 0x18, 0x32, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x35, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, - 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x6f, 0x76, 0x65, 0x72, - 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, - 0x61, 0x6f, 0x53, 0x70, 0x65, 0x6e, 0x64, 0x48, 0x00, 0x52, 0x08, 0x64, 0x61, 0x6f, 0x53, 0x70, - 0x65, 0x6e, 0x64, 0x12, 0x57, 0x0a, 0x0a, 0x64, 0x61, 0x6f, 0x5f, 0x6f, 0x75, 0x74, 0x70, 0x75, - 0x74, 0x18, 0x33, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, - 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, - 0x74, 0x2e, 0x67, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, - 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, 0x61, 0x6f, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x48, - 0x00, 0x52, 0x09, 0x64, 0x61, 0x6f, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x5a, 0x0a, 0x0b, - 0x64, 0x61, 0x6f, 0x5f, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x18, 0x34, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x37, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, - 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x6f, 0x76, 0x65, - 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, - 0x44, 0x61, 0x6f, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x48, 0x00, 0x52, 0x0a, 0x64, 0x61, - 0x6f, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x42, 0x08, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x22, 0x87, 0x01, 0x0a, 0x08, 0x43, 0x6c, 0x75, 0x65, 0x50, 0x6c, 0x61, 0x6e, 0x12, - 0x3e, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x24, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, - 0x2e, 0x6b, 0x65, 0x79, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x41, - 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, - 0x14, 0x0a, 0x05, 0x72, 0x73, 0x65, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, - 0x72, 0x73, 0x65, 0x65, 0x64, 0x12, 0x25, 0x0a, 0x0e, 0x70, 0x72, 0x65, 0x63, 0x69, 0x73, 0x69, - 0x6f, 0x6e, 0x5f, 0x62, 0x69, 0x74, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x70, - 0x72, 0x65, 0x63, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x42, 0x69, 0x74, 0x73, 0x22, 0x6d, 0x0a, 0x08, - 0x4d, 0x65, 0x6d, 0x6f, 0x50, 0x6c, 0x61, 0x6e, 0x12, 0x4f, 0x0a, 0x09, 0x70, 0x6c, 0x61, 0x69, - 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x70, 0x65, - 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, - 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, - 0x2e, 0x4d, 0x65, 0x6d, 0x6f, 0x50, 0x6c, 0x61, 0x69, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x52, 0x09, - 0x70, 0x6c, 0x61, 0x69, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x22, 0x26, 0x0a, 0x0e, 0x4d, - 0x65, 0x6d, 0x6f, 0x43, 0x69, 0x70, 0x68, 0x65, 0x72, 0x74, 0x65, 0x78, 0x74, 0x12, 0x14, 0x0a, - 0x05, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x69, 0x6e, - 0x6e, 0x65, 0x72, 0x22, 0x70, 0x0a, 0x0d, 0x4d, 0x65, 0x6d, 0x6f, 0x50, 0x6c, 0x61, 0x69, 0x6e, - 0x74, 0x65, 0x78, 0x74, 0x12, 0x4b, 0x0a, 0x0e, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x5f, 0x61, - 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x70, - 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6b, 0x65, 0x79, - 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, - 0x73, 0x73, 0x52, 0x0d, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, - 0x73, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x65, 0x78, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x74, 0x65, 0x78, 0x74, 0x22, 0x78, 0x0a, 0x11, 0x4d, 0x65, 0x6d, 0x6f, 0x50, 0x6c, 0x61, - 0x69, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x56, 0x69, 0x65, 0x77, 0x12, 0x4f, 0x0a, 0x0e, 0x72, 0x65, - 0x74, 0x75, 0x72, 0x6e, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, - 0x72, 0x65, 0x2e, 0x6b, 0x65, 0x79, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, - 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x56, 0x69, 0x65, 0x77, 0x52, 0x0d, 0x72, 0x65, - 0x74, 0x75, 0x72, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x74, - 0x65, 0x78, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x65, 0x78, 0x74, 0x22, - 0xcb, 0x03, 0x0a, 0x08, 0x4d, 0x65, 0x6d, 0x6f, 0x56, 0x69, 0x65, 0x77, 0x12, 0x50, 0x0a, 0x07, - 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x34, 0x2e, - 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72, - 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, - 0x61, 0x31, 0x2e, 0x4d, 0x65, 0x6d, 0x6f, 0x56, 0x69, 0x65, 0x77, 0x2e, 0x56, 0x69, 0x73, 0x69, - 0x62, 0x6c, 0x65, 0x48, 0x00, 0x52, 0x07, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x12, 0x4d, - 0x0a, 0x06, 0x6f, 0x70, 0x61, 0x71, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x33, - 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, - 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, - 0x68, 0x61, 0x31, 0x2e, 0x4d, 0x65, 0x6d, 0x6f, 0x56, 0x69, 0x65, 0x77, 0x2e, 0x4f, 0x70, 0x61, - 0x71, 0x75, 0x65, 0x48, 0x00, 0x52, 0x06, 0x6f, 0x70, 0x61, 0x71, 0x75, 0x65, 0x1a, 0xb2, 0x01, - 0x0a, 0x07, 0x56, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x12, 0x52, 0x0a, 0x0a, 0x63, 0x69, 0x70, - 0x68, 0x65, 0x72, 0x74, 0x65, 0x78, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x32, 0x2e, - 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72, - 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, - 0x61, 0x31, 0x2e, 0x4d, 0x65, 0x6d, 0x6f, 0x43, 0x69, 0x70, 0x68, 0x65, 0x72, 0x74, 0x65, 0x78, - 0x74, 0x52, 0x0a, 0x63, 0x69, 0x70, 0x68, 0x65, 0x72, 0x74, 0x65, 0x78, 0x74, 0x12, 0x53, 0x0a, - 0x09, 0x70, 0x6c, 0x61, 0x69, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x35, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, - 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x61, - 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4d, 0x65, 0x6d, 0x6f, 0x50, 0x6c, 0x61, 0x69, 0x6e, 0x74, - 0x65, 0x78, 0x74, 0x56, 0x69, 0x65, 0x77, 0x52, 0x09, 0x70, 0x6c, 0x61, 0x69, 0x6e, 0x74, 0x65, - 0x78, 0x74, 0x1a, 0x5c, 0x0a, 0x06, 0x4f, 0x70, 0x61, 0x71, 0x75, 0x65, 0x12, 0x52, 0x0a, 0x0a, - 0x63, 0x69, 0x70, 0x68, 0x65, 0x72, 0x74, 0x65, 0x78, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x32, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, - 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x61, - 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4d, 0x65, 0x6d, 0x6f, 0x43, 0x69, 0x70, 0x68, 0x65, 0x72, - 0x74, 0x65, 0x78, 0x74, 0x52, 0x0a, 0x63, 0x69, 0x70, 0x68, 0x65, 0x72, 0x74, 0x65, 0x78, 0x74, - 0x42, 0x0b, 0x0a, 0x09, 0x6d, 0x65, 0x6d, 0x6f, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x42, 0xcc, 0x02, - 0x0a, 0x26, 0x63, 0x6f, 0x6d, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, - 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, - 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x42, 0x10, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x65, 0x67, 0x69, - 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, - 0x61, 0x2d, 0x7a, 0x6f, 0x6e, 0x65, 0x2f, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2f, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x6f, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x70, 0x65, 0x6e, - 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x74, 0x72, 0x61, 0x6e, 0x73, - 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x3b, - 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x76, 0x31, 0x61, 0x6c, 0x70, - 0x68, 0x61, 0x31, 0xa2, 0x02, 0x03, 0x50, 0x43, 0x54, 0xaa, 0x02, 0x22, 0x50, 0x65, 0x6e, 0x75, - 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x43, 0x6f, 0x72, 0x65, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x56, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0xca, 0x02, - 0x22, 0x50, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x5c, 0x43, 0x6f, 0x72, 0x65, 0x5c, 0x54, - 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5c, 0x56, 0x31, 0x61, 0x6c, 0x70, - 0x68, 0x61, 0x31, 0xe2, 0x02, 0x2e, 0x50, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x5c, 0x43, - 0x6f, 0x72, 0x65, 0x5c, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5c, - 0x56, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, - 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x25, 0x50, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x3a, - 0x3a, 0x43, 0x6f, 0x72, 0x65, 0x3a, 0x3a, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x3a, 0x3a, 0x56, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x62, 0x06, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x33, + 0x74, 0x2e, 0x73, 0x74, 0x61, 0x6b, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, + 0x2e, 0x55, 0x6e, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x65, 0x43, 0x6c, 0x61, 0x69, 0x6d, + 0x50, 0x6c, 0x61, 0x6e, 0x48, 0x00, 0x52, 0x0f, 0x75, 0x6e, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, + 0x74, 0x65, 0x43, 0x6c, 0x61, 0x69, 0x6d, 0x12, 0x73, 0x0a, 0x14, 0x63, 0x6f, 0x6d, 0x6d, 0x75, + 0x6e, 0x69, 0x74, 0x79, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x73, 0x70, 0x65, 0x6e, 0x64, 0x18, + 0x32, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3f, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, + 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, + 0x67, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, + 0x68, 0x61, 0x31, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x74, 0x79, 0x50, 0x6f, 0x6f, + 0x6c, 0x53, 0x70, 0x65, 0x6e, 0x64, 0x48, 0x00, 0x52, 0x12, 0x63, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, + 0x69, 0x74, 0x79, 0x50, 0x6f, 0x6f, 0x6c, 0x53, 0x70, 0x65, 0x6e, 0x64, 0x12, 0x76, 0x0a, 0x15, + 0x63, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x74, 0x79, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x6f, + 0x75, 0x74, 0x70, 0x75, 0x74, 0x18, 0x33, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x40, 0x2e, 0x70, 0x65, + 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, + 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, + 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, + 0x69, 0x74, 0x79, 0x50, 0x6f, 0x6f, 0x6c, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x48, 0x00, 0x52, + 0x13, 0x63, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x74, 0x79, 0x50, 0x6f, 0x6f, 0x6c, 0x4f, 0x75, + 0x74, 0x70, 0x75, 0x74, 0x12, 0x79, 0x0a, 0x16, 0x63, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x74, + 0x79, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x18, 0x34, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x41, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, + 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x67, + 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, + 0x61, 0x31, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x74, 0x79, 0x50, 0x6f, 0x6f, 0x6c, + 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x48, 0x00, 0x52, 0x14, 0x63, 0x6f, 0x6d, 0x6d, 0x75, + 0x6e, 0x69, 0x74, 0x79, 0x50, 0x6f, 0x6f, 0x6c, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x42, + 0x08, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x87, 0x01, 0x0a, 0x08, 0x43, 0x6c, + 0x75, 0x65, 0x50, 0x6c, 0x61, 0x6e, 0x12, 0x3e, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, + 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, + 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6b, 0x65, 0x79, 0x73, 0x2e, 0x76, 0x31, 0x61, + 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x07, 0x61, + 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x73, 0x65, 0x65, 0x64, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x72, 0x73, 0x65, 0x65, 0x64, 0x12, 0x25, 0x0a, 0x0e, + 0x70, 0x72, 0x65, 0x63, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x62, 0x69, 0x74, 0x73, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x70, 0x72, 0x65, 0x63, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x42, + 0x69, 0x74, 0x73, 0x22, 0x6d, 0x0a, 0x08, 0x4d, 0x65, 0x6d, 0x6f, 0x50, 0x6c, 0x61, 0x6e, 0x12, + 0x4f, 0x0a, 0x09, 0x70, 0x6c, 0x61, 0x69, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, + 0x72, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, + 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4d, 0x65, 0x6d, 0x6f, 0x50, 0x6c, 0x61, 0x69, + 0x6e, 0x74, 0x65, 0x78, 0x74, 0x52, 0x09, 0x70, 0x6c, 0x61, 0x69, 0x6e, 0x74, 0x65, 0x78, 0x74, + 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x6b, + 0x65, 0x79, 0x22, 0x26, 0x0a, 0x0e, 0x4d, 0x65, 0x6d, 0x6f, 0x43, 0x69, 0x70, 0x68, 0x65, 0x72, + 0x74, 0x65, 0x78, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0c, 0x52, 0x05, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x22, 0x70, 0x0a, 0x0d, 0x4d, 0x65, + 0x6d, 0x6f, 0x50, 0x6c, 0x61, 0x69, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x12, 0x4b, 0x0a, 0x0e, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, + 0x6f, 0x72, 0x65, 0x2e, 0x6b, 0x65, 0x79, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, + 0x31, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x0d, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x65, 0x78, 0x74, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x65, 0x78, 0x74, 0x22, 0x78, 0x0a, 0x11, + 0x4d, 0x65, 0x6d, 0x6f, 0x50, 0x6c, 0x61, 0x69, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x56, 0x69, 0x65, + 0x77, 0x12, 0x4f, 0x0a, 0x0e, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x5f, 0x61, 0x64, 0x64, 0x72, + 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x70, 0x65, 0x6e, 0x75, + 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6b, 0x65, 0x79, 0x73, 0x2e, 0x76, + 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x56, + 0x69, 0x65, 0x77, 0x52, 0x0d, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, + 0x73, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x65, 0x78, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x74, 0x65, 0x78, 0x74, 0x22, 0xcb, 0x03, 0x0a, 0x08, 0x4d, 0x65, 0x6d, 0x6f, 0x56, + 0x69, 0x65, 0x77, 0x12, 0x50, 0x0a, 0x07, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, + 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4d, 0x65, 0x6d, 0x6f, 0x56, 0x69, + 0x65, 0x77, 0x2e, 0x56, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x48, 0x00, 0x52, 0x07, 0x76, 0x69, + 0x73, 0x69, 0x62, 0x6c, 0x65, 0x12, 0x4d, 0x0a, 0x06, 0x6f, 0x70, 0x61, 0x71, 0x75, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, + 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4d, 0x65, 0x6d, 0x6f, 0x56, + 0x69, 0x65, 0x77, 0x2e, 0x4f, 0x70, 0x61, 0x71, 0x75, 0x65, 0x48, 0x00, 0x52, 0x06, 0x6f, 0x70, + 0x61, 0x71, 0x75, 0x65, 0x1a, 0xb2, 0x01, 0x0a, 0x07, 0x56, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, + 0x12, 0x52, 0x0a, 0x0a, 0x63, 0x69, 0x70, 0x68, 0x65, 0x72, 0x74, 0x65, 0x78, 0x74, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, + 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4d, 0x65, 0x6d, 0x6f, 0x43, 0x69, + 0x70, 0x68, 0x65, 0x72, 0x74, 0x65, 0x78, 0x74, 0x52, 0x0a, 0x63, 0x69, 0x70, 0x68, 0x65, 0x72, + 0x74, 0x65, 0x78, 0x74, 0x12, 0x53, 0x0a, 0x09, 0x70, 0x6c, 0x61, 0x69, 0x6e, 0x74, 0x65, 0x78, + 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, + 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4d, 0x65, 0x6d, + 0x6f, 0x50, 0x6c, 0x61, 0x69, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x56, 0x69, 0x65, 0x77, 0x52, 0x09, + 0x70, 0x6c, 0x61, 0x69, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x1a, 0x5c, 0x0a, 0x06, 0x4f, 0x70, 0x61, + 0x71, 0x75, 0x65, 0x12, 0x52, 0x0a, 0x0a, 0x63, 0x69, 0x70, 0x68, 0x65, 0x72, 0x74, 0x65, 0x78, + 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, + 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4d, 0x65, 0x6d, + 0x6f, 0x43, 0x69, 0x70, 0x68, 0x65, 0x72, 0x74, 0x65, 0x78, 0x74, 0x52, 0x0a, 0x63, 0x69, 0x70, + 0x68, 0x65, 0x72, 0x74, 0x65, 0x78, 0x74, 0x42, 0x0b, 0x0a, 0x09, 0x6d, 0x65, 0x6d, 0x6f, 0x5f, + 0x76, 0x69, 0x65, 0x77, 0x42, 0xcc, 0x02, 0x0a, 0x26, 0x63, 0x6f, 0x6d, 0x2e, 0x70, 0x65, 0x6e, + 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, + 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x42, + 0x10, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x74, + 0x6f, 0x50, 0x01, 0x5a, 0x65, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, + 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2d, 0x7a, 0x6f, 0x6e, 0x65, 0x2f, 0x70, 0x65, + 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x6f, 0x2f, + 0x67, 0x65, 0x6e, 0x2f, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2f, 0x63, 0x6f, 0x72, + 0x65, 0x2f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x76, 0x31, + 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x3b, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0xa2, 0x02, 0x03, 0x50, 0x43, 0x54, + 0xaa, 0x02, 0x22, 0x50, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x43, 0x6f, 0x72, 0x65, + 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x56, 0x31, 0x61, + 0x6c, 0x70, 0x68, 0x61, 0x31, 0xca, 0x02, 0x22, 0x50, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, + 0x5c, 0x43, 0x6f, 0x72, 0x65, 0x5c, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x5c, 0x56, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0xe2, 0x02, 0x2e, 0x50, 0x65, 0x6e, + 0x75, 0x6d, 0x62, 0x72, 0x61, 0x5c, 0x43, 0x6f, 0x72, 0x65, 0x5c, 0x54, 0x72, 0x61, 0x6e, 0x73, + 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5c, 0x56, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x5c, + 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x25, 0x50, 0x65, + 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x3a, 0x3a, 0x43, 0x6f, 0x72, 0x65, 0x3a, 0x3a, 0x54, 0x72, + 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x3a, 0x56, 0x31, 0x61, 0x6c, 0x70, + 0x68, 0x61, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -3347,197 +3258,200 @@ func file_penumbra_core_transaction_v1alpha1_transaction_proto_rawDescGZIP() []b return file_penumbra_core_transaction_v1alpha1_transaction_proto_rawDescData } -var file_penumbra_core_transaction_v1alpha1_transaction_proto_msgTypes = make([]protoimpl.MessageInfo, 26) +var file_penumbra_core_transaction_v1alpha1_transaction_proto_msgTypes = make([]protoimpl.MessageInfo, 24) var file_penumbra_core_transaction_v1alpha1_transaction_proto_goTypes = []interface{}{ (*Transaction)(nil), // 0: penumbra.core.transaction.v1alpha1.Transaction - (*Id)(nil), // 1: penumbra.core.transaction.v1alpha1.Id - (*TransactionBody)(nil), // 2: penumbra.core.transaction.v1alpha1.TransactionBody - (*MemoData)(nil), // 3: penumbra.core.transaction.v1alpha1.MemoData - (*TransactionParameters)(nil), // 4: penumbra.core.transaction.v1alpha1.TransactionParameters - (*DetectionData)(nil), // 5: penumbra.core.transaction.v1alpha1.DetectionData - (*Action)(nil), // 6: penumbra.core.transaction.v1alpha1.Action - (*TransactionPerspective)(nil), // 7: penumbra.core.transaction.v1alpha1.TransactionPerspective - (*PayloadKeyWithCommitment)(nil), // 8: penumbra.core.transaction.v1alpha1.PayloadKeyWithCommitment - (*NullifierWithNote)(nil), // 9: penumbra.core.transaction.v1alpha1.NullifierWithNote - (*TransactionView)(nil), // 10: penumbra.core.transaction.v1alpha1.TransactionView - (*TransactionBodyView)(nil), // 11: penumbra.core.transaction.v1alpha1.TransactionBodyView - (*ActionView)(nil), // 12: penumbra.core.transaction.v1alpha1.ActionView - (*EffectHash)(nil), // 13: penumbra.core.transaction.v1alpha1.EffectHash - (*AuthorizationData)(nil), // 14: penumbra.core.transaction.v1alpha1.AuthorizationData - (*WitnessData)(nil), // 15: penumbra.core.transaction.v1alpha1.WitnessData - (*TransactionPlan)(nil), // 16: penumbra.core.transaction.v1alpha1.TransactionPlan - (*ActionPlan)(nil), // 17: penumbra.core.transaction.v1alpha1.ActionPlan - (*CluePlan)(nil), // 18: penumbra.core.transaction.v1alpha1.CluePlan - (*MemoPlan)(nil), // 19: penumbra.core.transaction.v1alpha1.MemoPlan - (*MemoCiphertext)(nil), // 20: penumbra.core.transaction.v1alpha1.MemoCiphertext - (*MemoPlaintext)(nil), // 21: penumbra.core.transaction.v1alpha1.MemoPlaintext - (*MemoPlaintextView)(nil), // 22: penumbra.core.transaction.v1alpha1.MemoPlaintextView - (*MemoView)(nil), // 23: penumbra.core.transaction.v1alpha1.MemoView - (*MemoView_Visible)(nil), // 24: penumbra.core.transaction.v1alpha1.MemoView.Visible - (*MemoView_Opaque)(nil), // 25: penumbra.core.transaction.v1alpha1.MemoView.Opaque - (*v1alpha1.MerkleRoot)(nil), // 26: penumbra.crypto.tct.v1alpha1.MerkleRoot - (*v1alpha11.Fee)(nil), // 27: penumbra.core.component.fee.v1alpha1.Fee - (*v1alpha12.Clue)(nil), // 28: penumbra.crypto.decaf377_fmd.v1alpha1.Clue - (*v1alpha13.Spend)(nil), // 29: penumbra.core.component.shielded_pool.v1alpha1.Spend - (*v1alpha13.Output)(nil), // 30: penumbra.core.component.shielded_pool.v1alpha1.Output - (*v1alpha14.Swap)(nil), // 31: penumbra.core.component.dex.v1alpha1.Swap - (*v1alpha14.SwapClaim)(nil), // 32: penumbra.core.component.dex.v1alpha1.SwapClaim - (*v1alpha15.ValidatorDefinition)(nil), // 33: penumbra.core.component.stake.v1alpha1.ValidatorDefinition - (*v1alpha16.IbcRelay)(nil), // 34: penumbra.core.component.ibc.v1alpha1.IbcRelay - (*v1alpha17.ProposalSubmit)(nil), // 35: penumbra.core.component.governance.v1alpha1.ProposalSubmit - (*v1alpha17.ProposalWithdraw)(nil), // 36: penumbra.core.component.governance.v1alpha1.ProposalWithdraw - (*v1alpha17.ValidatorVote)(nil), // 37: penumbra.core.component.governance.v1alpha1.ValidatorVote - (*v1alpha17.DelegatorVote)(nil), // 38: penumbra.core.component.governance.v1alpha1.DelegatorVote - (*v1alpha17.ProposalDepositClaim)(nil), // 39: penumbra.core.component.governance.v1alpha1.ProposalDepositClaim - (*v1alpha14.PositionOpen)(nil), // 40: penumbra.core.component.dex.v1alpha1.PositionOpen - (*v1alpha14.PositionClose)(nil), // 41: penumbra.core.component.dex.v1alpha1.PositionClose - (*v1alpha14.PositionWithdraw)(nil), // 42: penumbra.core.component.dex.v1alpha1.PositionWithdraw - (*v1alpha14.PositionRewardClaim)(nil), // 43: penumbra.core.component.dex.v1alpha1.PositionRewardClaim - (*v1alpha15.Delegate)(nil), // 44: penumbra.core.component.stake.v1alpha1.Delegate - (*v1alpha15.Undelegate)(nil), // 45: penumbra.core.component.stake.v1alpha1.Undelegate - (*v1alpha15.UndelegateClaim)(nil), // 46: penumbra.core.component.stake.v1alpha1.UndelegateClaim - (*v1alpha17.DaoSpend)(nil), // 47: penumbra.core.component.governance.v1alpha1.DaoSpend - (*v1alpha17.DaoOutput)(nil), // 48: penumbra.core.component.governance.v1alpha1.DaoOutput - (*v1alpha17.DaoDeposit)(nil), // 49: penumbra.core.component.governance.v1alpha1.DaoDeposit - (*v1alpha16.Ics20Withdrawal)(nil), // 50: penumbra.core.component.ibc.v1alpha1.Ics20Withdrawal - (*v1alpha13.Note)(nil), // 51: penumbra.core.component.shielded_pool.v1alpha1.Note - (*v1alpha18.AddressView)(nil), // 52: penumbra.core.keys.v1alpha1.AddressView - (*v1alpha19.DenomMetadata)(nil), // 53: penumbra.core.asset.v1alpha1.DenomMetadata - (*v1alpha18.PayloadKey)(nil), // 54: penumbra.core.keys.v1alpha1.PayloadKey - (*v1alpha1.StateCommitment)(nil), // 55: penumbra.crypto.tct.v1alpha1.StateCommitment - (*v1alpha110.Nullifier)(nil), // 56: penumbra.core.component.sct.v1alpha1.Nullifier - (*v1alpha13.SpendView)(nil), // 57: penumbra.core.component.shielded_pool.v1alpha1.SpendView - (*v1alpha13.OutputView)(nil), // 58: penumbra.core.component.shielded_pool.v1alpha1.OutputView - (*v1alpha14.SwapView)(nil), // 59: penumbra.core.component.dex.v1alpha1.SwapView - (*v1alpha14.SwapClaimView)(nil), // 60: penumbra.core.component.dex.v1alpha1.SwapClaimView - (*v1alpha17.DelegatorVoteView)(nil), // 61: penumbra.core.component.governance.v1alpha1.DelegatorVoteView - (*v1alpha111.SpendAuthSignature)(nil), // 62: penumbra.crypto.decaf377_rdsa.v1alpha1.SpendAuthSignature - (*v1alpha1.StateCommitmentProof)(nil), // 63: penumbra.crypto.tct.v1alpha1.StateCommitmentProof - (*v1alpha13.SpendPlan)(nil), // 64: penumbra.core.component.shielded_pool.v1alpha1.SpendPlan - (*v1alpha13.OutputPlan)(nil), // 65: penumbra.core.component.shielded_pool.v1alpha1.OutputPlan - (*v1alpha14.SwapPlan)(nil), // 66: penumbra.core.component.dex.v1alpha1.SwapPlan - (*v1alpha14.SwapClaimPlan)(nil), // 67: penumbra.core.component.dex.v1alpha1.SwapClaimPlan - (*v1alpha17.DelegatorVotePlan)(nil), // 68: penumbra.core.component.governance.v1alpha1.DelegatorVotePlan - (*v1alpha14.PositionWithdrawPlan)(nil), // 69: penumbra.core.component.dex.v1alpha1.PositionWithdrawPlan - (*v1alpha14.PositionRewardClaimPlan)(nil), // 70: penumbra.core.component.dex.v1alpha1.PositionRewardClaimPlan - (*v1alpha15.UndelegateClaimPlan)(nil), // 71: penumbra.core.component.stake.v1alpha1.UndelegateClaimPlan - (*v1alpha18.Address)(nil), // 72: penumbra.core.keys.v1alpha1.Address + (*TransactionBody)(nil), // 1: penumbra.core.transaction.v1alpha1.TransactionBody + (*TransactionParameters)(nil), // 2: penumbra.core.transaction.v1alpha1.TransactionParameters + (*DetectionData)(nil), // 3: penumbra.core.transaction.v1alpha1.DetectionData + (*Action)(nil), // 4: penumbra.core.transaction.v1alpha1.Action + (*TransactionPerspective)(nil), // 5: penumbra.core.transaction.v1alpha1.TransactionPerspective + (*PayloadKeyWithCommitment)(nil), // 6: penumbra.core.transaction.v1alpha1.PayloadKeyWithCommitment + (*NullifierWithNote)(nil), // 7: penumbra.core.transaction.v1alpha1.NullifierWithNote + (*TransactionView)(nil), // 8: penumbra.core.transaction.v1alpha1.TransactionView + (*TransactionBodyView)(nil), // 9: penumbra.core.transaction.v1alpha1.TransactionBodyView + (*ActionView)(nil), // 10: penumbra.core.transaction.v1alpha1.ActionView + (*AuthorizationData)(nil), // 11: penumbra.core.transaction.v1alpha1.AuthorizationData + (*WitnessData)(nil), // 12: penumbra.core.transaction.v1alpha1.WitnessData + (*TransactionPlan)(nil), // 13: penumbra.core.transaction.v1alpha1.TransactionPlan + (*DetectionDataPlan)(nil), // 14: penumbra.core.transaction.v1alpha1.DetectionDataPlan + (*ActionPlan)(nil), // 15: penumbra.core.transaction.v1alpha1.ActionPlan + (*CluePlan)(nil), // 16: penumbra.core.transaction.v1alpha1.CluePlan + (*MemoPlan)(nil), // 17: penumbra.core.transaction.v1alpha1.MemoPlan + (*MemoCiphertext)(nil), // 18: penumbra.core.transaction.v1alpha1.MemoCiphertext + (*MemoPlaintext)(nil), // 19: penumbra.core.transaction.v1alpha1.MemoPlaintext + (*MemoPlaintextView)(nil), // 20: penumbra.core.transaction.v1alpha1.MemoPlaintextView + (*MemoView)(nil), // 21: penumbra.core.transaction.v1alpha1.MemoView + (*MemoView_Visible)(nil), // 22: penumbra.core.transaction.v1alpha1.MemoView.Visible + (*MemoView_Opaque)(nil), // 23: penumbra.core.transaction.v1alpha1.MemoView.Opaque + (*v1alpha1.BindingSignature)(nil), // 24: penumbra.crypto.decaf377_rdsa.v1alpha1.BindingSignature + (*v1alpha11.MerkleRoot)(nil), // 25: penumbra.crypto.tct.v1alpha1.MerkleRoot + (*v1alpha12.Fee)(nil), // 26: penumbra.core.component.fee.v1alpha1.Fee + (*v1alpha13.Clue)(nil), // 27: penumbra.crypto.decaf377_fmd.v1alpha1.Clue + (*v1alpha14.Spend)(nil), // 28: penumbra.core.component.shielded_pool.v1alpha1.Spend + (*v1alpha14.Output)(nil), // 29: penumbra.core.component.shielded_pool.v1alpha1.Output + (*v1alpha15.Swap)(nil), // 30: penumbra.core.component.dex.v1alpha1.Swap + (*v1alpha15.SwapClaim)(nil), // 31: penumbra.core.component.dex.v1alpha1.SwapClaim + (*v1alpha16.ValidatorDefinition)(nil), // 32: penumbra.core.component.stake.v1alpha1.ValidatorDefinition + (*v1alpha17.IbcRelay)(nil), // 33: penumbra.core.component.ibc.v1alpha1.IbcRelay + (*v1alpha18.ProposalSubmit)(nil), // 34: penumbra.core.component.governance.v1alpha1.ProposalSubmit + (*v1alpha18.ProposalWithdraw)(nil), // 35: penumbra.core.component.governance.v1alpha1.ProposalWithdraw + (*v1alpha18.ValidatorVote)(nil), // 36: penumbra.core.component.governance.v1alpha1.ValidatorVote + (*v1alpha18.DelegatorVote)(nil), // 37: penumbra.core.component.governance.v1alpha1.DelegatorVote + (*v1alpha18.ProposalDepositClaim)(nil), // 38: penumbra.core.component.governance.v1alpha1.ProposalDepositClaim + (*v1alpha15.PositionOpen)(nil), // 39: penumbra.core.component.dex.v1alpha1.PositionOpen + (*v1alpha15.PositionClose)(nil), // 40: penumbra.core.component.dex.v1alpha1.PositionClose + (*v1alpha15.PositionWithdraw)(nil), // 41: penumbra.core.component.dex.v1alpha1.PositionWithdraw + (*v1alpha15.PositionRewardClaim)(nil), // 42: penumbra.core.component.dex.v1alpha1.PositionRewardClaim + (*v1alpha16.Delegate)(nil), // 43: penumbra.core.component.stake.v1alpha1.Delegate + (*v1alpha16.Undelegate)(nil), // 44: penumbra.core.component.stake.v1alpha1.Undelegate + (*v1alpha16.UndelegateClaim)(nil), // 45: penumbra.core.component.stake.v1alpha1.UndelegateClaim + (*v1alpha18.CommunityPoolSpend)(nil), // 46: penumbra.core.component.governance.v1alpha1.CommunityPoolSpend + (*v1alpha18.CommunityPoolOutput)(nil), // 47: penumbra.core.component.governance.v1alpha1.CommunityPoolOutput + (*v1alpha18.CommunityPoolDeposit)(nil), // 48: penumbra.core.component.governance.v1alpha1.CommunityPoolDeposit + (*v1alpha17.Ics20Withdrawal)(nil), // 49: penumbra.core.component.ibc.v1alpha1.Ics20Withdrawal + (*v1alpha14.Note)(nil), // 50: penumbra.core.component.shielded_pool.v1alpha1.Note + (*v1alpha19.AddressView)(nil), // 51: penumbra.core.keys.v1alpha1.AddressView + (*v1alpha110.DenomMetadata)(nil), // 52: penumbra.core.asset.v1alpha1.DenomMetadata + (*v1alpha111.TransactionId)(nil), // 53: penumbra.core.txhash.v1alpha1.TransactionId + (*v1alpha19.PayloadKey)(nil), // 54: penumbra.core.keys.v1alpha1.PayloadKey + (*v1alpha11.StateCommitment)(nil), // 55: penumbra.crypto.tct.v1alpha1.StateCommitment + (*v1alpha112.Nullifier)(nil), // 56: penumbra.core.component.sct.v1alpha1.Nullifier + (*v1alpha14.SpendView)(nil), // 57: penumbra.core.component.shielded_pool.v1alpha1.SpendView + (*v1alpha14.OutputView)(nil), // 58: penumbra.core.component.shielded_pool.v1alpha1.OutputView + (*v1alpha15.SwapView)(nil), // 59: penumbra.core.component.dex.v1alpha1.SwapView + (*v1alpha15.SwapClaimView)(nil), // 60: penumbra.core.component.dex.v1alpha1.SwapClaimView + (*v1alpha18.DelegatorVoteView)(nil), // 61: penumbra.core.component.governance.v1alpha1.DelegatorVoteView + (*v1alpha111.EffectHash)(nil), // 62: penumbra.core.txhash.v1alpha1.EffectHash + (*v1alpha1.SpendAuthSignature)(nil), // 63: penumbra.crypto.decaf377_rdsa.v1alpha1.SpendAuthSignature + (*v1alpha11.StateCommitmentProof)(nil), // 64: penumbra.crypto.tct.v1alpha1.StateCommitmentProof + (*v1alpha14.SpendPlan)(nil), // 65: penumbra.core.component.shielded_pool.v1alpha1.SpendPlan + (*v1alpha14.OutputPlan)(nil), // 66: penumbra.core.component.shielded_pool.v1alpha1.OutputPlan + (*v1alpha15.SwapPlan)(nil), // 67: penumbra.core.component.dex.v1alpha1.SwapPlan + (*v1alpha15.SwapClaimPlan)(nil), // 68: penumbra.core.component.dex.v1alpha1.SwapClaimPlan + (*v1alpha18.DelegatorVotePlan)(nil), // 69: penumbra.core.component.governance.v1alpha1.DelegatorVotePlan + (*v1alpha15.PositionWithdrawPlan)(nil), // 70: penumbra.core.component.dex.v1alpha1.PositionWithdrawPlan + (*v1alpha15.PositionRewardClaimPlan)(nil), // 71: penumbra.core.component.dex.v1alpha1.PositionRewardClaimPlan + (*v1alpha16.UndelegateClaimPlan)(nil), // 72: penumbra.core.component.stake.v1alpha1.UndelegateClaimPlan + (*v1alpha19.Address)(nil), // 73: penumbra.core.keys.v1alpha1.Address } var file_penumbra_core_transaction_v1alpha1_transaction_proto_depIdxs = []int32{ - 2, // 0: penumbra.core.transaction.v1alpha1.Transaction.body:type_name -> penumbra.core.transaction.v1alpha1.TransactionBody - 26, // 1: penumbra.core.transaction.v1alpha1.Transaction.anchor:type_name -> penumbra.crypto.tct.v1alpha1.MerkleRoot - 6, // 2: penumbra.core.transaction.v1alpha1.TransactionBody.actions:type_name -> penumbra.core.transaction.v1alpha1.Action - 4, // 3: penumbra.core.transaction.v1alpha1.TransactionBody.transaction_parameters:type_name -> penumbra.core.transaction.v1alpha1.TransactionParameters - 27, // 4: penumbra.core.transaction.v1alpha1.TransactionBody.fee:type_name -> penumbra.core.component.fee.v1alpha1.Fee - 5, // 5: penumbra.core.transaction.v1alpha1.TransactionBody.detection_data:type_name -> penumbra.core.transaction.v1alpha1.DetectionData - 3, // 6: penumbra.core.transaction.v1alpha1.TransactionBody.memo_data:type_name -> penumbra.core.transaction.v1alpha1.MemoData - 28, // 7: penumbra.core.transaction.v1alpha1.DetectionData.fmd_clues:type_name -> penumbra.crypto.decaf377_fmd.v1alpha1.Clue - 29, // 8: penumbra.core.transaction.v1alpha1.Action.spend:type_name -> penumbra.core.component.shielded_pool.v1alpha1.Spend - 30, // 9: penumbra.core.transaction.v1alpha1.Action.output:type_name -> penumbra.core.component.shielded_pool.v1alpha1.Output - 31, // 10: penumbra.core.transaction.v1alpha1.Action.swap:type_name -> penumbra.core.component.dex.v1alpha1.Swap - 32, // 11: penumbra.core.transaction.v1alpha1.Action.swap_claim:type_name -> penumbra.core.component.dex.v1alpha1.SwapClaim - 33, // 12: penumbra.core.transaction.v1alpha1.Action.validator_definition:type_name -> penumbra.core.component.stake.v1alpha1.ValidatorDefinition - 34, // 13: penumbra.core.transaction.v1alpha1.Action.ibc_relay_action:type_name -> penumbra.core.component.ibc.v1alpha1.IbcRelay - 35, // 14: penumbra.core.transaction.v1alpha1.Action.proposal_submit:type_name -> penumbra.core.component.governance.v1alpha1.ProposalSubmit - 36, // 15: penumbra.core.transaction.v1alpha1.Action.proposal_withdraw:type_name -> penumbra.core.component.governance.v1alpha1.ProposalWithdraw - 37, // 16: penumbra.core.transaction.v1alpha1.Action.validator_vote:type_name -> penumbra.core.component.governance.v1alpha1.ValidatorVote - 38, // 17: penumbra.core.transaction.v1alpha1.Action.delegator_vote:type_name -> penumbra.core.component.governance.v1alpha1.DelegatorVote - 39, // 18: penumbra.core.transaction.v1alpha1.Action.proposal_deposit_claim:type_name -> penumbra.core.component.governance.v1alpha1.ProposalDepositClaim - 40, // 19: penumbra.core.transaction.v1alpha1.Action.position_open:type_name -> penumbra.core.component.dex.v1alpha1.PositionOpen - 41, // 20: penumbra.core.transaction.v1alpha1.Action.position_close:type_name -> penumbra.core.component.dex.v1alpha1.PositionClose - 42, // 21: penumbra.core.transaction.v1alpha1.Action.position_withdraw:type_name -> penumbra.core.component.dex.v1alpha1.PositionWithdraw - 43, // 22: penumbra.core.transaction.v1alpha1.Action.position_reward_claim:type_name -> penumbra.core.component.dex.v1alpha1.PositionRewardClaim - 44, // 23: penumbra.core.transaction.v1alpha1.Action.delegate:type_name -> penumbra.core.component.stake.v1alpha1.Delegate - 45, // 24: penumbra.core.transaction.v1alpha1.Action.undelegate:type_name -> penumbra.core.component.stake.v1alpha1.Undelegate - 46, // 25: penumbra.core.transaction.v1alpha1.Action.undelegate_claim:type_name -> penumbra.core.component.stake.v1alpha1.UndelegateClaim - 47, // 26: penumbra.core.transaction.v1alpha1.Action.dao_spend:type_name -> penumbra.core.component.governance.v1alpha1.DaoSpend - 48, // 27: penumbra.core.transaction.v1alpha1.Action.dao_output:type_name -> penumbra.core.component.governance.v1alpha1.DaoOutput - 49, // 28: penumbra.core.transaction.v1alpha1.Action.dao_deposit:type_name -> penumbra.core.component.governance.v1alpha1.DaoDeposit - 50, // 29: penumbra.core.transaction.v1alpha1.Action.ics20_withdrawal:type_name -> penumbra.core.component.ibc.v1alpha1.Ics20Withdrawal - 8, // 30: penumbra.core.transaction.v1alpha1.TransactionPerspective.payload_keys:type_name -> penumbra.core.transaction.v1alpha1.PayloadKeyWithCommitment - 9, // 31: penumbra.core.transaction.v1alpha1.TransactionPerspective.spend_nullifiers:type_name -> penumbra.core.transaction.v1alpha1.NullifierWithNote - 51, // 32: penumbra.core.transaction.v1alpha1.TransactionPerspective.advice_notes:type_name -> penumbra.core.component.shielded_pool.v1alpha1.Note - 52, // 33: penumbra.core.transaction.v1alpha1.TransactionPerspective.address_views:type_name -> penumbra.core.keys.v1alpha1.AddressView - 53, // 34: penumbra.core.transaction.v1alpha1.TransactionPerspective.denoms:type_name -> penumbra.core.asset.v1alpha1.DenomMetadata - 1, // 35: penumbra.core.transaction.v1alpha1.TransactionPerspective.transaction_id:type_name -> penumbra.core.transaction.v1alpha1.Id - 54, // 36: penumbra.core.transaction.v1alpha1.PayloadKeyWithCommitment.payload_key:type_name -> penumbra.core.keys.v1alpha1.PayloadKey - 55, // 37: penumbra.core.transaction.v1alpha1.PayloadKeyWithCommitment.commitment:type_name -> penumbra.crypto.tct.v1alpha1.StateCommitment - 56, // 38: penumbra.core.transaction.v1alpha1.NullifierWithNote.nullifier:type_name -> penumbra.core.component.sct.v1alpha1.Nullifier - 51, // 39: penumbra.core.transaction.v1alpha1.NullifierWithNote.note:type_name -> penumbra.core.component.shielded_pool.v1alpha1.Note - 11, // 40: penumbra.core.transaction.v1alpha1.TransactionView.body_view:type_name -> penumbra.core.transaction.v1alpha1.TransactionBodyView - 26, // 41: penumbra.core.transaction.v1alpha1.TransactionView.anchor:type_name -> penumbra.crypto.tct.v1alpha1.MerkleRoot - 12, // 42: penumbra.core.transaction.v1alpha1.TransactionBodyView.action_views:type_name -> penumbra.core.transaction.v1alpha1.ActionView - 4, // 43: penumbra.core.transaction.v1alpha1.TransactionBodyView.transaction_parameters:type_name -> penumbra.core.transaction.v1alpha1.TransactionParameters - 27, // 44: penumbra.core.transaction.v1alpha1.TransactionBodyView.fee:type_name -> penumbra.core.component.fee.v1alpha1.Fee - 5, // 45: penumbra.core.transaction.v1alpha1.TransactionBodyView.detection_data:type_name -> penumbra.core.transaction.v1alpha1.DetectionData - 23, // 46: penumbra.core.transaction.v1alpha1.TransactionBodyView.memo_view:type_name -> penumbra.core.transaction.v1alpha1.MemoView - 57, // 47: penumbra.core.transaction.v1alpha1.ActionView.spend:type_name -> penumbra.core.component.shielded_pool.v1alpha1.SpendView - 58, // 48: penumbra.core.transaction.v1alpha1.ActionView.output:type_name -> penumbra.core.component.shielded_pool.v1alpha1.OutputView - 59, // 49: penumbra.core.transaction.v1alpha1.ActionView.swap:type_name -> penumbra.core.component.dex.v1alpha1.SwapView - 60, // 50: penumbra.core.transaction.v1alpha1.ActionView.swap_claim:type_name -> penumbra.core.component.dex.v1alpha1.SwapClaimView - 33, // 51: penumbra.core.transaction.v1alpha1.ActionView.validator_definition:type_name -> penumbra.core.component.stake.v1alpha1.ValidatorDefinition - 34, // 52: penumbra.core.transaction.v1alpha1.ActionView.ibc_relay_action:type_name -> penumbra.core.component.ibc.v1alpha1.IbcRelay - 35, // 53: penumbra.core.transaction.v1alpha1.ActionView.proposal_submit:type_name -> penumbra.core.component.governance.v1alpha1.ProposalSubmit - 36, // 54: penumbra.core.transaction.v1alpha1.ActionView.proposal_withdraw:type_name -> penumbra.core.component.governance.v1alpha1.ProposalWithdraw - 37, // 55: penumbra.core.transaction.v1alpha1.ActionView.validator_vote:type_name -> penumbra.core.component.governance.v1alpha1.ValidatorVote - 61, // 56: penumbra.core.transaction.v1alpha1.ActionView.delegator_vote:type_name -> penumbra.core.component.governance.v1alpha1.DelegatorVoteView - 39, // 57: penumbra.core.transaction.v1alpha1.ActionView.proposal_deposit_claim:type_name -> penumbra.core.component.governance.v1alpha1.ProposalDepositClaim - 40, // 58: penumbra.core.transaction.v1alpha1.ActionView.position_open:type_name -> penumbra.core.component.dex.v1alpha1.PositionOpen - 41, // 59: penumbra.core.transaction.v1alpha1.ActionView.position_close:type_name -> penumbra.core.component.dex.v1alpha1.PositionClose - 42, // 60: penumbra.core.transaction.v1alpha1.ActionView.position_withdraw:type_name -> penumbra.core.component.dex.v1alpha1.PositionWithdraw - 43, // 61: penumbra.core.transaction.v1alpha1.ActionView.position_reward_claim:type_name -> penumbra.core.component.dex.v1alpha1.PositionRewardClaim - 44, // 62: penumbra.core.transaction.v1alpha1.ActionView.delegate:type_name -> penumbra.core.component.stake.v1alpha1.Delegate - 45, // 63: penumbra.core.transaction.v1alpha1.ActionView.undelegate:type_name -> penumbra.core.component.stake.v1alpha1.Undelegate - 47, // 64: penumbra.core.transaction.v1alpha1.ActionView.dao_spend:type_name -> penumbra.core.component.governance.v1alpha1.DaoSpend - 48, // 65: penumbra.core.transaction.v1alpha1.ActionView.dao_output:type_name -> penumbra.core.component.governance.v1alpha1.DaoOutput - 49, // 66: penumbra.core.transaction.v1alpha1.ActionView.dao_deposit:type_name -> penumbra.core.component.governance.v1alpha1.DaoDeposit - 46, // 67: penumbra.core.transaction.v1alpha1.ActionView.undelegate_claim:type_name -> penumbra.core.component.stake.v1alpha1.UndelegateClaim - 50, // 68: penumbra.core.transaction.v1alpha1.ActionView.ics20_withdrawal:type_name -> penumbra.core.component.ibc.v1alpha1.Ics20Withdrawal - 13, // 69: penumbra.core.transaction.v1alpha1.AuthorizationData.effect_hash:type_name -> penumbra.core.transaction.v1alpha1.EffectHash - 62, // 70: penumbra.core.transaction.v1alpha1.AuthorizationData.spend_auths:type_name -> penumbra.crypto.decaf377_rdsa.v1alpha1.SpendAuthSignature - 62, // 71: penumbra.core.transaction.v1alpha1.AuthorizationData.delegator_vote_auths:type_name -> penumbra.crypto.decaf377_rdsa.v1alpha1.SpendAuthSignature - 26, // 72: penumbra.core.transaction.v1alpha1.WitnessData.anchor:type_name -> penumbra.crypto.tct.v1alpha1.MerkleRoot - 63, // 73: penumbra.core.transaction.v1alpha1.WitnessData.state_commitment_proofs:type_name -> penumbra.crypto.tct.v1alpha1.StateCommitmentProof - 17, // 74: penumbra.core.transaction.v1alpha1.TransactionPlan.actions:type_name -> penumbra.core.transaction.v1alpha1.ActionPlan - 27, // 75: penumbra.core.transaction.v1alpha1.TransactionPlan.fee:type_name -> penumbra.core.component.fee.v1alpha1.Fee - 18, // 76: penumbra.core.transaction.v1alpha1.TransactionPlan.clue_plans:type_name -> penumbra.core.transaction.v1alpha1.CluePlan - 19, // 77: penumbra.core.transaction.v1alpha1.TransactionPlan.memo_plan:type_name -> penumbra.core.transaction.v1alpha1.MemoPlan - 64, // 78: penumbra.core.transaction.v1alpha1.ActionPlan.spend:type_name -> penumbra.core.component.shielded_pool.v1alpha1.SpendPlan - 65, // 79: penumbra.core.transaction.v1alpha1.ActionPlan.output:type_name -> penumbra.core.component.shielded_pool.v1alpha1.OutputPlan - 66, // 80: penumbra.core.transaction.v1alpha1.ActionPlan.swap:type_name -> penumbra.core.component.dex.v1alpha1.SwapPlan - 67, // 81: penumbra.core.transaction.v1alpha1.ActionPlan.swap_claim:type_name -> penumbra.core.component.dex.v1alpha1.SwapClaimPlan - 33, // 82: penumbra.core.transaction.v1alpha1.ActionPlan.validator_definition:type_name -> penumbra.core.component.stake.v1alpha1.ValidatorDefinition - 34, // 83: penumbra.core.transaction.v1alpha1.ActionPlan.ibc_relay_action:type_name -> penumbra.core.component.ibc.v1alpha1.IbcRelay - 35, // 84: penumbra.core.transaction.v1alpha1.ActionPlan.proposal_submit:type_name -> penumbra.core.component.governance.v1alpha1.ProposalSubmit - 36, // 85: penumbra.core.transaction.v1alpha1.ActionPlan.proposal_withdraw:type_name -> penumbra.core.component.governance.v1alpha1.ProposalWithdraw - 37, // 86: penumbra.core.transaction.v1alpha1.ActionPlan.validator_vote:type_name -> penumbra.core.component.governance.v1alpha1.ValidatorVote - 68, // 87: penumbra.core.transaction.v1alpha1.ActionPlan.delegator_vote:type_name -> penumbra.core.component.governance.v1alpha1.DelegatorVotePlan - 39, // 88: penumbra.core.transaction.v1alpha1.ActionPlan.proposal_deposit_claim:type_name -> penumbra.core.component.governance.v1alpha1.ProposalDepositClaim - 50, // 89: penumbra.core.transaction.v1alpha1.ActionPlan.withdrawal:type_name -> penumbra.core.component.ibc.v1alpha1.Ics20Withdrawal - 40, // 90: penumbra.core.transaction.v1alpha1.ActionPlan.position_open:type_name -> penumbra.core.component.dex.v1alpha1.PositionOpen - 41, // 91: penumbra.core.transaction.v1alpha1.ActionPlan.position_close:type_name -> penumbra.core.component.dex.v1alpha1.PositionClose - 69, // 92: penumbra.core.transaction.v1alpha1.ActionPlan.position_withdraw:type_name -> penumbra.core.component.dex.v1alpha1.PositionWithdrawPlan - 70, // 93: penumbra.core.transaction.v1alpha1.ActionPlan.position_reward_claim:type_name -> penumbra.core.component.dex.v1alpha1.PositionRewardClaimPlan - 44, // 94: penumbra.core.transaction.v1alpha1.ActionPlan.delegate:type_name -> penumbra.core.component.stake.v1alpha1.Delegate - 45, // 95: penumbra.core.transaction.v1alpha1.ActionPlan.undelegate:type_name -> penumbra.core.component.stake.v1alpha1.Undelegate - 71, // 96: penumbra.core.transaction.v1alpha1.ActionPlan.undelegate_claim:type_name -> penumbra.core.component.stake.v1alpha1.UndelegateClaimPlan - 47, // 97: penumbra.core.transaction.v1alpha1.ActionPlan.dao_spend:type_name -> penumbra.core.component.governance.v1alpha1.DaoSpend - 48, // 98: penumbra.core.transaction.v1alpha1.ActionPlan.dao_output:type_name -> penumbra.core.component.governance.v1alpha1.DaoOutput - 49, // 99: penumbra.core.transaction.v1alpha1.ActionPlan.dao_deposit:type_name -> penumbra.core.component.governance.v1alpha1.DaoDeposit - 72, // 100: penumbra.core.transaction.v1alpha1.CluePlan.address:type_name -> penumbra.core.keys.v1alpha1.Address - 21, // 101: penumbra.core.transaction.v1alpha1.MemoPlan.plaintext:type_name -> penumbra.core.transaction.v1alpha1.MemoPlaintext - 72, // 102: penumbra.core.transaction.v1alpha1.MemoPlaintext.return_address:type_name -> penumbra.core.keys.v1alpha1.Address - 52, // 103: penumbra.core.transaction.v1alpha1.MemoPlaintextView.return_address:type_name -> penumbra.core.keys.v1alpha1.AddressView - 24, // 104: penumbra.core.transaction.v1alpha1.MemoView.visible:type_name -> penumbra.core.transaction.v1alpha1.MemoView.Visible - 25, // 105: penumbra.core.transaction.v1alpha1.MemoView.opaque:type_name -> penumbra.core.transaction.v1alpha1.MemoView.Opaque - 20, // 106: penumbra.core.transaction.v1alpha1.MemoView.Visible.ciphertext:type_name -> penumbra.core.transaction.v1alpha1.MemoCiphertext - 22, // 107: penumbra.core.transaction.v1alpha1.MemoView.Visible.plaintext:type_name -> penumbra.core.transaction.v1alpha1.MemoPlaintextView - 20, // 108: penumbra.core.transaction.v1alpha1.MemoView.Opaque.ciphertext:type_name -> penumbra.core.transaction.v1alpha1.MemoCiphertext - 109, // [109:109] is the sub-list for method output_type - 109, // [109:109] is the sub-list for method input_type - 109, // [109:109] is the sub-list for extension type_name - 109, // [109:109] is the sub-list for extension extendee - 0, // [0:109] is the sub-list for field type_name + 1, // 0: penumbra.core.transaction.v1alpha1.Transaction.body:type_name -> penumbra.core.transaction.v1alpha1.TransactionBody + 24, // 1: penumbra.core.transaction.v1alpha1.Transaction.binding_sig:type_name -> penumbra.crypto.decaf377_rdsa.v1alpha1.BindingSignature + 25, // 2: penumbra.core.transaction.v1alpha1.Transaction.anchor:type_name -> penumbra.crypto.tct.v1alpha1.MerkleRoot + 4, // 3: penumbra.core.transaction.v1alpha1.TransactionBody.actions:type_name -> penumbra.core.transaction.v1alpha1.Action + 2, // 4: penumbra.core.transaction.v1alpha1.TransactionBody.transaction_parameters:type_name -> penumbra.core.transaction.v1alpha1.TransactionParameters + 3, // 5: penumbra.core.transaction.v1alpha1.TransactionBody.detection_data:type_name -> penumbra.core.transaction.v1alpha1.DetectionData + 18, // 6: penumbra.core.transaction.v1alpha1.TransactionBody.memo:type_name -> penumbra.core.transaction.v1alpha1.MemoCiphertext + 26, // 7: penumbra.core.transaction.v1alpha1.TransactionParameters.fee:type_name -> penumbra.core.component.fee.v1alpha1.Fee + 27, // 8: penumbra.core.transaction.v1alpha1.DetectionData.fmd_clues:type_name -> penumbra.crypto.decaf377_fmd.v1alpha1.Clue + 28, // 9: penumbra.core.transaction.v1alpha1.Action.spend:type_name -> penumbra.core.component.shielded_pool.v1alpha1.Spend + 29, // 10: penumbra.core.transaction.v1alpha1.Action.output:type_name -> penumbra.core.component.shielded_pool.v1alpha1.Output + 30, // 11: penumbra.core.transaction.v1alpha1.Action.swap:type_name -> penumbra.core.component.dex.v1alpha1.Swap + 31, // 12: penumbra.core.transaction.v1alpha1.Action.swap_claim:type_name -> penumbra.core.component.dex.v1alpha1.SwapClaim + 32, // 13: penumbra.core.transaction.v1alpha1.Action.validator_definition:type_name -> penumbra.core.component.stake.v1alpha1.ValidatorDefinition + 33, // 14: penumbra.core.transaction.v1alpha1.Action.ibc_relay_action:type_name -> penumbra.core.component.ibc.v1alpha1.IbcRelay + 34, // 15: penumbra.core.transaction.v1alpha1.Action.proposal_submit:type_name -> penumbra.core.component.governance.v1alpha1.ProposalSubmit + 35, // 16: penumbra.core.transaction.v1alpha1.Action.proposal_withdraw:type_name -> penumbra.core.component.governance.v1alpha1.ProposalWithdraw + 36, // 17: penumbra.core.transaction.v1alpha1.Action.validator_vote:type_name -> penumbra.core.component.governance.v1alpha1.ValidatorVote + 37, // 18: penumbra.core.transaction.v1alpha1.Action.delegator_vote:type_name -> penumbra.core.component.governance.v1alpha1.DelegatorVote + 38, // 19: penumbra.core.transaction.v1alpha1.Action.proposal_deposit_claim:type_name -> penumbra.core.component.governance.v1alpha1.ProposalDepositClaim + 39, // 20: penumbra.core.transaction.v1alpha1.Action.position_open:type_name -> penumbra.core.component.dex.v1alpha1.PositionOpen + 40, // 21: penumbra.core.transaction.v1alpha1.Action.position_close:type_name -> penumbra.core.component.dex.v1alpha1.PositionClose + 41, // 22: penumbra.core.transaction.v1alpha1.Action.position_withdraw:type_name -> penumbra.core.component.dex.v1alpha1.PositionWithdraw + 42, // 23: penumbra.core.transaction.v1alpha1.Action.position_reward_claim:type_name -> penumbra.core.component.dex.v1alpha1.PositionRewardClaim + 43, // 24: penumbra.core.transaction.v1alpha1.Action.delegate:type_name -> penumbra.core.component.stake.v1alpha1.Delegate + 44, // 25: penumbra.core.transaction.v1alpha1.Action.undelegate:type_name -> penumbra.core.component.stake.v1alpha1.Undelegate + 45, // 26: penumbra.core.transaction.v1alpha1.Action.undelegate_claim:type_name -> penumbra.core.component.stake.v1alpha1.UndelegateClaim + 46, // 27: penumbra.core.transaction.v1alpha1.Action.community_pool_spend:type_name -> penumbra.core.component.governance.v1alpha1.CommunityPoolSpend + 47, // 28: penumbra.core.transaction.v1alpha1.Action.community_pool_output:type_name -> penumbra.core.component.governance.v1alpha1.CommunityPoolOutput + 48, // 29: penumbra.core.transaction.v1alpha1.Action.community_pool_deposit:type_name -> penumbra.core.component.governance.v1alpha1.CommunityPoolDeposit + 49, // 30: penumbra.core.transaction.v1alpha1.Action.ics20_withdrawal:type_name -> penumbra.core.component.ibc.v1alpha1.Ics20Withdrawal + 6, // 31: penumbra.core.transaction.v1alpha1.TransactionPerspective.payload_keys:type_name -> penumbra.core.transaction.v1alpha1.PayloadKeyWithCommitment + 7, // 32: penumbra.core.transaction.v1alpha1.TransactionPerspective.spend_nullifiers:type_name -> penumbra.core.transaction.v1alpha1.NullifierWithNote + 50, // 33: penumbra.core.transaction.v1alpha1.TransactionPerspective.advice_notes:type_name -> penumbra.core.component.shielded_pool.v1alpha1.Note + 51, // 34: penumbra.core.transaction.v1alpha1.TransactionPerspective.address_views:type_name -> penumbra.core.keys.v1alpha1.AddressView + 52, // 35: penumbra.core.transaction.v1alpha1.TransactionPerspective.denoms:type_name -> penumbra.core.asset.v1alpha1.DenomMetadata + 53, // 36: penumbra.core.transaction.v1alpha1.TransactionPerspective.transaction_id:type_name -> penumbra.core.txhash.v1alpha1.TransactionId + 54, // 37: penumbra.core.transaction.v1alpha1.PayloadKeyWithCommitment.payload_key:type_name -> penumbra.core.keys.v1alpha1.PayloadKey + 55, // 38: penumbra.core.transaction.v1alpha1.PayloadKeyWithCommitment.commitment:type_name -> penumbra.crypto.tct.v1alpha1.StateCommitment + 56, // 39: penumbra.core.transaction.v1alpha1.NullifierWithNote.nullifier:type_name -> penumbra.core.component.sct.v1alpha1.Nullifier + 50, // 40: penumbra.core.transaction.v1alpha1.NullifierWithNote.note:type_name -> penumbra.core.component.shielded_pool.v1alpha1.Note + 9, // 41: penumbra.core.transaction.v1alpha1.TransactionView.body_view:type_name -> penumbra.core.transaction.v1alpha1.TransactionBodyView + 24, // 42: penumbra.core.transaction.v1alpha1.TransactionView.binding_sig:type_name -> penumbra.crypto.decaf377_rdsa.v1alpha1.BindingSignature + 25, // 43: penumbra.core.transaction.v1alpha1.TransactionView.anchor:type_name -> penumbra.crypto.tct.v1alpha1.MerkleRoot + 10, // 44: penumbra.core.transaction.v1alpha1.TransactionBodyView.action_views:type_name -> penumbra.core.transaction.v1alpha1.ActionView + 2, // 45: penumbra.core.transaction.v1alpha1.TransactionBodyView.transaction_parameters:type_name -> penumbra.core.transaction.v1alpha1.TransactionParameters + 3, // 46: penumbra.core.transaction.v1alpha1.TransactionBodyView.detection_data:type_name -> penumbra.core.transaction.v1alpha1.DetectionData + 21, // 47: penumbra.core.transaction.v1alpha1.TransactionBodyView.memo_view:type_name -> penumbra.core.transaction.v1alpha1.MemoView + 57, // 48: penumbra.core.transaction.v1alpha1.ActionView.spend:type_name -> penumbra.core.component.shielded_pool.v1alpha1.SpendView + 58, // 49: penumbra.core.transaction.v1alpha1.ActionView.output:type_name -> penumbra.core.component.shielded_pool.v1alpha1.OutputView + 59, // 50: penumbra.core.transaction.v1alpha1.ActionView.swap:type_name -> penumbra.core.component.dex.v1alpha1.SwapView + 60, // 51: penumbra.core.transaction.v1alpha1.ActionView.swap_claim:type_name -> penumbra.core.component.dex.v1alpha1.SwapClaimView + 32, // 52: penumbra.core.transaction.v1alpha1.ActionView.validator_definition:type_name -> penumbra.core.component.stake.v1alpha1.ValidatorDefinition + 33, // 53: penumbra.core.transaction.v1alpha1.ActionView.ibc_relay_action:type_name -> penumbra.core.component.ibc.v1alpha1.IbcRelay + 34, // 54: penumbra.core.transaction.v1alpha1.ActionView.proposal_submit:type_name -> penumbra.core.component.governance.v1alpha1.ProposalSubmit + 35, // 55: penumbra.core.transaction.v1alpha1.ActionView.proposal_withdraw:type_name -> penumbra.core.component.governance.v1alpha1.ProposalWithdraw + 36, // 56: penumbra.core.transaction.v1alpha1.ActionView.validator_vote:type_name -> penumbra.core.component.governance.v1alpha1.ValidatorVote + 61, // 57: penumbra.core.transaction.v1alpha1.ActionView.delegator_vote:type_name -> penumbra.core.component.governance.v1alpha1.DelegatorVoteView + 38, // 58: penumbra.core.transaction.v1alpha1.ActionView.proposal_deposit_claim:type_name -> penumbra.core.component.governance.v1alpha1.ProposalDepositClaim + 39, // 59: penumbra.core.transaction.v1alpha1.ActionView.position_open:type_name -> penumbra.core.component.dex.v1alpha1.PositionOpen + 40, // 60: penumbra.core.transaction.v1alpha1.ActionView.position_close:type_name -> penumbra.core.component.dex.v1alpha1.PositionClose + 41, // 61: penumbra.core.transaction.v1alpha1.ActionView.position_withdraw:type_name -> penumbra.core.component.dex.v1alpha1.PositionWithdraw + 42, // 62: penumbra.core.transaction.v1alpha1.ActionView.position_reward_claim:type_name -> penumbra.core.component.dex.v1alpha1.PositionRewardClaim + 43, // 63: penumbra.core.transaction.v1alpha1.ActionView.delegate:type_name -> penumbra.core.component.stake.v1alpha1.Delegate + 44, // 64: penumbra.core.transaction.v1alpha1.ActionView.undelegate:type_name -> penumbra.core.component.stake.v1alpha1.Undelegate + 46, // 65: penumbra.core.transaction.v1alpha1.ActionView.community_pool_spend:type_name -> penumbra.core.component.governance.v1alpha1.CommunityPoolSpend + 47, // 66: penumbra.core.transaction.v1alpha1.ActionView.community_pool_output:type_name -> penumbra.core.component.governance.v1alpha1.CommunityPoolOutput + 48, // 67: penumbra.core.transaction.v1alpha1.ActionView.community_pool_deposit:type_name -> penumbra.core.component.governance.v1alpha1.CommunityPoolDeposit + 45, // 68: penumbra.core.transaction.v1alpha1.ActionView.undelegate_claim:type_name -> penumbra.core.component.stake.v1alpha1.UndelegateClaim + 49, // 69: penumbra.core.transaction.v1alpha1.ActionView.ics20_withdrawal:type_name -> penumbra.core.component.ibc.v1alpha1.Ics20Withdrawal + 62, // 70: penumbra.core.transaction.v1alpha1.AuthorizationData.effect_hash:type_name -> penumbra.core.txhash.v1alpha1.EffectHash + 63, // 71: penumbra.core.transaction.v1alpha1.AuthorizationData.spend_auths:type_name -> penumbra.crypto.decaf377_rdsa.v1alpha1.SpendAuthSignature + 63, // 72: penumbra.core.transaction.v1alpha1.AuthorizationData.delegator_vote_auths:type_name -> penumbra.crypto.decaf377_rdsa.v1alpha1.SpendAuthSignature + 25, // 73: penumbra.core.transaction.v1alpha1.WitnessData.anchor:type_name -> penumbra.crypto.tct.v1alpha1.MerkleRoot + 64, // 74: penumbra.core.transaction.v1alpha1.WitnessData.state_commitment_proofs:type_name -> penumbra.crypto.tct.v1alpha1.StateCommitmentProof + 15, // 75: penumbra.core.transaction.v1alpha1.TransactionPlan.actions:type_name -> penumbra.core.transaction.v1alpha1.ActionPlan + 2, // 76: penumbra.core.transaction.v1alpha1.TransactionPlan.transaction_parameters:type_name -> penumbra.core.transaction.v1alpha1.TransactionParameters + 14, // 77: penumbra.core.transaction.v1alpha1.TransactionPlan.detection_data:type_name -> penumbra.core.transaction.v1alpha1.DetectionDataPlan + 17, // 78: penumbra.core.transaction.v1alpha1.TransactionPlan.memo:type_name -> penumbra.core.transaction.v1alpha1.MemoPlan + 16, // 79: penumbra.core.transaction.v1alpha1.DetectionDataPlan.clue_plans:type_name -> penumbra.core.transaction.v1alpha1.CluePlan + 65, // 80: penumbra.core.transaction.v1alpha1.ActionPlan.spend:type_name -> penumbra.core.component.shielded_pool.v1alpha1.SpendPlan + 66, // 81: penumbra.core.transaction.v1alpha1.ActionPlan.output:type_name -> penumbra.core.component.shielded_pool.v1alpha1.OutputPlan + 67, // 82: penumbra.core.transaction.v1alpha1.ActionPlan.swap:type_name -> penumbra.core.component.dex.v1alpha1.SwapPlan + 68, // 83: penumbra.core.transaction.v1alpha1.ActionPlan.swap_claim:type_name -> penumbra.core.component.dex.v1alpha1.SwapClaimPlan + 32, // 84: penumbra.core.transaction.v1alpha1.ActionPlan.validator_definition:type_name -> penumbra.core.component.stake.v1alpha1.ValidatorDefinition + 33, // 85: penumbra.core.transaction.v1alpha1.ActionPlan.ibc_relay_action:type_name -> penumbra.core.component.ibc.v1alpha1.IbcRelay + 34, // 86: penumbra.core.transaction.v1alpha1.ActionPlan.proposal_submit:type_name -> penumbra.core.component.governance.v1alpha1.ProposalSubmit + 35, // 87: penumbra.core.transaction.v1alpha1.ActionPlan.proposal_withdraw:type_name -> penumbra.core.component.governance.v1alpha1.ProposalWithdraw + 36, // 88: penumbra.core.transaction.v1alpha1.ActionPlan.validator_vote:type_name -> penumbra.core.component.governance.v1alpha1.ValidatorVote + 69, // 89: penumbra.core.transaction.v1alpha1.ActionPlan.delegator_vote:type_name -> penumbra.core.component.governance.v1alpha1.DelegatorVotePlan + 38, // 90: penumbra.core.transaction.v1alpha1.ActionPlan.proposal_deposit_claim:type_name -> penumbra.core.component.governance.v1alpha1.ProposalDepositClaim + 49, // 91: penumbra.core.transaction.v1alpha1.ActionPlan.withdrawal:type_name -> penumbra.core.component.ibc.v1alpha1.Ics20Withdrawal + 39, // 92: penumbra.core.transaction.v1alpha1.ActionPlan.position_open:type_name -> penumbra.core.component.dex.v1alpha1.PositionOpen + 40, // 93: penumbra.core.transaction.v1alpha1.ActionPlan.position_close:type_name -> penumbra.core.component.dex.v1alpha1.PositionClose + 70, // 94: penumbra.core.transaction.v1alpha1.ActionPlan.position_withdraw:type_name -> penumbra.core.component.dex.v1alpha1.PositionWithdrawPlan + 71, // 95: penumbra.core.transaction.v1alpha1.ActionPlan.position_reward_claim:type_name -> penumbra.core.component.dex.v1alpha1.PositionRewardClaimPlan + 43, // 96: penumbra.core.transaction.v1alpha1.ActionPlan.delegate:type_name -> penumbra.core.component.stake.v1alpha1.Delegate + 44, // 97: penumbra.core.transaction.v1alpha1.ActionPlan.undelegate:type_name -> penumbra.core.component.stake.v1alpha1.Undelegate + 72, // 98: penumbra.core.transaction.v1alpha1.ActionPlan.undelegate_claim:type_name -> penumbra.core.component.stake.v1alpha1.UndelegateClaimPlan + 46, // 99: penumbra.core.transaction.v1alpha1.ActionPlan.community_pool_spend:type_name -> penumbra.core.component.governance.v1alpha1.CommunityPoolSpend + 47, // 100: penumbra.core.transaction.v1alpha1.ActionPlan.community_pool_output:type_name -> penumbra.core.component.governance.v1alpha1.CommunityPoolOutput + 48, // 101: penumbra.core.transaction.v1alpha1.ActionPlan.community_pool_deposit:type_name -> penumbra.core.component.governance.v1alpha1.CommunityPoolDeposit + 73, // 102: penumbra.core.transaction.v1alpha1.CluePlan.address:type_name -> penumbra.core.keys.v1alpha1.Address + 19, // 103: penumbra.core.transaction.v1alpha1.MemoPlan.plaintext:type_name -> penumbra.core.transaction.v1alpha1.MemoPlaintext + 73, // 104: penumbra.core.transaction.v1alpha1.MemoPlaintext.return_address:type_name -> penumbra.core.keys.v1alpha1.Address + 51, // 105: penumbra.core.transaction.v1alpha1.MemoPlaintextView.return_address:type_name -> penumbra.core.keys.v1alpha1.AddressView + 22, // 106: penumbra.core.transaction.v1alpha1.MemoView.visible:type_name -> penumbra.core.transaction.v1alpha1.MemoView.Visible + 23, // 107: penumbra.core.transaction.v1alpha1.MemoView.opaque:type_name -> penumbra.core.transaction.v1alpha1.MemoView.Opaque + 18, // 108: penumbra.core.transaction.v1alpha1.MemoView.Visible.ciphertext:type_name -> penumbra.core.transaction.v1alpha1.MemoCiphertext + 20, // 109: penumbra.core.transaction.v1alpha1.MemoView.Visible.plaintext:type_name -> penumbra.core.transaction.v1alpha1.MemoPlaintextView + 18, // 110: penumbra.core.transaction.v1alpha1.MemoView.Opaque.ciphertext:type_name -> penumbra.core.transaction.v1alpha1.MemoCiphertext + 111, // [111:111] is the sub-list for method output_type + 111, // [111:111] is the sub-list for method input_type + 111, // [111:111] is the sub-list for extension type_name + 111, // [111:111] is the sub-list for extension extendee + 0, // [0:111] is the sub-list for field type_name } func init() { file_penumbra_core_transaction_v1alpha1_transaction_proto_init() } @@ -3559,7 +3473,7 @@ func file_penumbra_core_transaction_v1alpha1_transaction_proto_init() { } } file_penumbra_core_transaction_v1alpha1_transaction_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Id); i { + switch v := v.(*TransactionBody); i { case 0: return &v.state case 1: @@ -3571,7 +3485,7 @@ func file_penumbra_core_transaction_v1alpha1_transaction_proto_init() { } } file_penumbra_core_transaction_v1alpha1_transaction_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TransactionBody); i { + switch v := v.(*TransactionParameters); i { case 0: return &v.state case 1: @@ -3583,7 +3497,7 @@ func file_penumbra_core_transaction_v1alpha1_transaction_proto_init() { } } file_penumbra_core_transaction_v1alpha1_transaction_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MemoData); i { + switch v := v.(*DetectionData); i { case 0: return &v.state case 1: @@ -3595,7 +3509,7 @@ func file_penumbra_core_transaction_v1alpha1_transaction_proto_init() { } } file_penumbra_core_transaction_v1alpha1_transaction_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TransactionParameters); i { + switch v := v.(*Action); i { case 0: return &v.state case 1: @@ -3607,7 +3521,7 @@ func file_penumbra_core_transaction_v1alpha1_transaction_proto_init() { } } file_penumbra_core_transaction_v1alpha1_transaction_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DetectionData); i { + switch v := v.(*TransactionPerspective); i { case 0: return &v.state case 1: @@ -3619,7 +3533,7 @@ func file_penumbra_core_transaction_v1alpha1_transaction_proto_init() { } } file_penumbra_core_transaction_v1alpha1_transaction_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Action); i { + switch v := v.(*PayloadKeyWithCommitment); i { case 0: return &v.state case 1: @@ -3631,7 +3545,7 @@ func file_penumbra_core_transaction_v1alpha1_transaction_proto_init() { } } file_penumbra_core_transaction_v1alpha1_transaction_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TransactionPerspective); i { + switch v := v.(*NullifierWithNote); i { case 0: return &v.state case 1: @@ -3643,7 +3557,7 @@ func file_penumbra_core_transaction_v1alpha1_transaction_proto_init() { } } file_penumbra_core_transaction_v1alpha1_transaction_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PayloadKeyWithCommitment); i { + switch v := v.(*TransactionView); i { case 0: return &v.state case 1: @@ -3655,7 +3569,7 @@ func file_penumbra_core_transaction_v1alpha1_transaction_proto_init() { } } file_penumbra_core_transaction_v1alpha1_transaction_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*NullifierWithNote); i { + switch v := v.(*TransactionBodyView); i { case 0: return &v.state case 1: @@ -3667,7 +3581,7 @@ func file_penumbra_core_transaction_v1alpha1_transaction_proto_init() { } } file_penumbra_core_transaction_v1alpha1_transaction_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TransactionView); i { + switch v := v.(*ActionView); i { case 0: return &v.state case 1: @@ -3679,7 +3593,7 @@ func file_penumbra_core_transaction_v1alpha1_transaction_proto_init() { } } file_penumbra_core_transaction_v1alpha1_transaction_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TransactionBodyView); i { + switch v := v.(*AuthorizationData); i { case 0: return &v.state case 1: @@ -3691,7 +3605,7 @@ func file_penumbra_core_transaction_v1alpha1_transaction_proto_init() { } } file_penumbra_core_transaction_v1alpha1_transaction_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ActionView); i { + switch v := v.(*WitnessData); i { case 0: return &v.state case 1: @@ -3703,7 +3617,7 @@ func file_penumbra_core_transaction_v1alpha1_transaction_proto_init() { } } file_penumbra_core_transaction_v1alpha1_transaction_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*EffectHash); i { + switch v := v.(*TransactionPlan); i { case 0: return &v.state case 1: @@ -3715,7 +3629,7 @@ func file_penumbra_core_transaction_v1alpha1_transaction_proto_init() { } } file_penumbra_core_transaction_v1alpha1_transaction_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AuthorizationData); i { + switch v := v.(*DetectionDataPlan); i { case 0: return &v.state case 1: @@ -3727,30 +3641,6 @@ func file_penumbra_core_transaction_v1alpha1_transaction_proto_init() { } } file_penumbra_core_transaction_v1alpha1_transaction_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*WitnessData); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_penumbra_core_transaction_v1alpha1_transaction_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TransactionPlan); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_penumbra_core_transaction_v1alpha1_transaction_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ActionPlan); i { case 0: return &v.state @@ -3762,7 +3652,7 @@ func file_penumbra_core_transaction_v1alpha1_transaction_proto_init() { return nil } } - file_penumbra_core_transaction_v1alpha1_transaction_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { + file_penumbra_core_transaction_v1alpha1_transaction_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CluePlan); i { case 0: return &v.state @@ -3774,7 +3664,7 @@ func file_penumbra_core_transaction_v1alpha1_transaction_proto_init() { return nil } } - file_penumbra_core_transaction_v1alpha1_transaction_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { + file_penumbra_core_transaction_v1alpha1_transaction_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*MemoPlan); i { case 0: return &v.state @@ -3786,7 +3676,7 @@ func file_penumbra_core_transaction_v1alpha1_transaction_proto_init() { return nil } } - file_penumbra_core_transaction_v1alpha1_transaction_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { + file_penumbra_core_transaction_v1alpha1_transaction_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*MemoCiphertext); i { case 0: return &v.state @@ -3798,7 +3688,7 @@ func file_penumbra_core_transaction_v1alpha1_transaction_proto_init() { return nil } } - file_penumbra_core_transaction_v1alpha1_transaction_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { + file_penumbra_core_transaction_v1alpha1_transaction_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*MemoPlaintext); i { case 0: return &v.state @@ -3810,7 +3700,7 @@ func file_penumbra_core_transaction_v1alpha1_transaction_proto_init() { return nil } } - file_penumbra_core_transaction_v1alpha1_transaction_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { + file_penumbra_core_transaction_v1alpha1_transaction_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*MemoPlaintextView); i { case 0: return &v.state @@ -3822,7 +3712,7 @@ func file_penumbra_core_transaction_v1alpha1_transaction_proto_init() { return nil } } - file_penumbra_core_transaction_v1alpha1_transaction_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { + file_penumbra_core_transaction_v1alpha1_transaction_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*MemoView); i { case 0: return &v.state @@ -3834,7 +3724,7 @@ func file_penumbra_core_transaction_v1alpha1_transaction_proto_init() { return nil } } - file_penumbra_core_transaction_v1alpha1_transaction_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { + file_penumbra_core_transaction_v1alpha1_transaction_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*MemoView_Visible); i { case 0: return &v.state @@ -3846,7 +3736,7 @@ func file_penumbra_core_transaction_v1alpha1_transaction_proto_init() { return nil } } - file_penumbra_core_transaction_v1alpha1_transaction_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { + file_penumbra_core_transaction_v1alpha1_transaction_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*MemoView_Opaque); i { case 0: return &v.state @@ -3859,7 +3749,7 @@ func file_penumbra_core_transaction_v1alpha1_transaction_proto_init() { } } } - file_penumbra_core_transaction_v1alpha1_transaction_proto_msgTypes[6].OneofWrappers = []interface{}{ + file_penumbra_core_transaction_v1alpha1_transaction_proto_msgTypes[4].OneofWrappers = []interface{}{ (*Action_Spend)(nil), (*Action_Output)(nil), (*Action_Swap)(nil), @@ -3878,12 +3768,12 @@ func file_penumbra_core_transaction_v1alpha1_transaction_proto_init() { (*Action_Delegate)(nil), (*Action_Undelegate)(nil), (*Action_UndelegateClaim)(nil), - (*Action_DaoSpend)(nil), - (*Action_DaoOutput)(nil), - (*Action_DaoDeposit)(nil), + (*Action_CommunityPoolSpend)(nil), + (*Action_CommunityPoolOutput)(nil), + (*Action_CommunityPoolDeposit)(nil), (*Action_Ics20Withdrawal)(nil), } - file_penumbra_core_transaction_v1alpha1_transaction_proto_msgTypes[12].OneofWrappers = []interface{}{ + file_penumbra_core_transaction_v1alpha1_transaction_proto_msgTypes[10].OneofWrappers = []interface{}{ (*ActionView_Spend)(nil), (*ActionView_Output)(nil), (*ActionView_Swap)(nil), @@ -3901,13 +3791,13 @@ func file_penumbra_core_transaction_v1alpha1_transaction_proto_init() { (*ActionView_PositionRewardClaim)(nil), (*ActionView_Delegate)(nil), (*ActionView_Undelegate)(nil), - (*ActionView_DaoSpend)(nil), - (*ActionView_DaoOutput)(nil), - (*ActionView_DaoDeposit)(nil), + (*ActionView_CommunityPoolSpend)(nil), + (*ActionView_CommunityPoolOutput)(nil), + (*ActionView_CommunityPoolDeposit)(nil), (*ActionView_UndelegateClaim)(nil), (*ActionView_Ics20Withdrawal)(nil), } - file_penumbra_core_transaction_v1alpha1_transaction_proto_msgTypes[17].OneofWrappers = []interface{}{ + file_penumbra_core_transaction_v1alpha1_transaction_proto_msgTypes[15].OneofWrappers = []interface{}{ (*ActionPlan_Spend)(nil), (*ActionPlan_Output)(nil), (*ActionPlan_Swap)(nil), @@ -3927,11 +3817,11 @@ func file_penumbra_core_transaction_v1alpha1_transaction_proto_init() { (*ActionPlan_Delegate)(nil), (*ActionPlan_Undelegate)(nil), (*ActionPlan_UndelegateClaim)(nil), - (*ActionPlan_DaoSpend)(nil), - (*ActionPlan_DaoOutput)(nil), - (*ActionPlan_DaoDeposit)(nil), + (*ActionPlan_CommunityPoolSpend)(nil), + (*ActionPlan_CommunityPoolOutput)(nil), + (*ActionPlan_CommunityPoolDeposit)(nil), } - file_penumbra_core_transaction_v1alpha1_transaction_proto_msgTypes[23].OneofWrappers = []interface{}{ + file_penumbra_core_transaction_v1alpha1_transaction_proto_msgTypes[21].OneofWrappers = []interface{}{ (*MemoView_Visible_)(nil), (*MemoView_Opaque_)(nil), } @@ -3941,7 +3831,7 @@ func file_penumbra_core_transaction_v1alpha1_transaction_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_penumbra_core_transaction_v1alpha1_transaction_proto_rawDesc, NumEnums: 0, - NumMessages: 26, + NumMessages: 24, NumExtensions: 0, NumServices: 0, }, diff --git a/proto/go/gen/penumbra/core/txhash/v1alpha1/txhash.pb.go b/proto/go/gen/penumbra/core/txhash/v1alpha1/txhash.pb.go new file mode 100644 index 0000000000..d63fea7c28 --- /dev/null +++ b/proto/go/gen/penumbra/core/txhash/v1alpha1/txhash.pb.go @@ -0,0 +1,230 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.32.0 +// protoc (unknown) +// source: penumbra/core/txhash/v1alpha1/txhash.proto + +package txhashv1alpha1 + +import ( + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +// The hash of a Penumbra transaction's _effecting data_, describing the effects +// of the transaction on the chain state. +type EffectHash struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Inner []byte `protobuf:"bytes,1,opt,name=inner,proto3" json:"inner,omitempty"` +} + +func (x *EffectHash) Reset() { + *x = EffectHash{} + if protoimpl.UnsafeEnabled { + mi := &file_penumbra_core_txhash_v1alpha1_txhash_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *EffectHash) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*EffectHash) ProtoMessage() {} + +func (x *EffectHash) ProtoReflect() protoreflect.Message { + mi := &file_penumbra_core_txhash_v1alpha1_txhash_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use EffectHash.ProtoReflect.Descriptor instead. +func (*EffectHash) Descriptor() ([]byte, []int) { + return file_penumbra_core_txhash_v1alpha1_txhash_proto_rawDescGZIP(), []int{0} +} + +func (x *EffectHash) GetInner() []byte { + if x != nil { + return x.Inner + } + return nil +} + +// A transaction ID, the Sha256 hash of a transaction. +// +// This is the hash of the plain byte encoding, used by Tendermint. +type TransactionId struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Inner []byte `protobuf:"bytes,1,opt,name=inner,proto3" json:"inner,omitempty"` +} + +func (x *TransactionId) Reset() { + *x = TransactionId{} + if protoimpl.UnsafeEnabled { + mi := &file_penumbra_core_txhash_v1alpha1_txhash_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *TransactionId) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TransactionId) ProtoMessage() {} + +func (x *TransactionId) ProtoReflect() protoreflect.Message { + mi := &file_penumbra_core_txhash_v1alpha1_txhash_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use TransactionId.ProtoReflect.Descriptor instead. +func (*TransactionId) Descriptor() ([]byte, []int) { + return file_penumbra_core_txhash_v1alpha1_txhash_proto_rawDescGZIP(), []int{1} +} + +func (x *TransactionId) GetInner() []byte { + if x != nil { + return x.Inner + } + return nil +} + +var File_penumbra_core_txhash_v1alpha1_txhash_proto protoreflect.FileDescriptor + +var file_penumbra_core_txhash_v1alpha1_txhash_proto_rawDesc = []byte{ + 0x0a, 0x2a, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, + 0x74, 0x78, 0x68, 0x61, 0x73, 0x68, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, + 0x74, 0x78, 0x68, 0x61, 0x73, 0x68, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x1d, 0x70, 0x65, + 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x78, 0x68, 0x61, + 0x73, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x22, 0x22, 0x0a, 0x0a, 0x45, + 0x66, 0x66, 0x65, 0x63, 0x74, 0x48, 0x61, 0x73, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x6e, + 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x22, + 0x25, 0x0a, 0x0d, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, + 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, + 0x05, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x42, 0xa4, 0x02, 0x0a, 0x21, 0x63, 0x6f, 0x6d, 0x2e, 0x70, + 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x78, 0x68, + 0x61, 0x73, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x42, 0x0b, 0x54, 0x78, + 0x68, 0x61, 0x73, 0x68, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x5b, 0x67, 0x69, 0x74, + 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, + 0x2d, 0x7a, 0x6f, 0x6e, 0x65, 0x2f, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2f, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x6f, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x70, 0x65, 0x6e, 0x75, + 0x6d, 0x62, 0x72, 0x61, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x74, 0x78, 0x68, 0x61, 0x73, 0x68, + 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x3b, 0x74, 0x78, 0x68, 0x61, 0x73, 0x68, + 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0xa2, 0x02, 0x03, 0x50, 0x43, 0x54, 0xaa, 0x02, + 0x1d, 0x50, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x43, 0x6f, 0x72, 0x65, 0x2e, 0x54, + 0x78, 0x68, 0x61, 0x73, 0x68, 0x2e, 0x56, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0xca, 0x02, + 0x1d, 0x50, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x5c, 0x43, 0x6f, 0x72, 0x65, 0x5c, 0x54, + 0x78, 0x68, 0x61, 0x73, 0x68, 0x5c, 0x56, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0xe2, 0x02, + 0x29, 0x50, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x5c, 0x43, 0x6f, 0x72, 0x65, 0x5c, 0x54, + 0x78, 0x68, 0x61, 0x73, 0x68, 0x5c, 0x56, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x5c, 0x47, + 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x20, 0x50, 0x65, 0x6e, + 0x75, 0x6d, 0x62, 0x72, 0x61, 0x3a, 0x3a, 0x43, 0x6f, 0x72, 0x65, 0x3a, 0x3a, 0x54, 0x78, 0x68, + 0x61, 0x73, 0x68, 0x3a, 0x3a, 0x56, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x62, 0x06, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_penumbra_core_txhash_v1alpha1_txhash_proto_rawDescOnce sync.Once + file_penumbra_core_txhash_v1alpha1_txhash_proto_rawDescData = file_penumbra_core_txhash_v1alpha1_txhash_proto_rawDesc +) + +func file_penumbra_core_txhash_v1alpha1_txhash_proto_rawDescGZIP() []byte { + file_penumbra_core_txhash_v1alpha1_txhash_proto_rawDescOnce.Do(func() { + file_penumbra_core_txhash_v1alpha1_txhash_proto_rawDescData = protoimpl.X.CompressGZIP(file_penumbra_core_txhash_v1alpha1_txhash_proto_rawDescData) + }) + return file_penumbra_core_txhash_v1alpha1_txhash_proto_rawDescData +} + +var file_penumbra_core_txhash_v1alpha1_txhash_proto_msgTypes = make([]protoimpl.MessageInfo, 2) +var file_penumbra_core_txhash_v1alpha1_txhash_proto_goTypes = []interface{}{ + (*EffectHash)(nil), // 0: penumbra.core.txhash.v1alpha1.EffectHash + (*TransactionId)(nil), // 1: penumbra.core.txhash.v1alpha1.TransactionId +} +var file_penumbra_core_txhash_v1alpha1_txhash_proto_depIdxs = []int32{ + 0, // [0:0] is the sub-list for method output_type + 0, // [0:0] is the sub-list for method input_type + 0, // [0:0] is the sub-list for extension type_name + 0, // [0:0] is the sub-list for extension extendee + 0, // [0:0] is the sub-list for field type_name +} + +func init() { file_penumbra_core_txhash_v1alpha1_txhash_proto_init() } +func file_penumbra_core_txhash_v1alpha1_txhash_proto_init() { + if File_penumbra_core_txhash_v1alpha1_txhash_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_penumbra_core_txhash_v1alpha1_txhash_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*EffectHash); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_penumbra_core_txhash_v1alpha1_txhash_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TransactionId); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_penumbra_core_txhash_v1alpha1_txhash_proto_rawDesc, + NumEnums: 0, + NumMessages: 2, + NumExtensions: 0, + NumServices: 0, + }, + GoTypes: file_penumbra_core_txhash_v1alpha1_txhash_proto_goTypes, + DependencyIndexes: file_penumbra_core_txhash_v1alpha1_txhash_proto_depIdxs, + MessageInfos: file_penumbra_core_txhash_v1alpha1_txhash_proto_msgTypes, + }.Build() + File_penumbra_core_txhash_v1alpha1_txhash_proto = out.File + file_penumbra_core_txhash_v1alpha1_txhash_proto_rawDesc = nil + file_penumbra_core_txhash_v1alpha1_txhash_proto_goTypes = nil + file_penumbra_core_txhash_v1alpha1_txhash_proto_depIdxs = nil +} diff --git a/proto/go/gen/penumbra/crypto/decaf377_fmd/v1alpha1/decaf377_fmd.pb.go b/proto/go/gen/penumbra/crypto/decaf377_fmd/v1alpha1/decaf377_fmd.pb.go index 38531f67f7..1be2be4dc7 100644 --- a/proto/go/gen/penumbra/crypto/decaf377_fmd/v1alpha1/decaf377_fmd.pb.go +++ b/proto/go/gen/penumbra/crypto/decaf377_fmd/v1alpha1/decaf377_fmd.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.31.0 +// protoc-gen-go v1.32.0 // protoc (unknown) // source: penumbra/crypto/decaf377_fmd/v1alpha1/decaf377_fmd.proto diff --git a/proto/go/gen/penumbra/crypto/decaf377_frost/v1alpha1/decaf377_frost.pb.go b/proto/go/gen/penumbra/crypto/decaf377_frost/v1alpha1/decaf377_frost.pb.go index 7fd91635ca..f85fc0d860 100644 --- a/proto/go/gen/penumbra/crypto/decaf377_frost/v1alpha1/decaf377_frost.pb.go +++ b/proto/go/gen/penumbra/crypto/decaf377_frost/v1alpha1/decaf377_frost.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.31.0 +// protoc-gen-go v1.32.0 // protoc (unknown) // source: penumbra/crypto/decaf377_frost/v1alpha1/decaf377_frost.proto diff --git a/proto/go/gen/penumbra/crypto/decaf377_rdsa/v1alpha1/decaf377_rdsa.pb.go b/proto/go/gen/penumbra/crypto/decaf377_rdsa/v1alpha1/decaf377_rdsa.pb.go index c4bb76d1f1..f783f8eba5 100644 --- a/proto/go/gen/penumbra/crypto/decaf377_rdsa/v1alpha1/decaf377_rdsa.pb.go +++ b/proto/go/gen/penumbra/crypto/decaf377_rdsa/v1alpha1/decaf377_rdsa.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.31.0 +// protoc-gen-go v1.32.0 // protoc (unknown) // source: penumbra/crypto/decaf377_rdsa/v1alpha1/decaf377_rdsa.proto @@ -114,6 +114,53 @@ func (x *BindingSignature) GetInner() []byte { return nil } +type SpendVerificationKey struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Inner []byte `protobuf:"bytes,1,opt,name=inner,proto3" json:"inner,omitempty"` +} + +func (x *SpendVerificationKey) Reset() { + *x = SpendVerificationKey{} + if protoimpl.UnsafeEnabled { + mi := &file_penumbra_crypto_decaf377_rdsa_v1alpha1_decaf377_rdsa_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SpendVerificationKey) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SpendVerificationKey) ProtoMessage() {} + +func (x *SpendVerificationKey) ProtoReflect() protoreflect.Message { + mi := &file_penumbra_crypto_decaf377_rdsa_v1alpha1_decaf377_rdsa_proto_msgTypes[2] + 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 SpendVerificationKey.ProtoReflect.Descriptor instead. +func (*SpendVerificationKey) Descriptor() ([]byte, []int) { + return file_penumbra_crypto_decaf377_rdsa_v1alpha1_decaf377_rdsa_proto_rawDescGZIP(), []int{2} +} + +func (x *SpendVerificationKey) GetInner() []byte { + if x != nil { + return x.Inner + } + return nil +} + var File_penumbra_crypto_decaf377_rdsa_v1alpha1_decaf377_rdsa_proto protoreflect.FileDescriptor var file_penumbra_crypto_decaf377_rdsa_v1alpha1_decaf377_rdsa_proto_rawDesc = []byte{ @@ -128,30 +175,33 @@ var file_penumbra_crypto_decaf377_rdsa_v1alpha1_decaf377_rdsa_proto_rawDesc = [] 0x6e, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x22, 0x28, 0x0a, 0x10, 0x42, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0c, 0x52, 0x05, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x42, 0xe3, 0x02, 0x0a, 0x2a, 0x63, - 0x6f, 0x6d, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x72, 0x79, 0x70, - 0x74, 0x6f, 0x2e, 0x64, 0x65, 0x63, 0x61, 0x66, 0x33, 0x37, 0x37, 0x5f, 0x72, 0x64, 0x73, 0x61, - 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x42, 0x11, 0x44, 0x65, 0x63, 0x61, 0x66, - 0x33, 0x37, 0x37, 0x52, 0x64, 0x73, 0x61, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x6b, - 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x65, 0x6e, 0x75, 0x6d, - 0x62, 0x72, 0x61, 0x2d, 0x7a, 0x6f, 0x6e, 0x65, 0x2f, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, - 0x61, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x6f, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x70, - 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2f, 0x63, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x2f, 0x64, - 0x65, 0x63, 0x61, 0x66, 0x33, 0x37, 0x37, 0x5f, 0x72, 0x64, 0x73, 0x61, 0x2f, 0x76, 0x31, 0x61, - 0x6c, 0x70, 0x68, 0x61, 0x31, 0x3b, 0x64, 0x65, 0x63, 0x61, 0x66, 0x33, 0x37, 0x37, 0x5f, 0x72, - 0x64, 0x73, 0x61, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0xa2, 0x02, 0x03, 0x50, 0x43, - 0x44, 0xaa, 0x02, 0x25, 0x50, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x43, 0x72, 0x79, - 0x70, 0x74, 0x6f, 0x2e, 0x44, 0x65, 0x63, 0x61, 0x66, 0x33, 0x37, 0x37, 0x52, 0x64, 0x73, 0x61, - 0x2e, 0x56, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0xca, 0x02, 0x25, 0x50, 0x65, 0x6e, 0x75, - 0x6d, 0x62, 0x72, 0x61, 0x5c, 0x43, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x5c, 0x44, 0x65, 0x63, 0x61, - 0x66, 0x33, 0x37, 0x37, 0x52, 0x64, 0x73, 0x61, 0x5c, 0x56, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, - 0x31, 0xe2, 0x02, 0x31, 0x50, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x5c, 0x43, 0x72, 0x79, - 0x70, 0x74, 0x6f, 0x5c, 0x44, 0x65, 0x63, 0x61, 0x66, 0x33, 0x37, 0x37, 0x52, 0x64, 0x73, 0x61, - 0x5c, 0x56, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, - 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x28, 0x50, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, - 0x3a, 0x3a, 0x43, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x3a, 0x3a, 0x44, 0x65, 0x63, 0x61, 0x66, 0x33, - 0x37, 0x37, 0x52, 0x64, 0x73, 0x61, 0x3a, 0x3a, 0x56, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, - 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x01, 0x28, 0x0c, 0x52, 0x05, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x22, 0x2c, 0x0a, 0x14, 0x53, 0x70, + 0x65, 0x6e, 0x64, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4b, + 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0c, 0x52, 0x05, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x42, 0xe3, 0x02, 0x0a, 0x2a, 0x63, 0x6f, 0x6d, + 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x6f, + 0x2e, 0x64, 0x65, 0x63, 0x61, 0x66, 0x33, 0x37, 0x37, 0x5f, 0x72, 0x64, 0x73, 0x61, 0x2e, 0x76, + 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x42, 0x11, 0x44, 0x65, 0x63, 0x61, 0x66, 0x33, 0x37, + 0x37, 0x52, 0x64, 0x73, 0x61, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x6b, 0x67, 0x69, + 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, + 0x61, 0x2d, 0x7a, 0x6f, 0x6e, 0x65, 0x2f, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2f, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x6f, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x70, 0x65, 0x6e, + 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2f, 0x63, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x2f, 0x64, 0x65, 0x63, + 0x61, 0x66, 0x33, 0x37, 0x37, 0x5f, 0x72, 0x64, 0x73, 0x61, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, + 0x68, 0x61, 0x31, 0x3b, 0x64, 0x65, 0x63, 0x61, 0x66, 0x33, 0x37, 0x37, 0x5f, 0x72, 0x64, 0x73, + 0x61, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0xa2, 0x02, 0x03, 0x50, 0x43, 0x44, 0xaa, + 0x02, 0x25, 0x50, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x43, 0x72, 0x79, 0x70, 0x74, + 0x6f, 0x2e, 0x44, 0x65, 0x63, 0x61, 0x66, 0x33, 0x37, 0x37, 0x52, 0x64, 0x73, 0x61, 0x2e, 0x56, + 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0xca, 0x02, 0x25, 0x50, 0x65, 0x6e, 0x75, 0x6d, 0x62, + 0x72, 0x61, 0x5c, 0x43, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x5c, 0x44, 0x65, 0x63, 0x61, 0x66, 0x33, + 0x37, 0x37, 0x52, 0x64, 0x73, 0x61, 0x5c, 0x56, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0xe2, + 0x02, 0x31, 0x50, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x5c, 0x43, 0x72, 0x79, 0x70, 0x74, + 0x6f, 0x5c, 0x44, 0x65, 0x63, 0x61, 0x66, 0x33, 0x37, 0x37, 0x52, 0x64, 0x73, 0x61, 0x5c, 0x56, + 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, + 0x61, 0x74, 0x61, 0xea, 0x02, 0x28, 0x50, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x3a, 0x3a, + 0x43, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x3a, 0x3a, 0x44, 0x65, 0x63, 0x61, 0x66, 0x33, 0x37, 0x37, + 0x52, 0x64, 0x73, 0x61, 0x3a, 0x3a, 0x56, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x62, 0x06, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -166,10 +216,11 @@ func file_penumbra_crypto_decaf377_rdsa_v1alpha1_decaf377_rdsa_proto_rawDescGZIP return file_penumbra_crypto_decaf377_rdsa_v1alpha1_decaf377_rdsa_proto_rawDescData } -var file_penumbra_crypto_decaf377_rdsa_v1alpha1_decaf377_rdsa_proto_msgTypes = make([]protoimpl.MessageInfo, 2) +var file_penumbra_crypto_decaf377_rdsa_v1alpha1_decaf377_rdsa_proto_msgTypes = make([]protoimpl.MessageInfo, 3) var file_penumbra_crypto_decaf377_rdsa_v1alpha1_decaf377_rdsa_proto_goTypes = []interface{}{ - (*SpendAuthSignature)(nil), // 0: penumbra.crypto.decaf377_rdsa.v1alpha1.SpendAuthSignature - (*BindingSignature)(nil), // 1: penumbra.crypto.decaf377_rdsa.v1alpha1.BindingSignature + (*SpendAuthSignature)(nil), // 0: penumbra.crypto.decaf377_rdsa.v1alpha1.SpendAuthSignature + (*BindingSignature)(nil), // 1: penumbra.crypto.decaf377_rdsa.v1alpha1.BindingSignature + (*SpendVerificationKey)(nil), // 2: penumbra.crypto.decaf377_rdsa.v1alpha1.SpendVerificationKey } var file_penumbra_crypto_decaf377_rdsa_v1alpha1_decaf377_rdsa_proto_depIdxs = []int32{ 0, // [0:0] is the sub-list for method output_type @@ -209,6 +260,18 @@ func file_penumbra_crypto_decaf377_rdsa_v1alpha1_decaf377_rdsa_proto_init() { return nil } } + file_penumbra_crypto_decaf377_rdsa_v1alpha1_decaf377_rdsa_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SpendVerificationKey); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } } type x struct{} out := protoimpl.TypeBuilder{ @@ -216,7 +279,7 @@ func file_penumbra_crypto_decaf377_rdsa_v1alpha1_decaf377_rdsa_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_penumbra_crypto_decaf377_rdsa_v1alpha1_decaf377_rdsa_proto_rawDesc, NumEnums: 0, - NumMessages: 2, + NumMessages: 3, NumExtensions: 0, NumServices: 0, }, diff --git a/proto/go/gen/penumbra/crypto/tct/v1alpha1/tct.pb.go b/proto/go/gen/penumbra/crypto/tct/v1alpha1/tct.pb.go index 6f9654a172..99f0b24784 100644 --- a/proto/go/gen/penumbra/crypto/tct/v1alpha1/tct.pb.go +++ b/proto/go/gen/penumbra/crypto/tct/v1alpha1/tct.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.31.0 +// protoc-gen-go v1.32.0 // protoc (unknown) // source: penumbra/crypto/tct/v1alpha1/tct.proto diff --git a/proto/go/gen/penumbra/custody/threshold/v1alpha1/threshold.pb.go b/proto/go/gen/penumbra/custody/threshold/v1alpha1/threshold.pb.go index f232d28662..3a1cf1bf33 100644 --- a/proto/go/gen/penumbra/custody/threshold/v1alpha1/threshold.pb.go +++ b/proto/go/gen/penumbra/custody/threshold/v1alpha1/threshold.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.31.0 +// protoc-gen-go v1.32.0 // protoc (unknown) // source: penumbra/custody/threshold/v1alpha1/threshold.proto diff --git a/proto/go/gen/penumbra/custody/v1alpha1/custody.pb.go b/proto/go/gen/penumbra/custody/v1alpha1/custody.pb.go index 7f265f2924..c76f5eb911 100644 --- a/proto/go/gen/penumbra/custody/v1alpha1/custody.pb.go +++ b/proto/go/gen/penumbra/custody/v1alpha1/custody.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.31.0 +// protoc-gen-go v1.32.0 // protoc (unknown) // source: penumbra/custody/v1alpha1/custody.proto diff --git a/proto/go/gen/penumbra/tools/summoning/v1alpha1/summoning.pb.go b/proto/go/gen/penumbra/tools/summoning/v1alpha1/summoning.pb.go index fcb9d95636..34766389ad 100644 --- a/proto/go/gen/penumbra/tools/summoning/v1alpha1/summoning.pb.go +++ b/proto/go/gen/penumbra/tools/summoning/v1alpha1/summoning.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.31.0 +// protoc-gen-go v1.32.0 // protoc (unknown) // source: penumbra/tools/summoning/v1alpha1/summoning.proto diff --git a/proto/go/gen/penumbra/util/tendermint_proxy/v1alpha1/tendermint_proxy.pb.go b/proto/go/gen/penumbra/util/tendermint_proxy/v1alpha1/tendermint_proxy.pb.go index 926f710aa1..09dcc4bdc9 100644 --- a/proto/go/gen/penumbra/util/tendermint_proxy/v1alpha1/tendermint_proxy.pb.go +++ b/proto/go/gen/penumbra/util/tendermint_proxy/v1alpha1/tendermint_proxy.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.31.0 +// protoc-gen-go v1.32.0 // protoc (unknown) // source: penumbra/util/tendermint_proxy/v1alpha1/tendermint_proxy.proto diff --git a/proto/go/gen/penumbra/view/v1alpha1/view.pb.go b/proto/go/gen/penumbra/view/v1alpha1/view.pb.go index ccbf528888..996bb97671 100644 --- a/proto/go/gen/penumbra/view/v1alpha1/view.pb.go +++ b/proto/go/gen/penumbra/view/v1alpha1/view.pb.go @@ -1,25 +1,26 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.31.0 +// protoc-gen-go v1.32.0 // protoc (unknown) // source: penumbra/view/v1alpha1/view.proto package viewv1alpha1 import ( - v1alpha17 "github.com/penumbra-zone/penumbra/proto/go/gen/penumbra/core/app/v1alpha1" - v1alpha14 "github.com/penumbra-zone/penumbra/proto/go/gen/penumbra/core/asset/v1alpha1" - v1alpha18 "github.com/penumbra-zone/penumbra/proto/go/gen/penumbra/core/component/chain/v1alpha1" - v1alpha111 "github.com/penumbra-zone/penumbra/proto/go/gen/penumbra/core/component/dex/v1alpha1" - v1alpha11 "github.com/penumbra-zone/penumbra/proto/go/gen/penumbra/core/component/fee/v1alpha1" - v1alpha13 "github.com/penumbra-zone/penumbra/proto/go/gen/penumbra/core/component/ibc/v1alpha1" - v1alpha19 "github.com/penumbra-zone/penumbra/proto/go/gen/penumbra/core/component/sct/v1alpha1" - v1alpha110 "github.com/penumbra-zone/penumbra/proto/go/gen/penumbra/core/component/shielded_pool/v1alpha1" - v1alpha112 "github.com/penumbra-zone/penumbra/proto/go/gen/penumbra/core/component/stake/v1alpha1" - v1alpha12 "github.com/penumbra-zone/penumbra/proto/go/gen/penumbra/core/keys/v1alpha1" - v1alpha15 "github.com/penumbra-zone/penumbra/proto/go/gen/penumbra/core/num/v1alpha1" + v1alpha18 "github.com/penumbra-zone/penumbra/proto/go/gen/penumbra/core/app/v1alpha1" + v1alpha15 "github.com/penumbra-zone/penumbra/proto/go/gen/penumbra/core/asset/v1alpha1" + v1alpha19 "github.com/penumbra-zone/penumbra/proto/go/gen/penumbra/core/component/chain/v1alpha1" + v1alpha112 "github.com/penumbra-zone/penumbra/proto/go/gen/penumbra/core/component/dex/v1alpha1" + v1alpha12 "github.com/penumbra-zone/penumbra/proto/go/gen/penumbra/core/component/fee/v1alpha1" + v1alpha14 "github.com/penumbra-zone/penumbra/proto/go/gen/penumbra/core/component/ibc/v1alpha1" + v1alpha110 "github.com/penumbra-zone/penumbra/proto/go/gen/penumbra/core/component/sct/v1alpha1" + v1alpha111 "github.com/penumbra-zone/penumbra/proto/go/gen/penumbra/core/component/shielded_pool/v1alpha1" + v1alpha113 "github.com/penumbra-zone/penumbra/proto/go/gen/penumbra/core/component/stake/v1alpha1" + v1alpha13 "github.com/penumbra-zone/penumbra/proto/go/gen/penumbra/core/keys/v1alpha1" + v1alpha16 "github.com/penumbra-zone/penumbra/proto/go/gen/penumbra/core/num/v1alpha1" v1alpha1 "github.com/penumbra-zone/penumbra/proto/go/gen/penumbra/core/transaction/v1alpha1" - v1alpha16 "github.com/penumbra-zone/penumbra/proto/go/gen/penumbra/crypto/tct/v1alpha1" + v1alpha11 "github.com/penumbra-zone/penumbra/proto/go/gen/penumbra/core/txhash/v1alpha1" + v1alpha17 "github.com/penumbra-zone/penumbra/proto/go/gen/penumbra/crypto/tct/v1alpha1" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" reflect "reflect" @@ -201,7 +202,7 @@ type BroadcastTransactionResponse struct { unknownFields protoimpl.UnknownFields // The hash of the transaction that was broadcast. - Id *v1alpha1.Id `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + Id *v1alpha11.TransactionId `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` // The height in which the transaction was detected as included in the chain, if any. // Will not be included unless await_detection was true. DetectionHeight uint64 `protobuf:"varint,2,opt,name=detection_height,json=detectionHeight,proto3" json:"detection_height,omitempty"` @@ -239,7 +240,7 @@ func (*BroadcastTransactionResponse) Descriptor() ([]byte, []int) { return file_penumbra_view_v1alpha1_view_proto_rawDescGZIP(), []int{3} } -func (x *BroadcastTransactionResponse) GetId() *v1alpha1.Id { +func (x *BroadcastTransactionResponse) GetId() *v1alpha11.TransactionId { if x != nil { return x.Id } @@ -261,22 +262,20 @@ type TransactionPlannerRequest struct { // The expiry height for the requested TransactionPlan ExpiryHeight uint64 `protobuf:"varint,1,opt,name=expiry_height,json=expiryHeight,proto3" json:"expiry_height,omitempty"` // The fee for the requested TransactionPlan, if any. - Fee *v1alpha11.Fee `protobuf:"bytes,2,opt,name=fee,proto3" json:"fee,omitempty"` + Fee *v1alpha12.Fee `protobuf:"bytes,2,opt,name=fee,proto3" json:"fee,omitempty"` // The memo for the requested TransactionPlan. // The memo must be unspecified unless `outputs` is nonempty. Memo *v1alpha1.MemoPlaintext `protobuf:"bytes,3,opt,name=memo,proto3" json:"memo,omitempty"` // If present, only spends funds from the given account. - Source *v1alpha12.AddressIndex `protobuf:"bytes,4,opt,name=source,proto3" json:"source,omitempty"` - // Optionally identifies the wallet id to query. - WalletId *v1alpha12.WalletId `protobuf:"bytes,14,opt,name=wallet_id,json=walletId,proto3" json:"wallet_id,omitempty"` + Source *v1alpha13.AddressIndex `protobuf:"bytes,4,opt,name=source,proto3" json:"source,omitempty"` // Request contents Outputs []*TransactionPlannerRequest_Output `protobuf:"bytes,20,rep,name=outputs,proto3" json:"outputs,omitempty"` Swaps []*TransactionPlannerRequest_Swap `protobuf:"bytes,30,rep,name=swaps,proto3" json:"swaps,omitempty"` SwapClaims []*TransactionPlannerRequest_SwapClaim `protobuf:"bytes,31,rep,name=swap_claims,json=swapClaims,proto3" json:"swap_claims,omitempty"` Delegations []*TransactionPlannerRequest_Delegate `protobuf:"bytes,40,rep,name=delegations,proto3" json:"delegations,omitempty"` Undelegations []*TransactionPlannerRequest_Undelegate `protobuf:"bytes,50,rep,name=undelegations,proto3" json:"undelegations,omitempty"` - IbcRelayActions []*v1alpha13.IbcRelay `protobuf:"bytes,60,rep,name=ibc_relay_actions,json=ibcRelayActions,proto3" json:"ibc_relay_actions,omitempty"` - Ics20Withdrawals []*v1alpha13.Ics20Withdrawal `protobuf:"bytes,61,rep,name=ics20_withdrawals,json=ics20Withdrawals,proto3" json:"ics20_withdrawals,omitempty"` + IbcRelayActions []*v1alpha14.IbcRelay `protobuf:"bytes,60,rep,name=ibc_relay_actions,json=ibcRelayActions,proto3" json:"ibc_relay_actions,omitempty"` + Ics20Withdrawals []*v1alpha14.Ics20Withdrawal `protobuf:"bytes,61,rep,name=ics20_withdrawals,json=ics20Withdrawals,proto3" json:"ics20_withdrawals,omitempty"` PositionOpens []*TransactionPlannerRequest_PositionOpen `protobuf:"bytes,70,rep,name=position_opens,json=positionOpens,proto3" json:"position_opens,omitempty"` PositionCloses []*TransactionPlannerRequest_PositionClose `protobuf:"bytes,71,rep,name=position_closes,json=positionCloses,proto3" json:"position_closes,omitempty"` PositionWithdraws []*TransactionPlannerRequest_PositionWithdraw `protobuf:"bytes,72,rep,name=position_withdraws,json=positionWithdraws,proto3" json:"position_withdraws,omitempty"` @@ -321,7 +320,7 @@ func (x *TransactionPlannerRequest) GetExpiryHeight() uint64 { return 0 } -func (x *TransactionPlannerRequest) GetFee() *v1alpha11.Fee { +func (x *TransactionPlannerRequest) GetFee() *v1alpha12.Fee { if x != nil { return x.Fee } @@ -335,20 +334,13 @@ func (x *TransactionPlannerRequest) GetMemo() *v1alpha1.MemoPlaintext { return nil } -func (x *TransactionPlannerRequest) GetSource() *v1alpha12.AddressIndex { +func (x *TransactionPlannerRequest) GetSource() *v1alpha13.AddressIndex { if x != nil { return x.Source } return nil } -func (x *TransactionPlannerRequest) GetWalletId() *v1alpha12.WalletId { - if x != nil { - return x.WalletId - } - return nil -} - func (x *TransactionPlannerRequest) GetOutputs() []*TransactionPlannerRequest_Output { if x != nil { return x.Outputs @@ -384,14 +376,14 @@ func (x *TransactionPlannerRequest) GetUndelegations() []*TransactionPlannerRequ return nil } -func (x *TransactionPlannerRequest) GetIbcRelayActions() []*v1alpha13.IbcRelay { +func (x *TransactionPlannerRequest) GetIbcRelayActions() []*v1alpha14.IbcRelay { if x != nil { return x.IbcRelayActions } return nil } -func (x *TransactionPlannerRequest) GetIcs20Withdrawals() []*v1alpha13.Ics20Withdrawal { +func (x *TransactionPlannerRequest) GetIcs20Withdrawals() []*v1alpha14.Ics20Withdrawal { if x != nil { return x.Ics20Withdrawals } @@ -471,7 +463,7 @@ type AddressByIndexRequest struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - AddressIndex *v1alpha12.AddressIndex `protobuf:"bytes,1,opt,name=address_index,json=addressIndex,proto3" json:"address_index,omitempty"` + AddressIndex *v1alpha13.AddressIndex `protobuf:"bytes,1,opt,name=address_index,json=addressIndex,proto3" json:"address_index,omitempty"` } func (x *AddressByIndexRequest) Reset() { @@ -506,7 +498,7 @@ func (*AddressByIndexRequest) Descriptor() ([]byte, []int) { return file_penumbra_view_v1alpha1_view_proto_rawDescGZIP(), []int{6} } -func (x *AddressByIndexRequest) GetAddressIndex() *v1alpha12.AddressIndex { +func (x *AddressByIndexRequest) GetAddressIndex() *v1alpha13.AddressIndex { if x != nil { return x.AddressIndex } @@ -518,7 +510,7 @@ type AddressByIndexResponse struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Address *v1alpha12.Address `protobuf:"bytes,1,opt,name=address,proto3" json:"address,omitempty"` + Address *v1alpha13.Address `protobuf:"bytes,1,opt,name=address,proto3" json:"address,omitempty"` } func (x *AddressByIndexResponse) Reset() { @@ -553,7 +545,7 @@ func (*AddressByIndexResponse) Descriptor() ([]byte, []int) { return file_penumbra_view_v1alpha1_view_proto_rawDescGZIP(), []int{7} } -func (x *AddressByIndexResponse) GetAddress() *v1alpha12.Address { +func (x *AddressByIndexResponse) GetAddress() *v1alpha13.Address { if x != nil { return x.Address } @@ -603,7 +595,7 @@ type WalletIdResponse struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - WalletId *v1alpha12.WalletId `protobuf:"bytes,1,opt,name=wallet_id,json=walletId,proto3" json:"wallet_id,omitempty"` + WalletId *v1alpha13.WalletId `protobuf:"bytes,1,opt,name=wallet_id,json=walletId,proto3" json:"wallet_id,omitempty"` } func (x *WalletIdResponse) Reset() { @@ -638,7 +630,7 @@ func (*WalletIdResponse) Descriptor() ([]byte, []int) { return file_penumbra_view_v1alpha1_view_proto_rawDescGZIP(), []int{9} } -func (x *WalletIdResponse) GetWalletId() *v1alpha12.WalletId { +func (x *WalletIdResponse) GetWalletId() *v1alpha13.WalletId { if x != nil { return x.WalletId } @@ -650,7 +642,7 @@ type IndexByAddressRequest struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Address *v1alpha12.Address `protobuf:"bytes,1,opt,name=address,proto3" json:"address,omitempty"` + Address *v1alpha13.Address `protobuf:"bytes,1,opt,name=address,proto3" json:"address,omitempty"` } func (x *IndexByAddressRequest) Reset() { @@ -685,7 +677,7 @@ func (*IndexByAddressRequest) Descriptor() ([]byte, []int) { return file_penumbra_view_v1alpha1_view_proto_rawDescGZIP(), []int{10} } -func (x *IndexByAddressRequest) GetAddress() *v1alpha12.Address { +func (x *IndexByAddressRequest) GetAddress() *v1alpha13.Address { if x != nil { return x.Address } @@ -698,7 +690,7 @@ type IndexByAddressResponse struct { unknownFields protoimpl.UnknownFields // Will be absent if given an address not viewable by this viewing service - AddressIndex *v1alpha12.AddressIndex `protobuf:"bytes,1,opt,name=address_index,json=addressIndex,proto3" json:"address_index,omitempty"` + AddressIndex *v1alpha13.AddressIndex `protobuf:"bytes,1,opt,name=address_index,json=addressIndex,proto3" json:"address_index,omitempty"` } func (x *IndexByAddressResponse) Reset() { @@ -733,7 +725,7 @@ func (*IndexByAddressResponse) Descriptor() ([]byte, []int) { return file_penumbra_view_v1alpha1_view_proto_rawDescGZIP(), []int{11} } -func (x *IndexByAddressResponse) GetAddressIndex() *v1alpha12.AddressIndex { +func (x *IndexByAddressResponse) GetAddressIndex() *v1alpha13.AddressIndex { if x != nil { return x.AddressIndex } @@ -745,7 +737,7 @@ type EphemeralAddressRequest struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - AddressIndex *v1alpha12.AddressIndex `protobuf:"bytes,1,opt,name=address_index,json=addressIndex,proto3" json:"address_index,omitempty"` + AddressIndex *v1alpha13.AddressIndex `protobuf:"bytes,1,opt,name=address_index,json=addressIndex,proto3" json:"address_index,omitempty"` DisplayConfirm bool `protobuf:"varint,2,opt,name=display_confirm,json=displayConfirm,proto3" json:"display_confirm,omitempty"` } @@ -781,7 +773,7 @@ func (*EphemeralAddressRequest) Descriptor() ([]byte, []int) { return file_penumbra_view_v1alpha1_view_proto_rawDescGZIP(), []int{12} } -func (x *EphemeralAddressRequest) GetAddressIndex() *v1alpha12.AddressIndex { +func (x *EphemeralAddressRequest) GetAddressIndex() *v1alpha13.AddressIndex { if x != nil { return x.AddressIndex } @@ -800,7 +792,7 @@ type EphemeralAddressResponse struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Address *v1alpha12.Address `protobuf:"bytes,1,opt,name=address,proto3" json:"address,omitempty"` + Address *v1alpha13.Address `protobuf:"bytes,1,opt,name=address,proto3" json:"address,omitempty"` } func (x *EphemeralAddressResponse) Reset() { @@ -835,7 +827,7 @@ func (*EphemeralAddressResponse) Descriptor() ([]byte, []int) { return file_penumbra_view_v1alpha1_view_proto_rawDescGZIP(), []int{13} } -func (x *EphemeralAddressResponse) GetAddress() *v1alpha12.Address { +func (x *EphemeralAddressResponse) GetAddress() *v1alpha13.Address { if x != nil { return x.Address } @@ -848,9 +840,9 @@ type BalancesRequest struct { unknownFields protoimpl.UnknownFields // If present, filter balances to only include the account specified by the `AddressIndex`. - AccountFilter *v1alpha12.AddressIndex `protobuf:"bytes,1,opt,name=account_filter,json=accountFilter,proto3" json:"account_filter,omitempty"` + AccountFilter *v1alpha13.AddressIndex `protobuf:"bytes,1,opt,name=account_filter,json=accountFilter,proto3" json:"account_filter,omitempty"` // If present, filter balances to only include the specified asset ID. - AssetIdFilter *v1alpha14.AssetId `protobuf:"bytes,2,opt,name=asset_id_filter,json=assetIdFilter,proto3" json:"asset_id_filter,omitempty"` + AssetIdFilter *v1alpha15.AssetId `protobuf:"bytes,2,opt,name=asset_id_filter,json=assetIdFilter,proto3" json:"asset_id_filter,omitempty"` } func (x *BalancesRequest) Reset() { @@ -885,14 +877,14 @@ func (*BalancesRequest) Descriptor() ([]byte, []int) { return file_penumbra_view_v1alpha1_view_proto_rawDescGZIP(), []int{14} } -func (x *BalancesRequest) GetAccountFilter() *v1alpha12.AddressIndex { +func (x *BalancesRequest) GetAccountFilter() *v1alpha13.AddressIndex { if x != nil { return x.AccountFilter } return nil } -func (x *BalancesRequest) GetAssetIdFilter() *v1alpha14.AssetId { +func (x *BalancesRequest) GetAssetIdFilter() *v1alpha15.AssetId { if x != nil { return x.AssetIdFilter } @@ -904,8 +896,8 @@ type BalancesResponse struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Account *v1alpha12.AddressIndex `protobuf:"bytes,1,opt,name=account,proto3" json:"account,omitempty"` - Balance *v1alpha14.Value `protobuf:"bytes,2,opt,name=balance,proto3" json:"balance,omitempty"` + Account *v1alpha13.AddressIndex `protobuf:"bytes,1,opt,name=account,proto3" json:"account,omitempty"` + Balance *v1alpha15.Value `protobuf:"bytes,2,opt,name=balance,proto3" json:"balance,omitempty"` } func (x *BalancesResponse) Reset() { @@ -940,176 +932,31 @@ func (*BalancesResponse) Descriptor() ([]byte, []int) { return file_penumbra_view_v1alpha1_view_proto_rawDescGZIP(), []int{15} } -func (x *BalancesResponse) GetAccount() *v1alpha12.AddressIndex { +func (x *BalancesResponse) GetAccount() *v1alpha13.AddressIndex { if x != nil { return x.Account } return nil } -func (x *BalancesResponse) GetBalance() *v1alpha14.Value { +func (x *BalancesResponse) GetBalance() *v1alpha15.Value { if x != nil { return x.Balance } return nil } -// Scaffolding for bearer-token authentication for the ViewService. -type ViewAuthToken struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Inner []byte `protobuf:"bytes,1,opt,name=inner,proto3" json:"inner,omitempty"` -} - -func (x *ViewAuthToken) Reset() { - *x = ViewAuthToken{} - if protoimpl.UnsafeEnabled { - mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[16] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *ViewAuthToken) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ViewAuthToken) ProtoMessage() {} - -func (x *ViewAuthToken) ProtoReflect() protoreflect.Message { - mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[16] - 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 ViewAuthToken.ProtoReflect.Descriptor instead. -func (*ViewAuthToken) Descriptor() ([]byte, []int) { - return file_penumbra_view_v1alpha1_view_proto_rawDescGZIP(), []int{16} -} - -func (x *ViewAuthToken) GetInner() []byte { - if x != nil { - return x.Inner - } - return nil -} - -type ViewAuthRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Fvk *v1alpha12.FullViewingKey `protobuf:"bytes,1,opt,name=fvk,proto3" json:"fvk,omitempty"` -} - -func (x *ViewAuthRequest) Reset() { - *x = ViewAuthRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[17] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *ViewAuthRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ViewAuthRequest) ProtoMessage() {} - -func (x *ViewAuthRequest) ProtoReflect() protoreflect.Message { - mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[17] - 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 ViewAuthRequest.ProtoReflect.Descriptor instead. -func (*ViewAuthRequest) Descriptor() ([]byte, []int) { - return file_penumbra_view_v1alpha1_view_proto_rawDescGZIP(), []int{17} -} - -func (x *ViewAuthRequest) GetFvk() *v1alpha12.FullViewingKey { - if x != nil { - return x.Fvk - } - return nil -} - -type ViewAuthResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Token *ViewAuthToken `protobuf:"bytes,1,opt,name=token,proto3" json:"token,omitempty"` -} - -func (x *ViewAuthResponse) Reset() { - *x = ViewAuthResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[18] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *ViewAuthResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ViewAuthResponse) ProtoMessage() {} - -func (x *ViewAuthResponse) ProtoReflect() protoreflect.Message { - mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[18] - 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 ViewAuthResponse.ProtoReflect.Descriptor instead. -func (*ViewAuthResponse) Descriptor() ([]byte, []int) { - return file_penumbra_view_v1alpha1_view_proto_rawDescGZIP(), []int{18} -} - -func (x *ViewAuthResponse) GetToken() *ViewAuthToken { - if x != nil { - return x.Token - } - return nil -} - // Requests sync status of the view service. type StatusRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - - // Identifies the wallet id to query. - WalletId *v1alpha12.WalletId `protobuf:"bytes,14,opt,name=wallet_id,json=walletId,proto3" json:"wallet_id,omitempty"` } func (x *StatusRequest) Reset() { *x = StatusRequest{} if protoimpl.UnsafeEnabled { - mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[19] + mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[16] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1122,7 +969,7 @@ func (x *StatusRequest) String() string { func (*StatusRequest) ProtoMessage() {} func (x *StatusRequest) ProtoReflect() protoreflect.Message { - mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[19] + mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[16] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1135,14 +982,7 @@ func (x *StatusRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use StatusRequest.ProtoReflect.Descriptor instead. func (*StatusRequest) Descriptor() ([]byte, []int) { - return file_penumbra_view_v1alpha1_view_proto_rawDescGZIP(), []int{19} -} - -func (x *StatusRequest) GetWalletId() *v1alpha12.WalletId { - if x != nil { - return x.WalletId - } - return nil + return file_penumbra_view_v1alpha1_view_proto_rawDescGZIP(), []int{16} } // Returns the status of the view service and whether it is synchronized with the chain state. @@ -1162,7 +1002,7 @@ type StatusResponse struct { func (x *StatusResponse) Reset() { *x = StatusResponse{} if protoimpl.UnsafeEnabled { - mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[20] + mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[17] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1175,7 +1015,7 @@ func (x *StatusResponse) String() string { func (*StatusResponse) ProtoMessage() {} func (x *StatusResponse) ProtoReflect() protoreflect.Message { - mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[20] + mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[17] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1188,7 +1028,7 @@ func (x *StatusResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use StatusResponse.ProtoReflect.Descriptor instead. func (*StatusResponse) Descriptor() ([]byte, []int) { - return file_penumbra_view_v1alpha1_view_proto_rawDescGZIP(), []int{20} + return file_penumbra_view_v1alpha1_view_proto_rawDescGZIP(), []int{17} } func (x *StatusResponse) GetFullSyncHeight() uint64 { @@ -1217,15 +1057,12 @@ type StatusStreamRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - - // Identifies the wallet id to query. - WalletId *v1alpha12.WalletId `protobuf:"bytes,14,opt,name=wallet_id,json=walletId,proto3" json:"wallet_id,omitempty"` } func (x *StatusStreamRequest) Reset() { *x = StatusStreamRequest{} if protoimpl.UnsafeEnabled { - mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[21] + mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[18] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1238,7 +1075,7 @@ func (x *StatusStreamRequest) String() string { func (*StatusStreamRequest) ProtoMessage() {} func (x *StatusStreamRequest) ProtoReflect() protoreflect.Message { - mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[21] + mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[18] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1251,14 +1088,7 @@ func (x *StatusStreamRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use StatusStreamRequest.ProtoReflect.Descriptor instead. func (*StatusStreamRequest) Descriptor() ([]byte, []int) { - return file_penumbra_view_v1alpha1_view_proto_rawDescGZIP(), []int{21} -} - -func (x *StatusStreamRequest) GetWalletId() *v1alpha12.WalletId { - if x != nil { - return x.WalletId - } - return nil + return file_penumbra_view_v1alpha1_view_proto_rawDescGZIP(), []int{18} } // A streaming sync status update @@ -1278,7 +1108,7 @@ type StatusStreamResponse struct { func (x *StatusStreamResponse) Reset() { *x = StatusStreamResponse{} if protoimpl.UnsafeEnabled { - mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[22] + mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[19] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1291,7 +1121,7 @@ func (x *StatusStreamResponse) String() string { func (*StatusStreamResponse) ProtoMessage() {} func (x *StatusStreamResponse) ProtoReflect() protoreflect.Message { - mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[22] + mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[19] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1304,7 +1134,7 @@ func (x *StatusStreamResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use StatusStreamResponse.ProtoReflect.Descriptor instead. func (*StatusStreamResponse) Descriptor() ([]byte, []int) { - return file_penumbra_view_v1alpha1_view_proto_rawDescGZIP(), []int{22} + return file_penumbra_view_v1alpha1_view_proto_rawDescGZIP(), []int{19} } func (x *StatusStreamResponse) GetLatestKnownBlockHeight() uint64 { @@ -1340,21 +1170,19 @@ type NotesRequest struct { // If set, return spent notes as well as unspent notes. IncludeSpent bool `protobuf:"varint,2,opt,name=include_spent,json=includeSpent,proto3" json:"include_spent,omitempty"` // If set, only return notes with the specified asset id. - AssetId *v1alpha14.AssetId `protobuf:"bytes,3,opt,name=asset_id,json=assetId,proto3" json:"asset_id,omitempty"` + AssetId *v1alpha15.AssetId `protobuf:"bytes,3,opt,name=asset_id,json=assetId,proto3" json:"asset_id,omitempty"` // If set, only return notes with the specified address incore.component.dex.v1alpha1. - AddressIndex *v1alpha12.AddressIndex `protobuf:"bytes,4,opt,name=address_index,json=addressIndex,proto3" json:"address_index,omitempty"` + AddressIndex *v1alpha13.AddressIndex `protobuf:"bytes,4,opt,name=address_index,json=addressIndex,proto3" json:"address_index,omitempty"` // If set, stop returning notes once the total exceeds this amount. // // Ignored if `asset_id` is unset or if `include_spent` is set. - AmountToSpend *v1alpha15.Amount `protobuf:"bytes,6,opt,name=amount_to_spend,json=amountToSpend,proto3" json:"amount_to_spend,omitempty"` - // Identifies the wallet id to query. - WalletId *v1alpha12.WalletId `protobuf:"bytes,14,opt,name=wallet_id,json=walletId,proto3" json:"wallet_id,omitempty"` + AmountToSpend *v1alpha16.Amount `protobuf:"bytes,6,opt,name=amount_to_spend,json=amountToSpend,proto3" json:"amount_to_spend,omitempty"` } func (x *NotesRequest) Reset() { *x = NotesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[23] + mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[20] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1367,7 +1195,7 @@ func (x *NotesRequest) String() string { func (*NotesRequest) ProtoMessage() {} func (x *NotesRequest) ProtoReflect() protoreflect.Message { - mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[23] + mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[20] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1380,7 +1208,7 @@ func (x *NotesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use NotesRequest.ProtoReflect.Descriptor instead. func (*NotesRequest) Descriptor() ([]byte, []int) { - return file_penumbra_view_v1alpha1_view_proto_rawDescGZIP(), []int{23} + return file_penumbra_view_v1alpha1_view_proto_rawDescGZIP(), []int{20} } func (x *NotesRequest) GetIncludeSpent() bool { @@ -1390,34 +1218,27 @@ func (x *NotesRequest) GetIncludeSpent() bool { return false } -func (x *NotesRequest) GetAssetId() *v1alpha14.AssetId { +func (x *NotesRequest) GetAssetId() *v1alpha15.AssetId { if x != nil { return x.AssetId } return nil } -func (x *NotesRequest) GetAddressIndex() *v1alpha12.AddressIndex { +func (x *NotesRequest) GetAddressIndex() *v1alpha13.AddressIndex { if x != nil { return x.AddressIndex } return nil } -func (x *NotesRequest) GetAmountToSpend() *v1alpha15.Amount { +func (x *NotesRequest) GetAmountToSpend() *v1alpha16.Amount { if x != nil { return x.AmountToSpend } return nil } -func (x *NotesRequest) GetWalletId() *v1alpha12.WalletId { - if x != nil { - return x.WalletId - } - return nil -} - // A query for notes to be used for voting on a proposal. type NotesForVotingRequest struct { state protoimpl.MessageState @@ -1427,15 +1248,13 @@ type NotesForVotingRequest struct { // The starting height of the proposal. VotableAtHeight uint64 `protobuf:"varint,1,opt,name=votable_at_height,json=votableAtHeight,proto3" json:"votable_at_height,omitempty"` // If set, only return notes with the specified asset id. - AddressIndex *v1alpha12.AddressIndex `protobuf:"bytes,3,opt,name=address_index,json=addressIndex,proto3" json:"address_index,omitempty"` - // Identifies the wallet id to query. - WalletId *v1alpha12.WalletId `protobuf:"bytes,14,opt,name=wallet_id,json=walletId,proto3" json:"wallet_id,omitempty"` + AddressIndex *v1alpha13.AddressIndex `protobuf:"bytes,3,opt,name=address_index,json=addressIndex,proto3" json:"address_index,omitempty"` } func (x *NotesForVotingRequest) Reset() { *x = NotesForVotingRequest{} if protoimpl.UnsafeEnabled { - mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[24] + mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[21] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1448,7 +1267,7 @@ func (x *NotesForVotingRequest) String() string { func (*NotesForVotingRequest) ProtoMessage() {} func (x *NotesForVotingRequest) ProtoReflect() protoreflect.Message { - mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[24] + mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[21] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1461,7 +1280,7 @@ func (x *NotesForVotingRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use NotesForVotingRequest.ProtoReflect.Descriptor instead. func (*NotesForVotingRequest) Descriptor() ([]byte, []int) { - return file_penumbra_view_v1alpha1_view_proto_rawDescGZIP(), []int{24} + return file_penumbra_view_v1alpha1_view_proto_rawDescGZIP(), []int{21} } func (x *NotesForVotingRequest) GetVotableAtHeight() uint64 { @@ -1471,37 +1290,28 @@ func (x *NotesForVotingRequest) GetVotableAtHeight() uint64 { return 0 } -func (x *NotesForVotingRequest) GetAddressIndex() *v1alpha12.AddressIndex { +func (x *NotesForVotingRequest) GetAddressIndex() *v1alpha13.AddressIndex { if x != nil { return x.AddressIndex } return nil } -func (x *NotesForVotingRequest) GetWalletId() *v1alpha12.WalletId { - if x != nil { - return x.WalletId - } - return nil -} - type WitnessRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // The note commitments to obtain auth paths for. - NoteCommitments []*v1alpha16.StateCommitment `protobuf:"bytes,2,rep,name=note_commitments,json=noteCommitments,proto3" json:"note_commitments,omitempty"` + NoteCommitments []*v1alpha17.StateCommitment `protobuf:"bytes,2,rep,name=note_commitments,json=noteCommitments,proto3" json:"note_commitments,omitempty"` // The transaction plan to witness TransactionPlan *v1alpha1.TransactionPlan `protobuf:"bytes,3,opt,name=transaction_plan,json=transactionPlan,proto3" json:"transaction_plan,omitempty"` - // Identifies the wallet id to query. - WalletId *v1alpha12.WalletId `protobuf:"bytes,14,opt,name=wallet_id,json=walletId,proto3" json:"wallet_id,omitempty"` } func (x *WitnessRequest) Reset() { *x = WitnessRequest{} if protoimpl.UnsafeEnabled { - mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[25] + mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[22] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1514,7 +1324,7 @@ func (x *WitnessRequest) String() string { func (*WitnessRequest) ProtoMessage() {} func (x *WitnessRequest) ProtoReflect() protoreflect.Message { - mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[25] + mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[22] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1527,10 +1337,10 @@ func (x *WitnessRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use WitnessRequest.ProtoReflect.Descriptor instead. func (*WitnessRequest) Descriptor() ([]byte, []int) { - return file_penumbra_view_v1alpha1_view_proto_rawDescGZIP(), []int{25} + return file_penumbra_view_v1alpha1_view_proto_rawDescGZIP(), []int{22} } -func (x *WitnessRequest) GetNoteCommitments() []*v1alpha16.StateCommitment { +func (x *WitnessRequest) GetNoteCommitments() []*v1alpha17.StateCommitment { if x != nil { return x.NoteCommitments } @@ -1544,13 +1354,6 @@ func (x *WitnessRequest) GetTransactionPlan() *v1alpha1.TransactionPlan { return nil } -func (x *WitnessRequest) GetWalletId() *v1alpha12.WalletId { - if x != nil { - return x.WalletId - } - return nil -} - type WitnessResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1562,7 +1365,7 @@ type WitnessResponse struct { func (x *WitnessResponse) Reset() { *x = WitnessResponse{} if protoimpl.UnsafeEnabled { - mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[26] + mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[23] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1575,7 +1378,7 @@ func (x *WitnessResponse) String() string { func (*WitnessResponse) ProtoMessage() {} func (x *WitnessResponse) ProtoReflect() protoreflect.Message { - mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[26] + mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[23] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1588,7 +1391,7 @@ func (x *WitnessResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use WitnessResponse.ProtoReflect.Descriptor instead. func (*WitnessResponse) Descriptor() ([]byte, []int) { - return file_penumbra_view_v1alpha1_view_proto_rawDescGZIP(), []int{26} + return file_penumbra_view_v1alpha1_view_proto_rawDescGZIP(), []int{23} } func (x *WitnessResponse) GetWitnessData() *v1alpha1.WitnessData { @@ -1610,7 +1413,7 @@ type WitnessAndBuildRequest struct { func (x *WitnessAndBuildRequest) Reset() { *x = WitnessAndBuildRequest{} if protoimpl.UnsafeEnabled { - mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[27] + mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[24] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1623,7 +1426,7 @@ func (x *WitnessAndBuildRequest) String() string { func (*WitnessAndBuildRequest) ProtoMessage() {} func (x *WitnessAndBuildRequest) ProtoReflect() protoreflect.Message { - mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[27] + mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[24] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1636,7 +1439,7 @@ func (x *WitnessAndBuildRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use WitnessAndBuildRequest.ProtoReflect.Descriptor instead. func (*WitnessAndBuildRequest) Descriptor() ([]byte, []int) { - return file_penumbra_view_v1alpha1_view_proto_rawDescGZIP(), []int{27} + return file_penumbra_view_v1alpha1_view_proto_rawDescGZIP(), []int{24} } func (x *WitnessAndBuildRequest) GetTransactionPlan() *v1alpha1.TransactionPlan { @@ -1664,7 +1467,7 @@ type WitnessAndBuildResponse struct { func (x *WitnessAndBuildResponse) Reset() { *x = WitnessAndBuildResponse{} if protoimpl.UnsafeEnabled { - mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[28] + mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[25] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1677,7 +1480,7 @@ func (x *WitnessAndBuildResponse) String() string { func (*WitnessAndBuildResponse) ProtoMessage() {} func (x *WitnessAndBuildResponse) ProtoReflect() protoreflect.Message { - mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[28] + mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[25] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1690,7 +1493,7 @@ func (x *WitnessAndBuildResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use WitnessAndBuildResponse.ProtoReflect.Descriptor instead. func (*WitnessAndBuildResponse) Descriptor() ([]byte, []int) { - return file_penumbra_view_v1alpha1_view_proto_rawDescGZIP(), []int{28} + return file_penumbra_view_v1alpha1_view_proto_rawDescGZIP(), []int{25} } func (x *WitnessAndBuildResponse) GetTransaction() *v1alpha1.Transaction { @@ -1710,7 +1513,7 @@ type AssetsRequest struct { // the request indicate a filter. Filtered bool `protobuf:"varint,1,opt,name=filtered,proto3" json:"filtered,omitempty"` // Include these specific denominations in the response. - IncludeSpecificDenominations []*v1alpha14.Denom `protobuf:"bytes,2,rep,name=include_specific_denominations,json=includeSpecificDenominations,proto3" json:"include_specific_denominations,omitempty"` + IncludeSpecificDenominations []*v1alpha15.Denom `protobuf:"bytes,2,rep,name=include_specific_denominations,json=includeSpecificDenominations,proto3" json:"include_specific_denominations,omitempty"` // Include all delegation tokens, to any validator, in the response. IncludeDelegationTokens bool `protobuf:"varint,3,opt,name=include_delegation_tokens,json=includeDelegationTokens,proto3" json:"include_delegation_tokens,omitempty"` // Include all unbonding tokens, from any validator, in the response. @@ -1726,7 +1529,7 @@ type AssetsRequest struct { func (x *AssetsRequest) Reset() { *x = AssetsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[29] + mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[26] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1739,7 +1542,7 @@ func (x *AssetsRequest) String() string { func (*AssetsRequest) ProtoMessage() {} func (x *AssetsRequest) ProtoReflect() protoreflect.Message { - mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[29] + mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[26] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1752,7 +1555,7 @@ func (x *AssetsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use AssetsRequest.ProtoReflect.Descriptor instead. func (*AssetsRequest) Descriptor() ([]byte, []int) { - return file_penumbra_view_v1alpha1_view_proto_rawDescGZIP(), []int{29} + return file_penumbra_view_v1alpha1_view_proto_rawDescGZIP(), []int{26} } func (x *AssetsRequest) GetFiltered() bool { @@ -1762,7 +1565,7 @@ func (x *AssetsRequest) GetFiltered() bool { return false } -func (x *AssetsRequest) GetIncludeSpecificDenominations() []*v1alpha14.Denom { +func (x *AssetsRequest) GetIncludeSpecificDenominations() []*v1alpha15.Denom { if x != nil { return x.IncludeSpecificDenominations } @@ -1810,13 +1613,13 @@ type AssetsResponse struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - DenomMetadata *v1alpha14.DenomMetadata `protobuf:"bytes,2,opt,name=denom_metadata,json=denomMetadata,proto3" json:"denom_metadata,omitempty"` + DenomMetadata *v1alpha15.DenomMetadata `protobuf:"bytes,2,opt,name=denom_metadata,json=denomMetadata,proto3" json:"denom_metadata,omitempty"` } func (x *AssetsResponse) Reset() { *x = AssetsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[30] + mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[27] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1829,7 +1632,7 @@ func (x *AssetsResponse) String() string { func (*AssetsResponse) ProtoMessage() {} func (x *AssetsResponse) ProtoReflect() protoreflect.Message { - mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[30] + mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[27] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1842,10 +1645,10 @@ func (x *AssetsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use AssetsResponse.ProtoReflect.Descriptor instead. func (*AssetsResponse) Descriptor() ([]byte, []int) { - return file_penumbra_view_v1alpha1_view_proto_rawDescGZIP(), []int{30} + return file_penumbra_view_v1alpha1_view_proto_rawDescGZIP(), []int{27} } -func (x *AssetsResponse) GetDenomMetadata() *v1alpha14.DenomMetadata { +func (x *AssetsResponse) GetDenomMetadata() *v1alpha15.DenomMetadata { if x != nil { return x.DenomMetadata } @@ -1862,7 +1665,7 @@ type AppParametersRequest struct { func (x *AppParametersRequest) Reset() { *x = AppParametersRequest{} if protoimpl.UnsafeEnabled { - mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[31] + mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[28] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1875,7 +1678,7 @@ func (x *AppParametersRequest) String() string { func (*AppParametersRequest) ProtoMessage() {} func (x *AppParametersRequest) ProtoReflect() protoreflect.Message { - mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[31] + mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[28] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1888,7 +1691,7 @@ func (x *AppParametersRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use AppParametersRequest.ProtoReflect.Descriptor instead. func (*AppParametersRequest) Descriptor() ([]byte, []int) { - return file_penumbra_view_v1alpha1_view_proto_rawDescGZIP(), []int{31} + return file_penumbra_view_v1alpha1_view_proto_rawDescGZIP(), []int{28} } type AppParametersResponse struct { @@ -1896,13 +1699,13 @@ type AppParametersResponse struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Parameters *v1alpha17.AppParameters `protobuf:"bytes,1,opt,name=parameters,proto3" json:"parameters,omitempty"` + Parameters *v1alpha18.AppParameters `protobuf:"bytes,1,opt,name=parameters,proto3" json:"parameters,omitempty"` } func (x *AppParametersResponse) Reset() { *x = AppParametersResponse{} if protoimpl.UnsafeEnabled { - mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[32] + mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[29] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1915,7 +1718,7 @@ func (x *AppParametersResponse) String() string { func (*AppParametersResponse) ProtoMessage() {} func (x *AppParametersResponse) ProtoReflect() protoreflect.Message { - mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[32] + mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[29] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1928,10 +1731,10 @@ func (x *AppParametersResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use AppParametersResponse.ProtoReflect.Descriptor instead. func (*AppParametersResponse) Descriptor() ([]byte, []int) { - return file_penumbra_view_v1alpha1_view_proto_rawDescGZIP(), []int{32} + return file_penumbra_view_v1alpha1_view_proto_rawDescGZIP(), []int{29} } -func (x *AppParametersResponse) GetParameters() *v1alpha17.AppParameters { +func (x *AppParametersResponse) GetParameters() *v1alpha18.AppParameters { if x != nil { return x.Parameters } @@ -1948,7 +1751,7 @@ type GasPricesRequest struct { func (x *GasPricesRequest) Reset() { *x = GasPricesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[33] + mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[30] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1961,7 +1764,7 @@ func (x *GasPricesRequest) String() string { func (*GasPricesRequest) ProtoMessage() {} func (x *GasPricesRequest) ProtoReflect() protoreflect.Message { - mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[33] + mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[30] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1974,7 +1777,7 @@ func (x *GasPricesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GasPricesRequest.ProtoReflect.Descriptor instead. func (*GasPricesRequest) Descriptor() ([]byte, []int) { - return file_penumbra_view_v1alpha1_view_proto_rawDescGZIP(), []int{33} + return file_penumbra_view_v1alpha1_view_proto_rawDescGZIP(), []int{30} } type GasPricesResponse struct { @@ -1982,13 +1785,13 @@ type GasPricesResponse struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - GasPrices *v1alpha11.GasPrices `protobuf:"bytes,1,opt,name=gas_prices,json=gasPrices,proto3" json:"gas_prices,omitempty"` + GasPrices *v1alpha12.GasPrices `protobuf:"bytes,1,opt,name=gas_prices,json=gasPrices,proto3" json:"gas_prices,omitempty"` } func (x *GasPricesResponse) Reset() { *x = GasPricesResponse{} if protoimpl.UnsafeEnabled { - mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[34] + mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[31] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2001,7 +1804,7 @@ func (x *GasPricesResponse) String() string { func (*GasPricesResponse) ProtoMessage() {} func (x *GasPricesResponse) ProtoReflect() protoreflect.Message { - mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[34] + mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[31] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2014,10 +1817,10 @@ func (x *GasPricesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GasPricesResponse.ProtoReflect.Descriptor instead. func (*GasPricesResponse) Descriptor() ([]byte, []int) { - return file_penumbra_view_v1alpha1_view_proto_rawDescGZIP(), []int{34} + return file_penumbra_view_v1alpha1_view_proto_rawDescGZIP(), []int{31} } -func (x *GasPricesResponse) GetGasPrices() *v1alpha11.GasPrices { +func (x *GasPricesResponse) GetGasPrices() *v1alpha12.GasPrices { if x != nil { return x.GasPrices } @@ -2034,7 +1837,7 @@ type FMDParametersRequest struct { func (x *FMDParametersRequest) Reset() { *x = FMDParametersRequest{} if protoimpl.UnsafeEnabled { - mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[35] + mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[32] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2047,7 +1850,7 @@ func (x *FMDParametersRequest) String() string { func (*FMDParametersRequest) ProtoMessage() {} func (x *FMDParametersRequest) ProtoReflect() protoreflect.Message { - mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[35] + mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[32] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2060,7 +1863,7 @@ func (x *FMDParametersRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use FMDParametersRequest.ProtoReflect.Descriptor instead. func (*FMDParametersRequest) Descriptor() ([]byte, []int) { - return file_penumbra_view_v1alpha1_view_proto_rawDescGZIP(), []int{35} + return file_penumbra_view_v1alpha1_view_proto_rawDescGZIP(), []int{32} } type FMDParametersResponse struct { @@ -2068,13 +1871,13 @@ type FMDParametersResponse struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Parameters *v1alpha18.FmdParameters `protobuf:"bytes,1,opt,name=parameters,proto3" json:"parameters,omitempty"` + Parameters *v1alpha19.FmdParameters `protobuf:"bytes,1,opt,name=parameters,proto3" json:"parameters,omitempty"` } func (x *FMDParametersResponse) Reset() { *x = FMDParametersResponse{} if protoimpl.UnsafeEnabled { - mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[36] + mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[33] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2087,7 +1890,7 @@ func (x *FMDParametersResponse) String() string { func (*FMDParametersResponse) ProtoMessage() {} func (x *FMDParametersResponse) ProtoReflect() protoreflect.Message { - mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[36] + mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[33] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2100,10 +1903,10 @@ func (x *FMDParametersResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use FMDParametersResponse.ProtoReflect.Descriptor instead. func (*FMDParametersResponse) Descriptor() ([]byte, []int) { - return file_penumbra_view_v1alpha1_view_proto_rawDescGZIP(), []int{36} + return file_penumbra_view_v1alpha1_view_proto_rawDescGZIP(), []int{33} } -func (x *FMDParametersResponse) GetParameters() *v1alpha18.FmdParameters { +func (x *FMDParametersResponse) GetParameters() *v1alpha19.FmdParameters { if x != nil { return x.Parameters } @@ -2115,17 +1918,15 @@ type NoteByCommitmentRequest struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - NoteCommitment *v1alpha16.StateCommitment `protobuf:"bytes,2,opt,name=note_commitment,json=noteCommitment,proto3" json:"note_commitment,omitempty"` + NoteCommitment *v1alpha17.StateCommitment `protobuf:"bytes,2,opt,name=note_commitment,json=noteCommitment,proto3" json:"note_commitment,omitempty"` // If set to true, waits to return until the requested note is detected. AwaitDetection bool `protobuf:"varint,3,opt,name=await_detection,json=awaitDetection,proto3" json:"await_detection,omitempty"` - // Identifies the wallet id to query. - WalletId *v1alpha12.WalletId `protobuf:"bytes,14,opt,name=wallet_id,json=walletId,proto3" json:"wallet_id,omitempty"` } func (x *NoteByCommitmentRequest) Reset() { *x = NoteByCommitmentRequest{} if protoimpl.UnsafeEnabled { - mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[37] + mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[34] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2138,7 +1939,7 @@ func (x *NoteByCommitmentRequest) String() string { func (*NoteByCommitmentRequest) ProtoMessage() {} func (x *NoteByCommitmentRequest) ProtoReflect() protoreflect.Message { - mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[37] + mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[34] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2151,10 +1952,10 @@ func (x *NoteByCommitmentRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use NoteByCommitmentRequest.ProtoReflect.Descriptor instead. func (*NoteByCommitmentRequest) Descriptor() ([]byte, []int) { - return file_penumbra_view_v1alpha1_view_proto_rawDescGZIP(), []int{37} + return file_penumbra_view_v1alpha1_view_proto_rawDescGZIP(), []int{34} } -func (x *NoteByCommitmentRequest) GetNoteCommitment() *v1alpha16.StateCommitment { +func (x *NoteByCommitmentRequest) GetNoteCommitment() *v1alpha17.StateCommitment { if x != nil { return x.NoteCommitment } @@ -2168,13 +1969,6 @@ func (x *NoteByCommitmentRequest) GetAwaitDetection() bool { return false } -func (x *NoteByCommitmentRequest) GetWalletId() *v1alpha12.WalletId { - if x != nil { - return x.WalletId - } - return nil -} - type NoteByCommitmentResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -2186,7 +1980,7 @@ type NoteByCommitmentResponse struct { func (x *NoteByCommitmentResponse) Reset() { *x = NoteByCommitmentResponse{} if protoimpl.UnsafeEnabled { - mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[38] + mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[35] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2199,7 +1993,7 @@ func (x *NoteByCommitmentResponse) String() string { func (*NoteByCommitmentResponse) ProtoMessage() {} func (x *NoteByCommitmentResponse) ProtoReflect() protoreflect.Message { - mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[38] + mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[35] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2212,7 +2006,7 @@ func (x *NoteByCommitmentResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use NoteByCommitmentResponse.ProtoReflect.Descriptor instead. func (*NoteByCommitmentResponse) Descriptor() ([]byte, []int) { - return file_penumbra_view_v1alpha1_view_proto_rawDescGZIP(), []int{38} + return file_penumbra_view_v1alpha1_view_proto_rawDescGZIP(), []int{35} } func (x *NoteByCommitmentResponse) GetSpendableNote() *SpendableNoteRecord { @@ -2227,17 +2021,15 @@ type SwapByCommitmentRequest struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - SwapCommitment *v1alpha16.StateCommitment `protobuf:"bytes,2,opt,name=swap_commitment,json=swapCommitment,proto3" json:"swap_commitment,omitempty"` + SwapCommitment *v1alpha17.StateCommitment `protobuf:"bytes,2,opt,name=swap_commitment,json=swapCommitment,proto3" json:"swap_commitment,omitempty"` // If set to true, waits to return until the requested swap is detected. AwaitDetection bool `protobuf:"varint,3,opt,name=await_detection,json=awaitDetection,proto3" json:"await_detection,omitempty"` - // Identifies the wallet id to query. - WalletId *v1alpha12.WalletId `protobuf:"bytes,14,opt,name=wallet_id,json=walletId,proto3" json:"wallet_id,omitempty"` } func (x *SwapByCommitmentRequest) Reset() { *x = SwapByCommitmentRequest{} if protoimpl.UnsafeEnabled { - mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[39] + mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[36] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2250,7 +2042,7 @@ func (x *SwapByCommitmentRequest) String() string { func (*SwapByCommitmentRequest) ProtoMessage() {} func (x *SwapByCommitmentRequest) ProtoReflect() protoreflect.Message { - mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[39] + mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[36] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2263,10 +2055,10 @@ func (x *SwapByCommitmentRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SwapByCommitmentRequest.ProtoReflect.Descriptor instead. func (*SwapByCommitmentRequest) Descriptor() ([]byte, []int) { - return file_penumbra_view_v1alpha1_view_proto_rawDescGZIP(), []int{39} + return file_penumbra_view_v1alpha1_view_proto_rawDescGZIP(), []int{36} } -func (x *SwapByCommitmentRequest) GetSwapCommitment() *v1alpha16.StateCommitment { +func (x *SwapByCommitmentRequest) GetSwapCommitment() *v1alpha17.StateCommitment { if x != nil { return x.SwapCommitment } @@ -2280,13 +2072,6 @@ func (x *SwapByCommitmentRequest) GetAwaitDetection() bool { return false } -func (x *SwapByCommitmentRequest) GetWalletId() *v1alpha12.WalletId { - if x != nil { - return x.WalletId - } - return nil -} - type SwapByCommitmentResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -2298,7 +2083,7 @@ type SwapByCommitmentResponse struct { func (x *SwapByCommitmentResponse) Reset() { *x = SwapByCommitmentResponse{} if protoimpl.UnsafeEnabled { - mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[40] + mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[37] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2311,7 +2096,7 @@ func (x *SwapByCommitmentResponse) String() string { func (*SwapByCommitmentResponse) ProtoMessage() {} func (x *SwapByCommitmentResponse) ProtoReflect() protoreflect.Message { - mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[40] + mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[37] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2324,7 +2109,7 @@ func (x *SwapByCommitmentResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use SwapByCommitmentResponse.ProtoReflect.Descriptor instead. func (*SwapByCommitmentResponse) Descriptor() ([]byte, []int) { - return file_penumbra_view_v1alpha1_view_proto_rawDescGZIP(), []int{40} + return file_penumbra_view_v1alpha1_view_proto_rawDescGZIP(), []int{37} } func (x *SwapByCommitmentResponse) GetSwap() *SwapRecord { @@ -2338,15 +2123,12 @@ type UnclaimedSwapsRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - - // Identifies the wallet id to query. - WalletId *v1alpha12.WalletId `protobuf:"bytes,1,opt,name=wallet_id,json=walletId,proto3" json:"wallet_id,omitempty"` } func (x *UnclaimedSwapsRequest) Reset() { *x = UnclaimedSwapsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[41] + mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[38] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2359,7 +2141,7 @@ func (x *UnclaimedSwapsRequest) String() string { func (*UnclaimedSwapsRequest) ProtoMessage() {} func (x *UnclaimedSwapsRequest) ProtoReflect() protoreflect.Message { - mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[41] + mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[38] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2372,14 +2154,7 @@ func (x *UnclaimedSwapsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use UnclaimedSwapsRequest.ProtoReflect.Descriptor instead. func (*UnclaimedSwapsRequest) Descriptor() ([]byte, []int) { - return file_penumbra_view_v1alpha1_view_proto_rawDescGZIP(), []int{41} -} - -func (x *UnclaimedSwapsRequest) GetWalletId() *v1alpha12.WalletId { - if x != nil { - return x.WalletId - } - return nil + return file_penumbra_view_v1alpha1_view_proto_rawDescGZIP(), []int{38} } type UnclaimedSwapsResponse struct { @@ -2393,7 +2168,7 @@ type UnclaimedSwapsResponse struct { func (x *UnclaimedSwapsResponse) Reset() { *x = UnclaimedSwapsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[42] + mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[39] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2406,7 +2181,7 @@ func (x *UnclaimedSwapsResponse) String() string { func (*UnclaimedSwapsResponse) ProtoMessage() {} func (x *UnclaimedSwapsResponse) ProtoReflect() protoreflect.Message { - mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[42] + mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[39] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2419,7 +2194,7 @@ func (x *UnclaimedSwapsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use UnclaimedSwapsResponse.ProtoReflect.Descriptor instead. func (*UnclaimedSwapsResponse) Descriptor() ([]byte, []int) { - return file_penumbra_view_v1alpha1_view_proto_rawDescGZIP(), []int{42} + return file_penumbra_view_v1alpha1_view_proto_rawDescGZIP(), []int{39} } func (x *UnclaimedSwapsResponse) GetSwap() *SwapRecord { @@ -2434,16 +2209,14 @@ type NullifierStatusRequest struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Nullifier *v1alpha19.Nullifier `protobuf:"bytes,2,opt,name=nullifier,proto3" json:"nullifier,omitempty"` - AwaitDetection bool `protobuf:"varint,3,opt,name=await_detection,json=awaitDetection,proto3" json:"await_detection,omitempty"` - // Identifies the wallet id to query. - WalletId *v1alpha12.WalletId `protobuf:"bytes,14,opt,name=wallet_id,json=walletId,proto3" json:"wallet_id,omitempty"` + Nullifier *v1alpha110.Nullifier `protobuf:"bytes,2,opt,name=nullifier,proto3" json:"nullifier,omitempty"` + AwaitDetection bool `protobuf:"varint,3,opt,name=await_detection,json=awaitDetection,proto3" json:"await_detection,omitempty"` } func (x *NullifierStatusRequest) Reset() { *x = NullifierStatusRequest{} if protoimpl.UnsafeEnabled { - mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[43] + mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[40] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2456,7 +2229,7 @@ func (x *NullifierStatusRequest) String() string { func (*NullifierStatusRequest) ProtoMessage() {} func (x *NullifierStatusRequest) ProtoReflect() protoreflect.Message { - mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[43] + mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[40] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2469,10 +2242,10 @@ func (x *NullifierStatusRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use NullifierStatusRequest.ProtoReflect.Descriptor instead. func (*NullifierStatusRequest) Descriptor() ([]byte, []int) { - return file_penumbra_view_v1alpha1_view_proto_rawDescGZIP(), []int{43} + return file_penumbra_view_v1alpha1_view_proto_rawDescGZIP(), []int{40} } -func (x *NullifierStatusRequest) GetNullifier() *v1alpha19.Nullifier { +func (x *NullifierStatusRequest) GetNullifier() *v1alpha110.Nullifier { if x != nil { return x.Nullifier } @@ -2486,13 +2259,6 @@ func (x *NullifierStatusRequest) GetAwaitDetection() bool { return false } -func (x *NullifierStatusRequest) GetWalletId() *v1alpha12.WalletId { - if x != nil { - return x.WalletId - } - return nil -} - type NullifierStatusResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -2504,7 +2270,7 @@ type NullifierStatusResponse struct { func (x *NullifierStatusResponse) Reset() { *x = NullifierStatusResponse{} if protoimpl.UnsafeEnabled { - mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[44] + mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[41] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2517,7 +2283,7 @@ func (x *NullifierStatusResponse) String() string { func (*NullifierStatusResponse) ProtoMessage() {} func (x *NullifierStatusResponse) ProtoReflect() protoreflect.Message { - mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[44] + mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[41] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2530,7 +2296,7 @@ func (x *NullifierStatusResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use NullifierStatusResponse.ProtoReflect.Descriptor instead. func (*NullifierStatusResponse) Descriptor() ([]byte, []int) { - return file_penumbra_view_v1alpha1_view_proto_rawDescGZIP(), []int{44} + return file_penumbra_view_v1alpha1_view_proto_rawDescGZIP(), []int{41} } func (x *NullifierStatusResponse) GetSpent() bool { @@ -2546,13 +2312,13 @@ type TransactionInfoByHashRequest struct { unknownFields protoimpl.UnknownFields // The transaction hash to query for. - Id *v1alpha1.Id `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"` + Id *v1alpha11.TransactionId `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"` } func (x *TransactionInfoByHashRequest) Reset() { *x = TransactionInfoByHashRequest{} if protoimpl.UnsafeEnabled { - mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[45] + mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[42] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2565,7 +2331,7 @@ func (x *TransactionInfoByHashRequest) String() string { func (*TransactionInfoByHashRequest) ProtoMessage() {} func (x *TransactionInfoByHashRequest) ProtoReflect() protoreflect.Message { - mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[45] + mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[42] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2578,10 +2344,10 @@ func (x *TransactionInfoByHashRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use TransactionInfoByHashRequest.ProtoReflect.Descriptor instead. func (*TransactionInfoByHashRequest) Descriptor() ([]byte, []int) { - return file_penumbra_view_v1alpha1_view_proto_rawDescGZIP(), []int{45} + return file_penumbra_view_v1alpha1_view_proto_rawDescGZIP(), []int{42} } -func (x *TransactionInfoByHashRequest) GetId() *v1alpha1.Id { +func (x *TransactionInfoByHashRequest) GetId() *v1alpha11.TransactionId { if x != nil { return x.Id } @@ -2602,7 +2368,7 @@ type TransactionInfoRequest struct { func (x *TransactionInfoRequest) Reset() { *x = TransactionInfoRequest{} if protoimpl.UnsafeEnabled { - mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[46] + mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[43] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2615,7 +2381,7 @@ func (x *TransactionInfoRequest) String() string { func (*TransactionInfoRequest) ProtoMessage() {} func (x *TransactionInfoRequest) ProtoReflect() protoreflect.Message { - mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[46] + mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[43] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2628,7 +2394,7 @@ func (x *TransactionInfoRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use TransactionInfoRequest.ProtoReflect.Descriptor instead. func (*TransactionInfoRequest) Descriptor() ([]byte, []int) { - return file_penumbra_view_v1alpha1_view_proto_rawDescGZIP(), []int{46} + return file_penumbra_view_v1alpha1_view_proto_rawDescGZIP(), []int{43} } func (x *TransactionInfoRequest) GetStartHeight() uint64 { @@ -2653,7 +2419,7 @@ type TransactionInfo struct { // The height the transaction was included in a block, if known. Height uint64 `protobuf:"varint,1,opt,name=height,proto3" json:"height,omitempty"` // The hash of the transaction. - Id *v1alpha1.Id `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"` + Id *v1alpha11.TransactionId `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"` // The transaction data itself. Transaction *v1alpha1.Transaction `protobuf:"bytes,3,opt,name=transaction,proto3" json:"transaction,omitempty"` // The transaction perspective, as seen by this view server. @@ -2665,7 +2431,7 @@ type TransactionInfo struct { func (x *TransactionInfo) Reset() { *x = TransactionInfo{} if protoimpl.UnsafeEnabled { - mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[47] + mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[44] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2678,7 +2444,7 @@ func (x *TransactionInfo) String() string { func (*TransactionInfo) ProtoMessage() {} func (x *TransactionInfo) ProtoReflect() protoreflect.Message { - mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[47] + mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[44] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2691,7 +2457,7 @@ func (x *TransactionInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use TransactionInfo.ProtoReflect.Descriptor instead. func (*TransactionInfo) Descriptor() ([]byte, []int) { - return file_penumbra_view_v1alpha1_view_proto_rawDescGZIP(), []int{47} + return file_penumbra_view_v1alpha1_view_proto_rawDescGZIP(), []int{44} } func (x *TransactionInfo) GetHeight() uint64 { @@ -2701,7 +2467,7 @@ func (x *TransactionInfo) GetHeight() uint64 { return 0 } -func (x *TransactionInfo) GetId() *v1alpha1.Id { +func (x *TransactionInfo) GetId() *v1alpha11.TransactionId { if x != nil { return x.Id } @@ -2740,7 +2506,7 @@ type TransactionInfoResponse struct { func (x *TransactionInfoResponse) Reset() { *x = TransactionInfoResponse{} if protoimpl.UnsafeEnabled { - mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[48] + mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[45] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2753,7 +2519,7 @@ func (x *TransactionInfoResponse) String() string { func (*TransactionInfoResponse) ProtoMessage() {} func (x *TransactionInfoResponse) ProtoReflect() protoreflect.Message { - mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[48] + mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[45] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2766,7 +2532,7 @@ func (x *TransactionInfoResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use TransactionInfoResponse.ProtoReflect.Descriptor instead. func (*TransactionInfoResponse) Descriptor() ([]byte, []int) { - return file_penumbra_view_v1alpha1_view_proto_rawDescGZIP(), []int{48} + return file_penumbra_view_v1alpha1_view_proto_rawDescGZIP(), []int{45} } func (x *TransactionInfoResponse) GetTxInfo() *TransactionInfo { @@ -2787,7 +2553,7 @@ type TransactionInfoByHashResponse struct { func (x *TransactionInfoByHashResponse) Reset() { *x = TransactionInfoByHashResponse{} if protoimpl.UnsafeEnabled { - mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[49] + mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[46] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2800,7 +2566,7 @@ func (x *TransactionInfoByHashResponse) String() string { func (*TransactionInfoByHashResponse) ProtoMessage() {} func (x *TransactionInfoByHashResponse) ProtoReflect() protoreflect.Message { - mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[49] + mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[46] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2813,7 +2579,7 @@ func (x *TransactionInfoByHashResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use TransactionInfoByHashResponse.ProtoReflect.Descriptor instead. func (*TransactionInfoByHashResponse) Descriptor() ([]byte, []int) { - return file_penumbra_view_v1alpha1_view_proto_rawDescGZIP(), []int{49} + return file_penumbra_view_v1alpha1_view_proto_rawDescGZIP(), []int{46} } func (x *TransactionInfoByHashResponse) GetTxInfo() *TransactionInfo { @@ -2834,7 +2600,7 @@ type NotesResponse struct { func (x *NotesResponse) Reset() { *x = NotesResponse{} if protoimpl.UnsafeEnabled { - mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[50] + mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[47] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2847,7 +2613,7 @@ func (x *NotesResponse) String() string { func (*NotesResponse) ProtoMessage() {} func (x *NotesResponse) ProtoReflect() protoreflect.Message { - mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[50] + mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[47] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2860,7 +2626,7 @@ func (x *NotesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use NotesResponse.ProtoReflect.Descriptor instead. func (*NotesResponse) Descriptor() ([]byte, []int) { - return file_penumbra_view_v1alpha1_view_proto_rawDescGZIP(), []int{50} + return file_penumbra_view_v1alpha1_view_proto_rawDescGZIP(), []int{47} } func (x *NotesResponse) GetNoteRecord() *SpendableNoteRecord { @@ -2876,13 +2642,13 @@ type NotesForVotingResponse struct { unknownFields protoimpl.UnknownFields NoteRecord *SpendableNoteRecord `protobuf:"bytes,1,opt,name=note_record,json=noteRecord,proto3" json:"note_record,omitempty"` - IdentityKey *v1alpha12.IdentityKey `protobuf:"bytes,2,opt,name=identity_key,json=identityKey,proto3" json:"identity_key,omitempty"` + IdentityKey *v1alpha13.IdentityKey `protobuf:"bytes,2,opt,name=identity_key,json=identityKey,proto3" json:"identity_key,omitempty"` } func (x *NotesForVotingResponse) Reset() { *x = NotesForVotingResponse{} if protoimpl.UnsafeEnabled { - mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[51] + mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[48] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2895,7 +2661,7 @@ func (x *NotesForVotingResponse) String() string { func (*NotesForVotingResponse) ProtoMessage() {} func (x *NotesForVotingResponse) ProtoReflect() protoreflect.Message { - mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[51] + mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[48] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2908,7 +2674,7 @@ func (x *NotesForVotingResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use NotesForVotingResponse.ProtoReflect.Descriptor instead. func (*NotesForVotingResponse) Descriptor() ([]byte, []int) { - return file_penumbra_view_v1alpha1_view_proto_rawDescGZIP(), []int{51} + return file_penumbra_view_v1alpha1_view_proto_rawDescGZIP(), []int{48} } func (x *NotesForVotingResponse) GetNoteRecord() *SpendableNoteRecord { @@ -2918,7 +2684,7 @@ func (x *NotesForVotingResponse) GetNoteRecord() *SpendableNoteRecord { return nil } -func (x *NotesForVotingResponse) GetIdentityKey() *v1alpha12.IdentityKey { +func (x *NotesForVotingResponse) GetIdentityKey() *v1alpha13.IdentityKey { if x != nil { return x.IdentityKey } @@ -2932,13 +2698,13 @@ type SpendableNoteRecord struct { unknownFields protoimpl.UnknownFields // The note commitment, identifying the note. - NoteCommitment *v1alpha16.StateCommitment `protobuf:"bytes,1,opt,name=note_commitment,json=noteCommitment,proto3" json:"note_commitment,omitempty"` + NoteCommitment *v1alpha17.StateCommitment `protobuf:"bytes,1,opt,name=note_commitment,json=noteCommitment,proto3" json:"note_commitment,omitempty"` // The note plaintext itself. - Note *v1alpha110.Note `protobuf:"bytes,2,opt,name=note,proto3" json:"note,omitempty"` + Note *v1alpha111.Note `protobuf:"bytes,2,opt,name=note,proto3" json:"note,omitempty"` // A precomputed decryption of the note's address incore.component.dex.v1alpha1. - AddressIndex *v1alpha12.AddressIndex `protobuf:"bytes,3,opt,name=address_index,json=addressIndex,proto3" json:"address_index,omitempty"` + AddressIndex *v1alpha13.AddressIndex `protobuf:"bytes,3,opt,name=address_index,json=addressIndex,proto3" json:"address_index,omitempty"` // The note's nullifier. - Nullifier *v1alpha19.Nullifier `protobuf:"bytes,4,opt,name=nullifier,proto3" json:"nullifier,omitempty"` + Nullifier *v1alpha110.Nullifier `protobuf:"bytes,4,opt,name=nullifier,proto3" json:"nullifier,omitempty"` // The height at which the note was created. HeightCreated uint64 `protobuf:"varint,5,opt,name=height_created,json=heightCreated,proto3" json:"height_created,omitempty"` // Records whether the note was spent (and if so, at what height). @@ -2946,13 +2712,13 @@ type SpendableNoteRecord struct { // The note position. Position uint64 `protobuf:"varint,7,opt,name=position,proto3" json:"position,omitempty"` // The source of the note - Source *v1alpha19.CommitmentSource `protobuf:"bytes,8,opt,name=source,proto3" json:"source,omitempty"` + Source *v1alpha110.CommitmentSource `protobuf:"bytes,8,opt,name=source,proto3" json:"source,omitempty"` } func (x *SpendableNoteRecord) Reset() { *x = SpendableNoteRecord{} if protoimpl.UnsafeEnabled { - mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[52] + mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[49] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2965,7 +2731,7 @@ func (x *SpendableNoteRecord) String() string { func (*SpendableNoteRecord) ProtoMessage() {} func (x *SpendableNoteRecord) ProtoReflect() protoreflect.Message { - mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[52] + mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[49] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2978,31 +2744,31 @@ func (x *SpendableNoteRecord) ProtoReflect() protoreflect.Message { // Deprecated: Use SpendableNoteRecord.ProtoReflect.Descriptor instead. func (*SpendableNoteRecord) Descriptor() ([]byte, []int) { - return file_penumbra_view_v1alpha1_view_proto_rawDescGZIP(), []int{52} + return file_penumbra_view_v1alpha1_view_proto_rawDescGZIP(), []int{49} } -func (x *SpendableNoteRecord) GetNoteCommitment() *v1alpha16.StateCommitment { +func (x *SpendableNoteRecord) GetNoteCommitment() *v1alpha17.StateCommitment { if x != nil { return x.NoteCommitment } return nil } -func (x *SpendableNoteRecord) GetNote() *v1alpha110.Note { +func (x *SpendableNoteRecord) GetNote() *v1alpha111.Note { if x != nil { return x.Note } return nil } -func (x *SpendableNoteRecord) GetAddressIndex() *v1alpha12.AddressIndex { +func (x *SpendableNoteRecord) GetAddressIndex() *v1alpha13.AddressIndex { if x != nil { return x.AddressIndex } return nil } -func (x *SpendableNoteRecord) GetNullifier() *v1alpha19.Nullifier { +func (x *SpendableNoteRecord) GetNullifier() *v1alpha110.Nullifier { if x != nil { return x.Nullifier } @@ -3030,7 +2796,7 @@ func (x *SpendableNoteRecord) GetPosition() uint64 { return 0 } -func (x *SpendableNoteRecord) GetSource() *v1alpha19.CommitmentSource { +func (x *SpendableNoteRecord) GetSource() *v1alpha110.CommitmentSource { if x != nil { return x.Source } @@ -3042,19 +2808,19 @@ type SwapRecord struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - SwapCommitment *v1alpha16.StateCommitment `protobuf:"bytes,1,opt,name=swap_commitment,json=swapCommitment,proto3" json:"swap_commitment,omitempty"` - Swap *v1alpha111.SwapPlaintext `protobuf:"bytes,2,opt,name=swap,proto3" json:"swap,omitempty"` + SwapCommitment *v1alpha17.StateCommitment `protobuf:"bytes,1,opt,name=swap_commitment,json=swapCommitment,proto3" json:"swap_commitment,omitempty"` + Swap *v1alpha112.SwapPlaintext `protobuf:"bytes,2,opt,name=swap,proto3" json:"swap,omitempty"` Position uint64 `protobuf:"varint,3,opt,name=position,proto3" json:"position,omitempty"` - Nullifier *v1alpha19.Nullifier `protobuf:"bytes,4,opt,name=nullifier,proto3" json:"nullifier,omitempty"` - OutputData *v1alpha111.BatchSwapOutputData `protobuf:"bytes,5,opt,name=output_data,json=outputData,proto3" json:"output_data,omitempty"` + Nullifier *v1alpha110.Nullifier `protobuf:"bytes,4,opt,name=nullifier,proto3" json:"nullifier,omitempty"` + OutputData *v1alpha112.BatchSwapOutputData `protobuf:"bytes,5,opt,name=output_data,json=outputData,proto3" json:"output_data,omitempty"` HeightClaimed uint64 `protobuf:"varint,6,opt,name=height_claimed,json=heightClaimed,proto3" json:"height_claimed,omitempty"` - Source *v1alpha19.CommitmentSource `protobuf:"bytes,7,opt,name=source,proto3" json:"source,omitempty"` + Source *v1alpha110.CommitmentSource `protobuf:"bytes,7,opt,name=source,proto3" json:"source,omitempty"` } func (x *SwapRecord) Reset() { *x = SwapRecord{} if protoimpl.UnsafeEnabled { - mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[53] + mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[50] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3067,7 +2833,7 @@ func (x *SwapRecord) String() string { func (*SwapRecord) ProtoMessage() {} func (x *SwapRecord) ProtoReflect() protoreflect.Message { - mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[53] + mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[50] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3080,17 +2846,17 @@ func (x *SwapRecord) ProtoReflect() protoreflect.Message { // Deprecated: Use SwapRecord.ProtoReflect.Descriptor instead. func (*SwapRecord) Descriptor() ([]byte, []int) { - return file_penumbra_view_v1alpha1_view_proto_rawDescGZIP(), []int{53} + return file_penumbra_view_v1alpha1_view_proto_rawDescGZIP(), []int{50} } -func (x *SwapRecord) GetSwapCommitment() *v1alpha16.StateCommitment { +func (x *SwapRecord) GetSwapCommitment() *v1alpha17.StateCommitment { if x != nil { return x.SwapCommitment } return nil } -func (x *SwapRecord) GetSwap() *v1alpha111.SwapPlaintext { +func (x *SwapRecord) GetSwap() *v1alpha112.SwapPlaintext { if x != nil { return x.Swap } @@ -3104,14 +2870,14 @@ func (x *SwapRecord) GetPosition() uint64 { return 0 } -func (x *SwapRecord) GetNullifier() *v1alpha19.Nullifier { +func (x *SwapRecord) GetNullifier() *v1alpha110.Nullifier { if x != nil { return x.Nullifier } return nil } -func (x *SwapRecord) GetOutputData() *v1alpha111.BatchSwapOutputData { +func (x *SwapRecord) GetOutputData() *v1alpha112.BatchSwapOutputData { if x != nil { return x.OutputData } @@ -3125,7 +2891,7 @@ func (x *SwapRecord) GetHeightClaimed() uint64 { return 0 } -func (x *SwapRecord) GetSource() *v1alpha19.CommitmentSource { +func (x *SwapRecord) GetSource() *v1alpha110.CommitmentSource { if x != nil { return x.Source } @@ -3138,15 +2904,15 @@ type OwnedPositionIdsRequest struct { unknownFields protoimpl.UnknownFields // If present, return only positions with this position state. - PositionState *v1alpha111.PositionState `protobuf:"bytes,1,opt,name=position_state,json=positionState,proto3" json:"position_state,omitempty"` + PositionState *v1alpha112.PositionState `protobuf:"bytes,1,opt,name=position_state,json=positionState,proto3" json:"position_state,omitempty"` // If present, return only positions for this trading pair. - TradingPair *v1alpha111.TradingPair `protobuf:"bytes,2,opt,name=trading_pair,json=tradingPair,proto3" json:"trading_pair,omitempty"` + TradingPair *v1alpha112.TradingPair `protobuf:"bytes,2,opt,name=trading_pair,json=tradingPair,proto3" json:"trading_pair,omitempty"` } func (x *OwnedPositionIdsRequest) Reset() { *x = OwnedPositionIdsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[54] + mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[51] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3159,7 +2925,7 @@ func (x *OwnedPositionIdsRequest) String() string { func (*OwnedPositionIdsRequest) ProtoMessage() {} func (x *OwnedPositionIdsRequest) ProtoReflect() protoreflect.Message { - mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[54] + mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[51] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3172,17 +2938,17 @@ func (x *OwnedPositionIdsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use OwnedPositionIdsRequest.ProtoReflect.Descriptor instead. func (*OwnedPositionIdsRequest) Descriptor() ([]byte, []int) { - return file_penumbra_view_v1alpha1_view_proto_rawDescGZIP(), []int{54} + return file_penumbra_view_v1alpha1_view_proto_rawDescGZIP(), []int{51} } -func (x *OwnedPositionIdsRequest) GetPositionState() *v1alpha111.PositionState { +func (x *OwnedPositionIdsRequest) GetPositionState() *v1alpha112.PositionState { if x != nil { return x.PositionState } return nil } -func (x *OwnedPositionIdsRequest) GetTradingPair() *v1alpha111.TradingPair { +func (x *OwnedPositionIdsRequest) GetTradingPair() *v1alpha112.TradingPair { if x != nil { return x.TradingPair } @@ -3194,13 +2960,13 @@ type OwnedPositionIdsResponse struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - PositionId *v1alpha111.PositionId `protobuf:"bytes,1,opt,name=position_id,json=positionId,proto3" json:"position_id,omitempty"` + PositionId *v1alpha112.PositionId `protobuf:"bytes,1,opt,name=position_id,json=positionId,proto3" json:"position_id,omitempty"` } func (x *OwnedPositionIdsResponse) Reset() { *x = OwnedPositionIdsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[55] + mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[52] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3213,7 +2979,7 @@ func (x *OwnedPositionIdsResponse) String() string { func (*OwnedPositionIdsResponse) ProtoMessage() {} func (x *OwnedPositionIdsResponse) ProtoReflect() protoreflect.Message { - mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[55] + mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[52] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3226,10 +2992,10 @@ func (x *OwnedPositionIdsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use OwnedPositionIdsResponse.ProtoReflect.Descriptor instead. func (*OwnedPositionIdsResponse) Descriptor() ([]byte, []int) { - return file_penumbra_view_v1alpha1_view_proto_rawDescGZIP(), []int{55} + return file_penumbra_view_v1alpha1_view_proto_rawDescGZIP(), []int{52} } -func (x *OwnedPositionIdsResponse) GetPositionId() *v1alpha111.PositionId { +func (x *OwnedPositionIdsResponse) GetPositionId() *v1alpha112.PositionId { if x != nil { return x.PositionId } @@ -3243,15 +3009,15 @@ type TransactionPlannerRequest_Output struct { unknownFields protoimpl.UnknownFields // The amount and denomination in which the Output is issued. - Value *v1alpha14.Value `protobuf:"bytes,1,opt,name=value,proto3" json:"value,omitempty"` + Value *v1alpha15.Value `protobuf:"bytes,1,opt,name=value,proto3" json:"value,omitempty"` // The address to which Output will be sent. - Address *v1alpha12.Address `protobuf:"bytes,2,opt,name=address,proto3" json:"address,omitempty"` + Address *v1alpha13.Address `protobuf:"bytes,2,opt,name=address,proto3" json:"address,omitempty"` } func (x *TransactionPlannerRequest_Output) Reset() { *x = TransactionPlannerRequest_Output{} if protoimpl.UnsafeEnabled { - mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[56] + mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[53] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3264,7 +3030,7 @@ func (x *TransactionPlannerRequest_Output) String() string { func (*TransactionPlannerRequest_Output) ProtoMessage() {} func (x *TransactionPlannerRequest_Output) ProtoReflect() protoreflect.Message { - mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[56] + mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[53] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3280,14 +3046,14 @@ func (*TransactionPlannerRequest_Output) Descriptor() ([]byte, []int) { return file_penumbra_view_v1alpha1_view_proto_rawDescGZIP(), []int{4, 0} } -func (x *TransactionPlannerRequest_Output) GetValue() *v1alpha14.Value { +func (x *TransactionPlannerRequest_Output) GetValue() *v1alpha15.Value { if x != nil { return x.Value } return nil } -func (x *TransactionPlannerRequest_Output) GetAddress() *v1alpha12.Address { +func (x *TransactionPlannerRequest_Output) GetAddress() *v1alpha13.Address { if x != nil { return x.Address } @@ -3300,19 +3066,19 @@ type TransactionPlannerRequest_Swap struct { unknownFields protoimpl.UnknownFields // The input amount and denomination to be traded in the Swap. - Value *v1alpha14.Value `protobuf:"bytes,1,opt,name=value,proto3" json:"value,omitempty"` + Value *v1alpha15.Value `protobuf:"bytes,1,opt,name=value,proto3" json:"value,omitempty"` // The denomination to be received as a Output of the Swap. - TargetAsset *v1alpha14.AssetId `protobuf:"bytes,2,opt,name=target_asset,json=targetAsset,proto3" json:"target_asset,omitempty"` + TargetAsset *v1alpha15.AssetId `protobuf:"bytes,2,opt,name=target_asset,json=targetAsset,proto3" json:"target_asset,omitempty"` // The pre-paid fee to be paid for claiming the Swap outputs. - Fee *v1alpha11.Fee `protobuf:"bytes,3,opt,name=fee,proto3" json:"fee,omitempty"` + Fee *v1alpha12.Fee `protobuf:"bytes,3,opt,name=fee,proto3" json:"fee,omitempty"` // The address to which swap claim output will be sent. - ClaimAddress *v1alpha12.Address `protobuf:"bytes,4,opt,name=claim_address,json=claimAddress,proto3" json:"claim_address,omitempty"` + ClaimAddress *v1alpha13.Address `protobuf:"bytes,4,opt,name=claim_address,json=claimAddress,proto3" json:"claim_address,omitempty"` } func (x *TransactionPlannerRequest_Swap) Reset() { *x = TransactionPlannerRequest_Swap{} if protoimpl.UnsafeEnabled { - mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[57] + mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[54] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3325,7 +3091,7 @@ func (x *TransactionPlannerRequest_Swap) String() string { func (*TransactionPlannerRequest_Swap) ProtoMessage() {} func (x *TransactionPlannerRequest_Swap) ProtoReflect() protoreflect.Message { - mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[57] + mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[54] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3341,28 +3107,28 @@ func (*TransactionPlannerRequest_Swap) Descriptor() ([]byte, []int) { return file_penumbra_view_v1alpha1_view_proto_rawDescGZIP(), []int{4, 1} } -func (x *TransactionPlannerRequest_Swap) GetValue() *v1alpha14.Value { +func (x *TransactionPlannerRequest_Swap) GetValue() *v1alpha15.Value { if x != nil { return x.Value } return nil } -func (x *TransactionPlannerRequest_Swap) GetTargetAsset() *v1alpha14.AssetId { +func (x *TransactionPlannerRequest_Swap) GetTargetAsset() *v1alpha15.AssetId { if x != nil { return x.TargetAsset } return nil } -func (x *TransactionPlannerRequest_Swap) GetFee() *v1alpha11.Fee { +func (x *TransactionPlannerRequest_Swap) GetFee() *v1alpha12.Fee { if x != nil { return x.Fee } return nil } -func (x *TransactionPlannerRequest_Swap) GetClaimAddress() *v1alpha12.Address { +func (x *TransactionPlannerRequest_Swap) GetClaimAddress() *v1alpha13.Address { if x != nil { return x.ClaimAddress } @@ -3377,13 +3143,13 @@ type TransactionPlannerRequest_SwapClaim struct { // SwapCommitment to identify the Swap to be claimed. // Use the commitment from the Swap message: // penumbra.core.component.dex.v1alpha1.Swap.body.payload.commitment. - SwapCommitment *v1alpha16.StateCommitment `protobuf:"bytes,1,opt,name=swap_commitment,json=swapCommitment,proto3" json:"swap_commitment,omitempty"` + SwapCommitment *v1alpha17.StateCommitment `protobuf:"bytes,1,opt,name=swap_commitment,json=swapCommitment,proto3" json:"swap_commitment,omitempty"` } func (x *TransactionPlannerRequest_SwapClaim) Reset() { *x = TransactionPlannerRequest_SwapClaim{} if protoimpl.UnsafeEnabled { - mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[58] + mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[55] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3396,7 +3162,7 @@ func (x *TransactionPlannerRequest_SwapClaim) String() string { func (*TransactionPlannerRequest_SwapClaim) ProtoMessage() {} func (x *TransactionPlannerRequest_SwapClaim) ProtoReflect() protoreflect.Message { - mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[58] + mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[55] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3412,7 +3178,7 @@ func (*TransactionPlannerRequest_SwapClaim) Descriptor() ([]byte, []int) { return file_penumbra_view_v1alpha1_view_proto_rawDescGZIP(), []int{4, 2} } -func (x *TransactionPlannerRequest_SwapClaim) GetSwapCommitment() *v1alpha16.StateCommitment { +func (x *TransactionPlannerRequest_SwapClaim) GetSwapCommitment() *v1alpha17.StateCommitment { if x != nil { return x.SwapCommitment } @@ -3424,14 +3190,14 @@ type TransactionPlannerRequest_Delegate struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Amount *v1alpha15.Amount `protobuf:"bytes,1,opt,name=amount,proto3" json:"amount,omitempty"` - RateData *v1alpha112.RateData `protobuf:"bytes,3,opt,name=rate_data,json=rateData,proto3" json:"rate_data,omitempty"` + Amount *v1alpha16.Amount `protobuf:"bytes,1,opt,name=amount,proto3" json:"amount,omitempty"` + RateData *v1alpha113.RateData `protobuf:"bytes,3,opt,name=rate_data,json=rateData,proto3" json:"rate_data,omitempty"` } func (x *TransactionPlannerRequest_Delegate) Reset() { *x = TransactionPlannerRequest_Delegate{} if protoimpl.UnsafeEnabled { - mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[59] + mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[56] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3444,7 +3210,7 @@ func (x *TransactionPlannerRequest_Delegate) String() string { func (*TransactionPlannerRequest_Delegate) ProtoMessage() {} func (x *TransactionPlannerRequest_Delegate) ProtoReflect() protoreflect.Message { - mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[59] + mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[56] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3460,14 +3226,14 @@ func (*TransactionPlannerRequest_Delegate) Descriptor() ([]byte, []int) { return file_penumbra_view_v1alpha1_view_proto_rawDescGZIP(), []int{4, 3} } -func (x *TransactionPlannerRequest_Delegate) GetAmount() *v1alpha15.Amount { +func (x *TransactionPlannerRequest_Delegate) GetAmount() *v1alpha16.Amount { if x != nil { return x.Amount } return nil } -func (x *TransactionPlannerRequest_Delegate) GetRateData() *v1alpha112.RateData { +func (x *TransactionPlannerRequest_Delegate) GetRateData() *v1alpha113.RateData { if x != nil { return x.RateData } @@ -3479,14 +3245,14 @@ type TransactionPlannerRequest_Undelegate struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Value *v1alpha14.Value `protobuf:"bytes,1,opt,name=value,proto3" json:"value,omitempty"` - RateData *v1alpha112.RateData `protobuf:"bytes,2,opt,name=rate_data,json=rateData,proto3" json:"rate_data,omitempty"` + Value *v1alpha15.Value `protobuf:"bytes,1,opt,name=value,proto3" json:"value,omitempty"` + RateData *v1alpha113.RateData `protobuf:"bytes,2,opt,name=rate_data,json=rateData,proto3" json:"rate_data,omitempty"` } func (x *TransactionPlannerRequest_Undelegate) Reset() { *x = TransactionPlannerRequest_Undelegate{} if protoimpl.UnsafeEnabled { - mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[60] + mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[57] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3499,7 +3265,7 @@ func (x *TransactionPlannerRequest_Undelegate) String() string { func (*TransactionPlannerRequest_Undelegate) ProtoMessage() {} func (x *TransactionPlannerRequest_Undelegate) ProtoReflect() protoreflect.Message { - mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[60] + mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[57] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3515,14 +3281,14 @@ func (*TransactionPlannerRequest_Undelegate) Descriptor() ([]byte, []int) { return file_penumbra_view_v1alpha1_view_proto_rawDescGZIP(), []int{4, 4} } -func (x *TransactionPlannerRequest_Undelegate) GetValue() *v1alpha14.Value { +func (x *TransactionPlannerRequest_Undelegate) GetValue() *v1alpha15.Value { if x != nil { return x.Value } return nil } -func (x *TransactionPlannerRequest_Undelegate) GetRateData() *v1alpha112.RateData { +func (x *TransactionPlannerRequest_Undelegate) GetRateData() *v1alpha113.RateData { if x != nil { return x.RateData } @@ -3538,13 +3304,13 @@ type TransactionPlannerRequest_PositionOpen struct { // // Positions are immutable, so the `PositionData` (and hence the `PositionId`) // are unchanged over the entire lifetime of the position. - Position *v1alpha111.Position `protobuf:"bytes,1,opt,name=position,proto3" json:"position,omitempty"` + Position *v1alpha112.Position `protobuf:"bytes,1,opt,name=position,proto3" json:"position,omitempty"` } func (x *TransactionPlannerRequest_PositionOpen) Reset() { *x = TransactionPlannerRequest_PositionOpen{} if protoimpl.UnsafeEnabled { - mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[61] + mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[58] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3557,7 +3323,7 @@ func (x *TransactionPlannerRequest_PositionOpen) String() string { func (*TransactionPlannerRequest_PositionOpen) ProtoMessage() {} func (x *TransactionPlannerRequest_PositionOpen) ProtoReflect() protoreflect.Message { - mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[61] + mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[58] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3573,7 +3339,7 @@ func (*TransactionPlannerRequest_PositionOpen) Descriptor() ([]byte, []int) { return file_penumbra_view_v1alpha1_view_proto_rawDescGZIP(), []int{4, 5} } -func (x *TransactionPlannerRequest_PositionOpen) GetPosition() *v1alpha111.Position { +func (x *TransactionPlannerRequest_PositionOpen) GetPosition() *v1alpha112.Position { if x != nil { return x.Position } @@ -3586,13 +3352,13 @@ type TransactionPlannerRequest_PositionClose struct { unknownFields protoimpl.UnknownFields // The position to close. - PositionId *v1alpha111.PositionId `protobuf:"bytes,1,opt,name=position_id,json=positionId,proto3" json:"position_id,omitempty"` + PositionId *v1alpha112.PositionId `protobuf:"bytes,1,opt,name=position_id,json=positionId,proto3" json:"position_id,omitempty"` } func (x *TransactionPlannerRequest_PositionClose) Reset() { *x = TransactionPlannerRequest_PositionClose{} if protoimpl.UnsafeEnabled { - mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[62] + mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[59] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3605,7 +3371,7 @@ func (x *TransactionPlannerRequest_PositionClose) String() string { func (*TransactionPlannerRequest_PositionClose) ProtoMessage() {} func (x *TransactionPlannerRequest_PositionClose) ProtoReflect() protoreflect.Message { - mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[62] + mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[59] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3621,7 +3387,7 @@ func (*TransactionPlannerRequest_PositionClose) Descriptor() ([]byte, []int) { return file_penumbra_view_v1alpha1_view_proto_rawDescGZIP(), []int{4, 6} } -func (x *TransactionPlannerRequest_PositionClose) GetPositionId() *v1alpha111.PositionId { +func (x *TransactionPlannerRequest_PositionClose) GetPositionId() *v1alpha112.PositionId { if x != nil { return x.PositionId } @@ -3634,17 +3400,17 @@ type TransactionPlannerRequest_PositionWithdraw struct { unknownFields protoimpl.UnknownFields // The position to withdraw. - PositionId *v1alpha111.PositionId `protobuf:"bytes,1,opt,name=position_id,json=positionId,proto3" json:"position_id,omitempty"` + PositionId *v1alpha112.PositionId `protobuf:"bytes,1,opt,name=position_id,json=positionId,proto3" json:"position_id,omitempty"` // The position's final reserves. - Reserves *v1alpha111.Reserves `protobuf:"bytes,2,opt,name=reserves,proto3" json:"reserves,omitempty"` + Reserves *v1alpha112.Reserves `protobuf:"bytes,2,opt,name=reserves,proto3" json:"reserves,omitempty"` // The trading pair of the position. - TradingPair *v1alpha111.TradingPair `protobuf:"bytes,3,opt,name=trading_pair,json=tradingPair,proto3" json:"trading_pair,omitempty"` + TradingPair *v1alpha112.TradingPair `protobuf:"bytes,3,opt,name=trading_pair,json=tradingPair,proto3" json:"trading_pair,omitempty"` } func (x *TransactionPlannerRequest_PositionWithdraw) Reset() { *x = TransactionPlannerRequest_PositionWithdraw{} if protoimpl.UnsafeEnabled { - mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[63] + mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[60] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3657,7 +3423,7 @@ func (x *TransactionPlannerRequest_PositionWithdraw) String() string { func (*TransactionPlannerRequest_PositionWithdraw) ProtoMessage() {} func (x *TransactionPlannerRequest_PositionWithdraw) ProtoReflect() protoreflect.Message { - mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[63] + mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[60] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3673,21 +3439,21 @@ func (*TransactionPlannerRequest_PositionWithdraw) Descriptor() ([]byte, []int) return file_penumbra_view_v1alpha1_view_proto_rawDescGZIP(), []int{4, 7} } -func (x *TransactionPlannerRequest_PositionWithdraw) GetPositionId() *v1alpha111.PositionId { +func (x *TransactionPlannerRequest_PositionWithdraw) GetPositionId() *v1alpha112.PositionId { if x != nil { return x.PositionId } return nil } -func (x *TransactionPlannerRequest_PositionWithdraw) GetReserves() *v1alpha111.Reserves { +func (x *TransactionPlannerRequest_PositionWithdraw) GetReserves() *v1alpha112.Reserves { if x != nil { return x.Reserves } return nil } -func (x *TransactionPlannerRequest_PositionWithdraw) GetTradingPair() *v1alpha111.TradingPair { +func (x *TransactionPlannerRequest_PositionWithdraw) GetTradingPair() *v1alpha112.TradingPair { if x != nil { return x.TradingPair } @@ -3736,301 +3502,283 @@ var file_penumbra_view_v1alpha1_view_proto_rawDesc = []byte{ 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x34, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x26, 0x70, 0x65, 0x6e, - 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2f, 0x63, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x2f, 0x74, 0x63, 0x74, - 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x74, 0x63, 0x74, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x22, 0xe0, 0x01, 0x0a, 0x18, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, - 0x65, 0x41, 0x6e, 0x64, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x5e, 0x0a, 0x10, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, - 0x70, 0x6c, 0x61, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x70, 0x65, 0x6e, - 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, - 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, - 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6c, 0x61, 0x6e, 0x52, - 0x0f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6c, 0x61, 0x6e, - 0x12, 0x64, 0x0a, 0x12, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x70, - 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72, 0x61, - 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, - 0x31, 0x2e, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, - 0x61, 0x74, 0x61, 0x52, 0x11, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x22, 0x6e, 0x0a, 0x19, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, - 0x69, 0x7a, 0x65, 0x41, 0x6e, 0x64, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x51, 0x0a, 0x0b, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x2a, 0x70, 0x65, 0x6e, + 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x74, 0x78, 0x68, 0x61, 0x73, + 0x68, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x74, 0x78, 0x68, 0x61, 0x73, + 0x68, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x26, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, + 0x61, 0x2f, 0x63, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x2f, 0x74, 0x63, 0x74, 0x2f, 0x76, 0x31, 0x61, + 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x74, 0x63, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, + 0xe0, 0x01, 0x0a, 0x18, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x65, 0x41, 0x6e, 0x64, + 0x42, 0x75, 0x69, 0x6c, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x5e, 0x0a, 0x10, + 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x6c, 0x61, 0x6e, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, + 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x54, 0x72, 0x61, 0x6e, + 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6c, 0x61, 0x6e, 0x52, 0x0f, 0x74, 0x72, 0x61, + 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6c, 0x61, 0x6e, 0x12, 0x64, 0x0a, 0x12, + 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x61, + 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x54, 0x72, - 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x74, 0x72, 0x61, 0x6e, 0x73, - 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x99, 0x01, 0x0a, 0x1b, 0x42, 0x72, 0x6f, 0x61, 0x64, - 0x63, 0x61, 0x73, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x51, 0x0a, 0x0b, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x70, 0x65, - 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, - 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, - 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x74, 0x72, - 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x27, 0x0a, 0x0f, 0x61, 0x77, 0x61, - 0x69, 0x74, 0x5f, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x0e, 0x61, 0x77, 0x61, 0x69, 0x74, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x22, 0x81, 0x01, 0x0a, 0x1c, 0x42, 0x72, 0x6f, 0x61, 0x64, 0x63, 0x61, 0x73, 0x74, - 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x36, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x26, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, - 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x61, 0x6c, - 0x70, 0x68, 0x61, 0x31, 0x2e, 0x49, 0x64, 0x52, 0x02, 0x69, 0x64, 0x12, 0x29, 0x0a, 0x10, 0x64, - 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0f, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x22, 0x8d, 0x14, 0x0a, 0x19, 0x54, 0x72, 0x61, 0x6e, 0x73, - 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x65, 0x78, 0x70, 0x69, 0x72, 0x79, 0x5f, 0x68, - 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x65, 0x78, 0x70, - 0x69, 0x72, 0x79, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x3b, 0x0a, 0x03, 0x66, 0x65, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, - 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, - 0x2e, 0x66, 0x65, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x46, 0x65, - 0x65, 0x52, 0x03, 0x66, 0x65, 0x65, 0x12, 0x45, 0x0a, 0x04, 0x6d, 0x65, 0x6d, 0x6f, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, + 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x41, 0x75, + 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x52, + 0x11, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, + 0x74, 0x61, 0x22, 0x6e, 0x0a, 0x19, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x65, 0x41, + 0x6e, 0x64, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x51, 0x0a, 0x0b, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4d, 0x65, 0x6d, 0x6f, 0x50, 0x6c, - 0x61, 0x69, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x52, 0x04, 0x6d, 0x65, 0x6d, 0x6f, 0x12, 0x41, 0x0a, - 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, - 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6b, 0x65, - 0x79, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x72, - 0x65, 0x73, 0x73, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x12, 0x42, 0x0a, 0x09, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x0e, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, - 0x6f, 0x72, 0x65, 0x2e, 0x6b, 0x65, 0x79, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, - 0x31, 0x2e, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x49, 0x64, 0x52, 0x08, 0x77, 0x61, 0x6c, 0x6c, - 0x65, 0x74, 0x49, 0x64, 0x12, 0x52, 0x0a, 0x07, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x73, 0x18, - 0x14, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, + 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x99, 0x01, 0x0a, 0x1b, 0x42, 0x72, 0x6f, 0x61, 0x64, 0x63, 0x61, 0x73, 0x74, + 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x51, 0x0a, 0x0b, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, + 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x54, 0x72, 0x61, + 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x27, 0x0a, 0x0f, 0x61, 0x77, 0x61, 0x69, 0x74, 0x5f, 0x64, + 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, + 0x61, 0x77, 0x61, 0x69, 0x74, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x87, + 0x01, 0x0a, 0x1c, 0x42, 0x72, 0x6f, 0x61, 0x64, 0x63, 0x61, 0x73, 0x74, 0x54, 0x72, 0x61, 0x6e, + 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x3c, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x70, 0x65, + 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x78, 0x68, 0x61, + 0x73, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x54, 0x72, 0x61, 0x6e, + 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x52, 0x02, 0x69, 0x64, 0x12, 0x29, 0x0a, + 0x10, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, + 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0f, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x22, 0xc9, 0x13, 0x0a, 0x19, 0x54, 0x72, 0x61, + 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x65, 0x78, 0x70, 0x69, 0x72, 0x79, + 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x65, + 0x78, 0x70, 0x69, 0x72, 0x79, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x3b, 0x0a, 0x03, 0x66, + 0x65, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, + 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, + 0x6e, 0x74, 0x2e, 0x66, 0x65, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, + 0x46, 0x65, 0x65, 0x52, 0x03, 0x66, 0x65, 0x65, 0x12, 0x45, 0x0a, 0x04, 0x6d, 0x65, 0x6d, 0x6f, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, + 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4d, 0x65, 0x6d, 0x6f, + 0x50, 0x6c, 0x61, 0x69, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x52, 0x04, 0x6d, 0x65, 0x6d, 0x6f, 0x12, + 0x41, 0x0a, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x29, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, + 0x6b, 0x65, 0x79, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x41, 0x64, + 0x64, 0x72, 0x65, 0x73, 0x73, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x06, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x12, 0x52, 0x0a, 0x07, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x73, 0x18, 0x14, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x76, + 0x69, 0x65, 0x77, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x54, 0x72, 0x61, + 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x52, 0x07, 0x6f, + 0x75, 0x74, 0x70, 0x75, 0x74, 0x73, 0x12, 0x4c, 0x0a, 0x05, 0x73, 0x77, 0x61, 0x70, 0x73, 0x18, + 0x1e, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x76, 0x69, 0x65, 0x77, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6c, 0x61, 0x6e, 0x6e, 0x65, - 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x52, - 0x07, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x73, 0x12, 0x4c, 0x0a, 0x05, 0x73, 0x77, 0x61, 0x70, - 0x73, 0x18, 0x1e, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, - 0x72, 0x61, 0x2e, 0x76, 0x69, 0x65, 0x77, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, - 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6c, 0x61, 0x6e, - 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x53, 0x77, 0x61, 0x70, 0x52, - 0x05, 0x73, 0x77, 0x61, 0x70, 0x73, 0x12, 0x5c, 0x0a, 0x0b, 0x73, 0x77, 0x61, 0x70, 0x5f, 0x63, - 0x6c, 0x61, 0x69, 0x6d, 0x73, 0x18, 0x1f, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3b, 0x2e, 0x70, 0x65, - 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x76, 0x69, 0x65, 0x77, 0x2e, 0x76, 0x31, 0x61, 0x6c, - 0x70, 0x68, 0x61, 0x31, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x50, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x53, - 0x77, 0x61, 0x70, 0x43, 0x6c, 0x61, 0x69, 0x6d, 0x52, 0x0a, 0x73, 0x77, 0x61, 0x70, 0x43, 0x6c, - 0x61, 0x69, 0x6d, 0x73, 0x12, 0x5c, 0x0a, 0x0b, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x18, 0x28, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x70, 0x65, 0x6e, 0x75, + 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x53, 0x77, 0x61, 0x70, 0x52, 0x05, 0x73, + 0x77, 0x61, 0x70, 0x73, 0x12, 0x5c, 0x0a, 0x0b, 0x73, 0x77, 0x61, 0x70, 0x5f, 0x63, 0x6c, 0x61, + 0x69, 0x6d, 0x73, 0x18, 0x1f, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3b, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x76, 0x69, 0x65, 0x77, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6c, - 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x44, 0x65, 0x6c, - 0x65, 0x67, 0x61, 0x74, 0x65, 0x52, 0x0b, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x12, 0x62, 0x0a, 0x0d, 0x75, 0x6e, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x18, 0x32, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3c, 0x2e, 0x70, 0x65, 0x6e, 0x75, - 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x76, 0x69, 0x65, 0x77, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, - 0x61, 0x31, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6c, - 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x55, 0x6e, 0x64, - 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x65, 0x52, 0x0d, 0x75, 0x6e, 0x64, 0x65, 0x6c, 0x65, 0x67, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x5a, 0x0a, 0x11, 0x69, 0x62, 0x63, 0x5f, 0x72, 0x65, - 0x6c, 0x61, 0x79, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x3c, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x2e, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, - 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x69, 0x62, 0x63, 0x2e, - 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x49, 0x62, 0x63, 0x52, 0x65, 0x6c, 0x61, - 0x79, 0x52, 0x0f, 0x69, 0x62, 0x63, 0x52, 0x65, 0x6c, 0x61, 0x79, 0x41, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x12, 0x62, 0x0a, 0x11, 0x69, 0x63, 0x73, 0x32, 0x30, 0x5f, 0x77, 0x69, 0x74, 0x68, - 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x73, 0x18, 0x3d, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x35, 0x2e, - 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, - 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x69, 0x62, 0x63, 0x2e, 0x76, 0x31, 0x61, 0x6c, - 0x70, 0x68, 0x61, 0x31, 0x2e, 0x49, 0x63, 0x73, 0x32, 0x30, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, - 0x61, 0x77, 0x61, 0x6c, 0x52, 0x10, 0x69, 0x63, 0x73, 0x32, 0x30, 0x57, 0x69, 0x74, 0x68, 0x64, - 0x72, 0x61, 0x77, 0x61, 0x6c, 0x73, 0x12, 0x65, 0x0a, 0x0e, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, - 0x6f, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x73, 0x18, 0x46, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3e, - 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x76, 0x69, 0x65, 0x77, 0x2e, 0x76, - 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x50, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x2e, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x4f, 0x70, 0x65, 0x6e, 0x52, 0x0d, - 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x4f, 0x70, 0x65, 0x6e, 0x73, 0x12, 0x68, 0x0a, - 0x0f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x73, - 0x18, 0x47, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3f, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, - 0x61, 0x2e, 0x76, 0x69, 0x65, 0x77, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, - 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6c, 0x61, 0x6e, 0x6e, - 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, - 0x6f, 0x6e, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x52, 0x0e, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, - 0x6e, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x73, 0x12, 0x71, 0x0a, 0x12, 0x70, 0x6f, 0x73, 0x69, 0x74, - 0x69, 0x6f, 0x6e, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x73, 0x18, 0x48, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x42, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x76, - 0x69, 0x65, 0x77, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x54, 0x72, 0x61, - 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x57, - 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x52, 0x11, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, - 0x6e, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x73, 0x1a, 0x83, 0x01, 0x0a, 0x06, 0x4f, - 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x39, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, - 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, - 0x68, 0x61, 0x31, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x12, 0x3e, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x24, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, - 0x65, 0x2e, 0x6b, 0x65, 0x79, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, - 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, - 0x1a, 0x93, 0x02, 0x0a, 0x04, 0x53, 0x77, 0x61, 0x70, 0x12, 0x39, 0x0a, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, - 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x74, 0x2e, 0x76, - 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x12, 0x48, 0x0a, 0x0c, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x61, - 0x73, 0x73, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x70, 0x65, 0x6e, - 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x74, - 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x49, - 0x64, 0x52, 0x0b, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x41, 0x73, 0x73, 0x65, 0x74, 0x12, 0x3b, - 0x0a, 0x03, 0x66, 0x65, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x70, 0x65, + 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x53, 0x77, 0x61, + 0x70, 0x43, 0x6c, 0x61, 0x69, 0x6d, 0x52, 0x0a, 0x73, 0x77, 0x61, 0x70, 0x43, 0x6c, 0x61, 0x69, + 0x6d, 0x73, 0x12, 0x5c, 0x0a, 0x0b, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x18, 0x28, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, + 0x72, 0x61, 0x2e, 0x76, 0x69, 0x65, 0x77, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, + 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6c, 0x61, 0x6e, + 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x67, + 0x61, 0x74, 0x65, 0x52, 0x0b, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x12, 0x62, 0x0a, 0x0d, 0x75, 0x6e, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x18, 0x32, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3c, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, + 0x72, 0x61, 0x2e, 0x76, 0x69, 0x65, 0x77, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, + 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6c, 0x61, 0x6e, + 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x55, 0x6e, 0x64, 0x65, 0x6c, + 0x65, 0x67, 0x61, 0x74, 0x65, 0x52, 0x0d, 0x75, 0x6e, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x5a, 0x0a, 0x11, 0x69, 0x62, 0x63, 0x5f, 0x72, 0x65, 0x6c, 0x61, + 0x79, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x3c, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x2e, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, + 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x69, 0x62, 0x63, 0x2e, 0x76, 0x31, + 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x49, 0x62, 0x63, 0x52, 0x65, 0x6c, 0x61, 0x79, 0x52, + 0x0f, 0x69, 0x62, 0x63, 0x52, 0x65, 0x6c, 0x61, 0x79, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x12, 0x62, 0x0a, 0x11, 0x69, 0x63, 0x73, 0x32, 0x30, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x64, 0x72, + 0x61, 0x77, 0x61, 0x6c, 0x73, 0x18, 0x3d, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, - 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x66, 0x65, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, - 0x61, 0x31, 0x2e, 0x46, 0x65, 0x65, 0x52, 0x03, 0x66, 0x65, 0x65, 0x12, 0x49, 0x0a, 0x0d, 0x63, - 0x6c, 0x61, 0x69, 0x6d, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, - 0x72, 0x65, 0x2e, 0x6b, 0x65, 0x79, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, - 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x0c, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x41, - 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x1a, 0x63, 0x0a, 0x09, 0x53, 0x77, 0x61, 0x70, 0x43, 0x6c, - 0x61, 0x69, 0x6d, 0x12, 0x56, 0x0a, 0x0f, 0x73, 0x77, 0x61, 0x70, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, - 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x70, - 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x2e, 0x74, - 0x63, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x74, - 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0e, 0x73, 0x77, 0x61, - 0x70, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x1a, 0x95, 0x01, 0x0a, 0x08, - 0x44, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x65, 0x12, 0x3a, 0x0a, 0x06, 0x61, 0x6d, 0x6f, 0x75, - 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, - 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6e, 0x75, 0x6d, 0x2e, 0x76, 0x31, 0x61, - 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x06, 0x61, 0x6d, - 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x4d, 0x0a, 0x09, 0x72, 0x61, 0x74, 0x65, 0x5f, 0x64, 0x61, 0x74, - 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, - 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, - 0x74, 0x2e, 0x73, 0x74, 0x61, 0x6b, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, - 0x2e, 0x52, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x52, 0x08, 0x72, 0x61, 0x74, 0x65, 0x44, - 0x61, 0x74, 0x61, 0x1a, 0x96, 0x01, 0x0a, 0x0a, 0x55, 0x6e, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, - 0x74, 0x65, 0x12, 0x39, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x23, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, - 0x65, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, - 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x4d, 0x0a, - 0x09, 0x72, 0x61, 0x74, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x30, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, - 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x74, 0x61, 0x6b, 0x65, - 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x52, 0x61, 0x74, 0x65, 0x44, 0x61, - 0x74, 0x61, 0x52, 0x08, 0x72, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x1a, 0x5a, 0x0a, 0x0c, - 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x4f, 0x70, 0x65, 0x6e, 0x12, 0x4a, 0x0a, 0x08, - 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, - 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, - 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x64, 0x65, 0x78, 0x2e, 0x76, 0x31, 0x61, - 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x08, - 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x62, 0x0a, 0x0d, 0x50, 0x6f, 0x73, 0x69, - 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x12, 0x51, 0x0a, 0x0b, 0x70, 0x6f, 0x73, - 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, - 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, - 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x64, 0x65, 0x78, 0x2e, 0x76, 0x31, 0x61, - 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, - 0x52, 0x0a, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x1a, 0x87, 0x02, 0x0a, - 0x10, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, - 0x77, 0x12, 0x51, 0x0a, 0x0b, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, - 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, - 0x2e, 0x64, 0x65, 0x78, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x6f, - 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x52, 0x0a, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, - 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x4a, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x73, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, - 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, - 0x2e, 0x64, 0x65, 0x78, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x52, 0x65, - 0x73, 0x65, 0x72, 0x76, 0x65, 0x73, 0x52, 0x08, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x73, - 0x12, 0x54, 0x0a, 0x0c, 0x74, 0x72, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x61, 0x69, 0x72, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, - 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, - 0x2e, 0x64, 0x65, 0x78, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x54, 0x72, - 0x61, 0x64, 0x69, 0x6e, 0x67, 0x50, 0x61, 0x69, 0x72, 0x52, 0x0b, 0x74, 0x72, 0x61, 0x64, 0x69, - 0x6e, 0x67, 0x50, 0x61, 0x69, 0x72, 0x22, 0x65, 0x0a, 0x1a, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x47, 0x0a, 0x04, 0x70, 0x6c, 0x61, 0x6e, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, - 0x72, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, - 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x50, 0x6c, 0x61, 0x6e, 0x52, 0x04, 0x70, 0x6c, 0x61, 0x6e, 0x22, 0x67, 0x0a, - 0x15, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x42, 0x79, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x4e, 0x0a, 0x0d, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, - 0x73, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, - 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6b, 0x65, - 0x79, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x72, - 0x65, 0x73, 0x73, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x0c, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, - 0x73, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x58, 0x0a, 0x16, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, - 0x73, 0x42, 0x79, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x3e, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x24, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, - 0x65, 0x2e, 0x6b, 0x65, 0x79, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, - 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, - 0x22, 0x11, 0x0a, 0x0f, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x49, 0x64, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x22, 0x56, 0x0a, 0x10, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x49, 0x64, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x42, 0x0a, 0x09, 0x77, 0x61, 0x6c, 0x6c, 0x65, - 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x70, 0x65, 0x6e, - 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6b, 0x65, 0x79, 0x73, 0x2e, - 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x49, - 0x64, 0x52, 0x08, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x49, 0x64, 0x22, 0x57, 0x0a, 0x15, 0x49, - 0x6e, 0x64, 0x65, 0x78, 0x42, 0x79, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x3e, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, - 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6b, 0x65, 0x79, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, - 0x68, 0x61, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x07, 0x61, 0x64, 0x64, - 0x72, 0x65, 0x73, 0x73, 0x22, 0x68, 0x0a, 0x16, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x42, 0x79, 0x41, - 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4e, - 0x0a, 0x0d, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, - 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6b, 0x65, 0x79, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, - 0x68, 0x61, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x49, 0x6e, 0x64, 0x65, 0x78, - 0x52, 0x0c, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x92, - 0x01, 0x0a, 0x17, 0x45, 0x70, 0x68, 0x65, 0x6d, 0x65, 0x72, 0x61, 0x6c, 0x41, 0x64, 0x64, 0x72, - 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x4e, 0x0a, 0x0d, 0x61, 0x64, - 0x64, 0x72, 0x65, 0x73, 0x73, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x29, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, - 0x65, 0x2e, 0x6b, 0x65, 0x79, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, - 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x0c, 0x61, 0x64, - 0x64, 0x72, 0x65, 0x73, 0x73, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x27, 0x0a, 0x0f, 0x64, 0x69, - 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x0e, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x43, 0x6f, 0x6e, 0x66, - 0x69, 0x72, 0x6d, 0x22, 0x5a, 0x0a, 0x18, 0x45, 0x70, 0x68, 0x65, 0x6d, 0x65, 0x72, 0x61, 0x6c, - 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x3e, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x69, 0x62, 0x63, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, + 0x61, 0x31, 0x2e, 0x49, 0x63, 0x73, 0x32, 0x30, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, + 0x61, 0x6c, 0x52, 0x10, 0x69, 0x63, 0x73, 0x32, 0x30, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, + 0x77, 0x61, 0x6c, 0x73, 0x12, 0x65, 0x0a, 0x0e, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x73, 0x18, 0x46, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3e, 0x2e, 0x70, + 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x76, 0x69, 0x65, 0x77, 0x2e, 0x76, 0x31, 0x61, + 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x50, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, + 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x4f, 0x70, 0x65, 0x6e, 0x52, 0x0d, 0x70, 0x6f, + 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x4f, 0x70, 0x65, 0x6e, 0x73, 0x12, 0x68, 0x0a, 0x0f, 0x70, + 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x73, 0x18, 0x47, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3f, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, + 0x76, 0x69, 0x65, 0x77, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x54, 0x72, + 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x72, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x52, 0x0e, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x43, + 0x6c, 0x6f, 0x73, 0x65, 0x73, 0x12, 0x71, 0x0a, 0x12, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, + 0x6e, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x73, 0x18, 0x48, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x42, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x76, 0x69, 0x65, + 0x77, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, + 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x69, 0x74, + 0x68, 0x64, 0x72, 0x61, 0x77, 0x52, 0x11, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x57, + 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x73, 0x1a, 0x83, 0x01, 0x0a, 0x06, 0x4f, 0x75, 0x74, + 0x70, 0x75, 0x74, 0x12, 0x39, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, + 0x72, 0x65, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, + 0x31, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x3e, + 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x24, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, + 0x6b, 0x65, 0x79, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x41, 0x64, + 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x1a, 0x93, + 0x02, 0x0a, 0x04, 0x53, 0x77, 0x61, 0x70, 0x12, 0x39, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, + 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x74, 0x2e, 0x76, 0x31, 0x61, + 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x12, 0x48, 0x0a, 0x0c, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x61, 0x73, 0x73, + 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, + 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x74, 0x2e, 0x76, + 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x49, 0x64, 0x52, + 0x0b, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x41, 0x73, 0x73, 0x65, 0x74, 0x12, 0x3b, 0x0a, 0x03, + 0x66, 0x65, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x70, 0x65, 0x6e, 0x75, + 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, + 0x65, 0x6e, 0x74, 0x2e, 0x66, 0x65, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, + 0x2e, 0x46, 0x65, 0x65, 0x52, 0x03, 0x66, 0x65, 0x65, 0x12, 0x49, 0x0a, 0x0d, 0x63, 0x6c, 0x61, + 0x69, 0x6d, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6b, 0x65, 0x79, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x41, - 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x22, - 0xb2, 0x01, 0x0a, 0x0f, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x50, 0x0a, 0x0e, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x66, - 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x70, 0x65, - 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6b, 0x65, 0x79, 0x73, - 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, - 0x73, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x0d, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x46, - 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x4d, 0x0a, 0x0f, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x69, - 0x64, 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, - 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, - 0x73, 0x73, 0x65, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x41, 0x73, - 0x73, 0x65, 0x74, 0x49, 0x64, 0x52, 0x0d, 0x61, 0x73, 0x73, 0x65, 0x74, 0x49, 0x64, 0x46, 0x69, - 0x6c, 0x74, 0x65, 0x72, 0x22, 0x96, 0x01, 0x0a, 0x10, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x43, 0x0a, 0x07, 0x61, 0x63, 0x63, - 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x70, 0x65, 0x6e, - 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6b, 0x65, 0x79, 0x73, 0x2e, - 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, - 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x3d, - 0x0a, 0x07, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x0c, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x41, 0x64, 0x64, + 0x72, 0x65, 0x73, 0x73, 0x1a, 0x63, 0x0a, 0x09, 0x53, 0x77, 0x61, 0x70, 0x43, 0x6c, 0x61, 0x69, + 0x6d, 0x12, 0x56, 0x0a, 0x0f, 0x73, 0x77, 0x61, 0x70, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, + 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x70, 0x65, 0x6e, + 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x2e, 0x74, 0x63, 0x74, + 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x43, + 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0e, 0x73, 0x77, 0x61, 0x70, 0x43, + 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x1a, 0x95, 0x01, 0x0a, 0x08, 0x44, 0x65, + 0x6c, 0x65, 0x67, 0x61, 0x74, 0x65, 0x12, 0x3a, 0x0a, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, + 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6e, 0x75, 0x6d, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, + 0x68, 0x61, 0x31, 0x2e, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x06, 0x61, 0x6d, 0x6f, 0x75, + 0x6e, 0x74, 0x12, 0x4d, 0x0a, 0x09, 0x72, 0x61, 0x74, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, + 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, + 0x73, 0x74, 0x61, 0x6b, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x52, + 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x52, 0x08, 0x72, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, + 0x61, 0x1a, 0x96, 0x01, 0x0a, 0x0a, 0x55, 0x6e, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x65, + 0x12, 0x39, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x56, - 0x61, 0x6c, 0x75, 0x65, 0x52, 0x07, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x22, 0x25, 0x0a, - 0x0d, 0x56, 0x69, 0x65, 0x77, 0x41, 0x75, 0x74, 0x68, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x14, - 0x0a, 0x05, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x69, - 0x6e, 0x6e, 0x65, 0x72, 0x22, 0x50, 0x0a, 0x0f, 0x56, 0x69, 0x65, 0x77, 0x41, 0x75, 0x74, 0x68, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3d, 0x0a, 0x03, 0x66, 0x76, 0x6b, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, - 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6b, 0x65, 0x79, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, - 0x61, 0x31, 0x2e, 0x46, 0x75, 0x6c, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x69, 0x6e, 0x67, 0x4b, 0x65, - 0x79, 0x52, 0x03, 0x66, 0x76, 0x6b, 0x22, 0x4f, 0x0a, 0x10, 0x56, 0x69, 0x65, 0x77, 0x41, 0x75, - 0x74, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3b, 0x0a, 0x05, 0x74, 0x6f, - 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x70, 0x65, 0x6e, 0x75, - 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x76, 0x69, 0x65, 0x77, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, - 0x61, 0x31, 0x2e, 0x56, 0x69, 0x65, 0x77, 0x41, 0x75, 0x74, 0x68, 0x54, 0x6f, 0x6b, 0x65, 0x6e, - 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x53, 0x0a, 0x0d, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x42, 0x0a, 0x09, 0x77, 0x61, 0x6c, 0x6c, - 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x70, 0x65, + 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x4d, 0x0a, 0x09, 0x72, + 0x61, 0x74, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, + 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, + 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x74, 0x61, 0x6b, 0x65, 0x2e, 0x76, + 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x52, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, + 0x52, 0x08, 0x72, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x1a, 0x5a, 0x0a, 0x0c, 0x50, 0x6f, + 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x4f, 0x70, 0x65, 0x6e, 0x12, 0x4a, 0x0a, 0x08, 0x70, 0x6f, + 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x70, + 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, + 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x64, 0x65, 0x78, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, + 0x68, 0x61, 0x31, 0x2e, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x08, 0x70, 0x6f, + 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x62, 0x0a, 0x0d, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x12, 0x51, 0x0a, 0x0b, 0x70, 0x6f, 0x73, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x70, + 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, + 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x64, 0x65, 0x78, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, + 0x68, 0x61, 0x31, 0x2e, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x52, 0x0a, + 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x1a, 0x87, 0x02, 0x0a, 0x10, 0x50, + 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x12, + 0x51, 0x0a, 0x0b, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, + 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x64, + 0x65, 0x78, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x6f, 0x73, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x52, 0x0a, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x49, 0x64, 0x12, 0x4a, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x73, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, + 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x64, + 0x65, 0x78, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x65, + 0x72, 0x76, 0x65, 0x73, 0x52, 0x08, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x73, 0x12, 0x54, + 0x0a, 0x0c, 0x74, 0x72, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x61, 0x69, 0x72, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, + 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x64, + 0x65, 0x78, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x54, 0x72, 0x61, 0x64, + 0x69, 0x6e, 0x67, 0x50, 0x61, 0x69, 0x72, 0x52, 0x0b, 0x74, 0x72, 0x61, 0x64, 0x69, 0x6e, 0x67, + 0x50, 0x61, 0x69, 0x72, 0x22, 0x65, 0x0a, 0x1a, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x50, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x47, 0x0a, 0x04, 0x70, 0x6c, 0x61, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x33, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, + 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x61, + 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x50, 0x6c, 0x61, 0x6e, 0x52, 0x04, 0x70, 0x6c, 0x61, 0x6e, 0x22, 0x67, 0x0a, 0x15, 0x41, + 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x42, 0x79, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x4e, 0x0a, 0x0d, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x5f, + 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6b, 0x65, 0x79, 0x73, - 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, - 0x49, 0x64, 0x52, 0x08, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x49, 0x64, 0x22, 0x8b, 0x01, 0x0a, + 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, + 0x73, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x0c, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x49, + 0x6e, 0x64, 0x65, 0x78, 0x22, 0x58, 0x0a, 0x16, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x42, + 0x79, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3e, + 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x24, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, + 0x6b, 0x65, 0x79, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x41, 0x64, + 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x22, 0x11, + 0x0a, 0x0f, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x49, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x22, 0x56, 0x0a, 0x10, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x49, 0x64, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x42, 0x0a, 0x09, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x5f, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, + 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6b, 0x65, 0x79, 0x73, 0x2e, 0x76, 0x31, + 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x49, 0x64, 0x52, + 0x08, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x49, 0x64, 0x22, 0x57, 0x0a, 0x15, 0x49, 0x6e, 0x64, + 0x65, 0x78, 0x42, 0x79, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x3e, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, + 0x6f, 0x72, 0x65, 0x2e, 0x6b, 0x65, 0x79, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, + 0x31, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, + 0x73, 0x73, 0x22, 0x68, 0x0a, 0x16, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x42, 0x79, 0x41, 0x64, 0x64, + 0x72, 0x65, 0x73, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4e, 0x0a, 0x0d, + 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, + 0x6f, 0x72, 0x65, 0x2e, 0x6b, 0x65, 0x79, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, + 0x31, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x0c, + 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x92, 0x01, 0x0a, + 0x17, 0x45, 0x70, 0x68, 0x65, 0x6d, 0x65, 0x72, 0x61, 0x6c, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x4e, 0x0a, 0x0d, 0x61, 0x64, 0x64, 0x72, + 0x65, 0x73, 0x73, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x29, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, + 0x6b, 0x65, 0x79, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x41, 0x64, + 0x64, 0x72, 0x65, 0x73, 0x73, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x0c, 0x61, 0x64, 0x64, 0x72, + 0x65, 0x73, 0x73, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x27, 0x0a, 0x0f, 0x64, 0x69, 0x73, 0x70, + 0x6c, 0x61, 0x79, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x0e, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x72, + 0x6d, 0x22, 0x5a, 0x0a, 0x18, 0x45, 0x70, 0x68, 0x65, 0x6d, 0x65, 0x72, 0x61, 0x6c, 0x41, 0x64, + 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3e, 0x0a, + 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, + 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6b, + 0x65, 0x79, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x41, 0x64, 0x64, + 0x72, 0x65, 0x73, 0x73, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x22, 0xb2, 0x01, + 0x0a, 0x0f, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x50, 0x0a, 0x0e, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x66, 0x69, 0x6c, + 0x74, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x70, 0x65, 0x6e, 0x75, + 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6b, 0x65, 0x79, 0x73, 0x2e, 0x76, + 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x49, + 0x6e, 0x64, 0x65, 0x78, 0x52, 0x0d, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x46, 0x69, 0x6c, + 0x74, 0x65, 0x72, 0x12, 0x4d, 0x0a, 0x0f, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x5f, + 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x70, + 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x73, 0x73, + 0x65, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x41, 0x73, 0x73, 0x65, + 0x74, 0x49, 0x64, 0x52, 0x0d, 0x61, 0x73, 0x73, 0x65, 0x74, 0x49, 0x64, 0x46, 0x69, 0x6c, 0x74, + 0x65, 0x72, 0x22, 0x96, 0x01, 0x0a, 0x10, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x43, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, + 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6b, 0x65, 0x79, 0x73, 0x2e, 0x76, 0x31, + 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x49, 0x6e, + 0x64, 0x65, 0x78, 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x3d, 0x0a, 0x07, + 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, + 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x73, + 0x73, 0x65, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x56, 0x61, 0x6c, + 0x75, 0x65, 0x52, 0x07, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x22, 0x0f, 0x0a, 0x0d, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x8b, 0x01, 0x0a, 0x0e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x28, 0x0a, 0x10, 0x66, 0x75, 0x6c, 0x6c, 0x5f, 0x73, 0x79, 0x6e, 0x63, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0e, 0x66, 0x75, 0x6c, 0x6c, 0x53, @@ -4039,76 +3787,59 @@ var file_penumbra_view_v1alpha1_view_proto_rawDesc = []byte{ 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x11, 0x70, 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x53, 0x79, 0x6e, 0x63, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x61, 0x74, 0x63, 0x68, 0x69, 0x6e, 0x67, 0x5f, 0x75, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, - 0x63, 0x61, 0x74, 0x63, 0x68, 0x69, 0x6e, 0x67, 0x55, 0x70, 0x22, 0x59, 0x0a, 0x13, 0x53, 0x74, + 0x63, 0x61, 0x74, 0x63, 0x68, 0x69, 0x6e, 0x67, 0x55, 0x70, 0x22, 0x15, 0x0a, 0x13, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x42, 0x0a, 0x09, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x0e, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, - 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6b, 0x65, 0x79, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, - 0x61, 0x31, 0x2e, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x49, 0x64, 0x52, 0x08, 0x77, 0x61, 0x6c, - 0x6c, 0x65, 0x74, 0x49, 0x64, 0x22, 0xab, 0x01, 0x0a, 0x14, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x39, - 0x0a, 0x19, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x5f, 0x62, - 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x04, 0x52, 0x16, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x4b, 0x6e, 0x6f, 0x77, 0x6e, 0x42, 0x6c, - 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x28, 0x0a, 0x10, 0x66, 0x75, 0x6c, - 0x6c, 0x5f, 0x73, 0x79, 0x6e, 0x63, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x04, 0x52, 0x0e, 0x66, 0x75, 0x6c, 0x6c, 0x53, 0x79, 0x6e, 0x63, 0x48, 0x65, 0x69, - 0x67, 0x68, 0x74, 0x12, 0x2e, 0x0a, 0x13, 0x70, 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x73, - 0x79, 0x6e, 0x63, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, - 0x52, 0x11, 0x70, 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x53, 0x79, 0x6e, 0x63, 0x48, 0x65, 0x69, - 0x67, 0x68, 0x74, 0x22, 0xd5, 0x02, 0x0a, 0x0c, 0x4e, 0x6f, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, - 0x73, 0x70, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x69, 0x6e, 0x63, - 0x6c, 0x75, 0x64, 0x65, 0x53, 0x70, 0x65, 0x6e, 0x74, 0x12, 0x40, 0x0a, 0x08, 0x61, 0x73, 0x73, - 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x70, 0x65, - 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x73, 0x73, 0x65, - 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, - 0x49, 0x64, 0x52, 0x07, 0x61, 0x73, 0x73, 0x65, 0x74, 0x49, 0x64, 0x12, 0x4e, 0x0a, 0x0d, 0x61, - 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, - 0x72, 0x65, 0x2e, 0x6b, 0x65, 0x79, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, - 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x0c, 0x61, - 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x4a, 0x0a, 0x0f, 0x61, - 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x74, 0x6f, 0x5f, 0x73, 0x70, 0x65, 0x6e, 0x64, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, - 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6e, 0x75, 0x6d, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, - 0x31, 0x2e, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x0d, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, - 0x54, 0x6f, 0x53, 0x70, 0x65, 0x6e, 0x64, 0x12, 0x42, 0x0a, 0x09, 0x77, 0x61, 0x6c, 0x6c, 0x65, - 0x74, 0x5f, 0x69, 0x64, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x70, 0x65, 0x6e, - 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6b, 0x65, 0x79, 0x73, 0x2e, - 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x49, - 0x64, 0x52, 0x08, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x49, 0x64, 0x22, 0xd7, 0x01, 0x0a, 0x15, - 0x4e, 0x6f, 0x74, 0x65, 0x73, 0x46, 0x6f, 0x72, 0x56, 0x6f, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x11, 0x76, 0x6f, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x5f, 0x61, 0x74, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, - 0x52, 0x0f, 0x76, 0x6f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x41, 0x74, 0x48, 0x65, 0x69, 0x67, 0x68, - 0x74, 0x12, 0x4e, 0x0a, 0x0d, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x5f, 0x69, 0x6e, 0x64, - 0x65, 0x78, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, - 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6b, 0x65, 0x79, 0x73, 0x2e, 0x76, 0x31, - 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x49, 0x6e, - 0x64, 0x65, 0x78, 0x52, 0x0c, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x49, 0x6e, 0x64, 0x65, - 0x78, 0x12, 0x42, 0x0a, 0x09, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x0e, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, - 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6b, 0x65, 0x79, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, - 0x61, 0x31, 0x2e, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x49, 0x64, 0x52, 0x08, 0x77, 0x61, 0x6c, - 0x6c, 0x65, 0x74, 0x49, 0x64, 0x22, 0x8e, 0x02, 0x0a, 0x0e, 0x57, 0x69, 0x74, 0x6e, 0x65, 0x73, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x58, 0x0a, 0x10, 0x6e, 0x6f, 0x74, 0x65, - 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x72, - 0x79, 0x70, 0x74, 0x6f, 0x2e, 0x74, 0x63, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, - 0x31, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, - 0x74, 0x52, 0x0f, 0x6e, 0x6f, 0x74, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, - 0x74, 0x73, 0x12, 0x5e, 0x0a, 0x10, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x5f, 0x70, 0x6c, 0x61, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x70, - 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72, 0x61, - 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, - 0x31, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6c, 0x61, - 0x6e, 0x52, 0x0f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6c, - 0x61, 0x6e, 0x12, 0x42, 0x0a, 0x09, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, - 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, - 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6b, 0x65, 0x79, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, - 0x68, 0x61, 0x31, 0x2e, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x49, 0x64, 0x52, 0x08, 0x77, 0x61, - 0x6c, 0x6c, 0x65, 0x74, 0x49, 0x64, 0x22, 0x65, 0x0a, 0x0f, 0x57, 0x69, 0x74, 0x6e, 0x65, 0x73, + 0x74, 0x22, 0xab, 0x01, 0x0a, 0x14, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x53, 0x74, 0x72, 0x65, + 0x61, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x39, 0x0a, 0x19, 0x6c, 0x61, + 0x74, 0x65, 0x73, 0x74, 0x5f, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, + 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x16, 0x6c, + 0x61, 0x74, 0x65, 0x73, 0x74, 0x4b, 0x6e, 0x6f, 0x77, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, + 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x28, 0x0a, 0x10, 0x66, 0x75, 0x6c, 0x6c, 0x5f, 0x73, 0x79, + 0x6e, 0x63, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, + 0x0e, 0x66, 0x75, 0x6c, 0x6c, 0x53, 0x79, 0x6e, 0x63, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, + 0x2e, 0x0a, 0x13, 0x70, 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x73, 0x79, 0x6e, 0x63, 0x5f, + 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x11, 0x70, 0x61, + 0x72, 0x74, 0x69, 0x61, 0x6c, 0x53, 0x79, 0x6e, 0x63, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x22, + 0x91, 0x02, 0x0a, 0x0c, 0x4e, 0x6f, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x23, 0x0a, 0x0d, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x73, 0x70, 0x65, 0x6e, + 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, + 0x53, 0x70, 0x65, 0x6e, 0x74, 0x12, 0x40, 0x0a, 0x08, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x69, + 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, + 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x74, 0x2e, 0x76, 0x31, + 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x49, 0x64, 0x52, 0x07, + 0x61, 0x73, 0x73, 0x65, 0x74, 0x49, 0x64, 0x12, 0x4e, 0x0a, 0x0d, 0x61, 0x64, 0x64, 0x72, 0x65, + 0x73, 0x73, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, + 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6b, + 0x65, 0x79, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x41, 0x64, 0x64, + 0x72, 0x65, 0x73, 0x73, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x0c, 0x61, 0x64, 0x64, 0x72, 0x65, + 0x73, 0x73, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x4a, 0x0a, 0x0f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, + 0x74, 0x5f, 0x74, 0x6f, 0x5f, 0x73, 0x70, 0x65, 0x6e, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x22, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, + 0x2e, 0x6e, 0x75, 0x6d, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x41, 0x6d, + 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x0d, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x54, 0x6f, 0x53, 0x70, + 0x65, 0x6e, 0x64, 0x22, 0x93, 0x01, 0x0a, 0x15, 0x4e, 0x6f, 0x74, 0x65, 0x73, 0x46, 0x6f, 0x72, + 0x56, 0x6f, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, + 0x11, 0x76, 0x6f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x61, 0x74, 0x5f, 0x68, 0x65, 0x69, 0x67, + 0x68, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0f, 0x76, 0x6f, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x41, 0x74, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x4e, 0x0a, 0x0d, 0x61, 0x64, 0x64, + 0x72, 0x65, 0x73, 0x73, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x29, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, + 0x2e, 0x6b, 0x65, 0x79, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x41, + 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x0c, 0x61, 0x64, 0x64, + 0x72, 0x65, 0x73, 0x73, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x22, 0xca, 0x01, 0x0a, 0x0e, 0x57, 0x69, + 0x74, 0x6e, 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x58, 0x0a, 0x10, + 0x6e, 0x6f, 0x74, 0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, + 0x61, 0x2e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x2e, 0x74, 0x63, 0x74, 0x2e, 0x76, 0x31, 0x61, + 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, + 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0f, 0x6e, 0x6f, 0x74, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, + 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x5e, 0x0a, 0x10, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x6c, 0x61, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x33, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, + 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x61, + 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x50, 0x6c, 0x61, 0x6e, 0x52, 0x0f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x50, 0x6c, 0x61, 0x6e, 0x22, 0x65, 0x0a, 0x0f, 0x57, 0x69, 0x74, 0x6e, 0x65, 0x73, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x52, 0x0a, 0x0c, 0x77, 0x69, 0x74, 0x6e, 0x65, 0x73, 0x73, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, @@ -4192,7 +3923,7 @@ var file_penumbra_view_v1alpha1_view_proto_rawDesc = []byte{ 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x46, 0x6d, 0x64, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, - 0x73, 0x52, 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0xde, 0x01, + 0x73, 0x52, 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x9a, 0x01, 0x0a, 0x17, 0x4e, 0x6f, 0x74, 0x65, 0x42, 0x79, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x56, 0x0a, 0x0f, 0x6e, 0x6f, 0x74, 0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, @@ -4202,409 +3933,386 @@ var file_penumbra_view_v1alpha1_view_proto_rawDesc = []byte{ 0x74, 0x52, 0x0e, 0x6e, 0x6f, 0x74, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x61, 0x77, 0x61, 0x69, 0x74, 0x5f, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x61, 0x77, 0x61, 0x69, - 0x74, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x42, 0x0a, 0x09, 0x77, 0x61, - 0x6c, 0x6c, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, - 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6b, 0x65, - 0x79, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x57, 0x61, 0x6c, 0x6c, - 0x65, 0x74, 0x49, 0x64, 0x52, 0x08, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x49, 0x64, 0x22, 0x6e, - 0x0a, 0x18, 0x4e, 0x6f, 0x74, 0x65, 0x42, 0x79, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, - 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x52, 0x0a, 0x0e, 0x73, 0x70, - 0x65, 0x6e, 0x64, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6e, 0x6f, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x76, 0x69, - 0x65, 0x77, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x70, 0x65, 0x6e, - 0x64, 0x61, 0x62, 0x6c, 0x65, 0x4e, 0x6f, 0x74, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x52, - 0x0d, 0x73, 0x70, 0x65, 0x6e, 0x64, 0x61, 0x62, 0x6c, 0x65, 0x4e, 0x6f, 0x74, 0x65, 0x22, 0xde, - 0x01, 0x0a, 0x17, 0x53, 0x77, 0x61, 0x70, 0x42, 0x79, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, - 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x56, 0x0a, 0x0f, 0x73, 0x77, - 0x61, 0x70, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, - 0x72, 0x79, 0x70, 0x74, 0x6f, 0x2e, 0x74, 0x63, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, - 0x61, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, - 0x6e, 0x74, 0x52, 0x0e, 0x73, 0x77, 0x61, 0x70, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, - 0x6e, 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x61, 0x77, 0x61, 0x69, 0x74, 0x5f, 0x64, 0x65, 0x74, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x61, 0x77, 0x61, - 0x69, 0x74, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x42, 0x0a, 0x09, 0x77, - 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, - 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6b, - 0x65, 0x79, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x57, 0x61, 0x6c, - 0x6c, 0x65, 0x74, 0x49, 0x64, 0x52, 0x08, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x49, 0x64, 0x22, - 0x52, 0x0a, 0x18, 0x53, 0x77, 0x61, 0x70, 0x42, 0x79, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, - 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x36, 0x0a, 0x04, 0x73, - 0x77, 0x61, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x70, 0x65, 0x6e, 0x75, - 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x76, 0x69, 0x65, 0x77, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, - 0x61, 0x31, 0x2e, 0x53, 0x77, 0x61, 0x70, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x52, 0x04, 0x73, - 0x77, 0x61, 0x70, 0x22, 0x5b, 0x0a, 0x15, 0x55, 0x6e, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x65, 0x64, - 0x53, 0x77, 0x61, 0x70, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x42, 0x0a, 0x09, - 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x25, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, - 0x6b, 0x65, 0x79, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x57, 0x61, - 0x6c, 0x6c, 0x65, 0x74, 0x49, 0x64, 0x52, 0x08, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x49, 0x64, - 0x22, 0x50, 0x0a, 0x16, 0x55, 0x6e, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x65, 0x64, 0x53, 0x77, 0x61, - 0x70, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x36, 0x0a, 0x04, 0x73, 0x77, - 0x61, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, - 0x62, 0x72, 0x61, 0x2e, 0x76, 0x69, 0x65, 0x77, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, - 0x31, 0x2e, 0x53, 0x77, 0x61, 0x70, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x52, 0x04, 0x73, 0x77, - 0x61, 0x70, 0x22, 0xd4, 0x01, 0x0a, 0x16, 0x4e, 0x75, 0x6c, 0x6c, 0x69, 0x66, 0x69, 0x65, 0x72, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x4d, 0x0a, - 0x09, 0x6e, 0x75, 0x6c, 0x6c, 0x69, 0x66, 0x69, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x2f, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, - 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x63, 0x74, 0x2e, 0x76, - 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x69, 0x66, 0x69, 0x65, - 0x72, 0x52, 0x09, 0x6e, 0x75, 0x6c, 0x6c, 0x69, 0x66, 0x69, 0x65, 0x72, 0x12, 0x27, 0x0a, 0x0f, - 0x61, 0x77, 0x61, 0x69, 0x74, 0x5f, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x61, 0x77, 0x61, 0x69, 0x74, 0x44, 0x65, 0x74, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x42, 0x0a, 0x09, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x5f, - 0x69, 0x64, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, - 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6b, 0x65, 0x79, 0x73, 0x2e, 0x76, 0x31, - 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x49, 0x64, 0x52, - 0x08, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x49, 0x64, 0x22, 0x2f, 0x0a, 0x17, 0x4e, 0x75, 0x6c, + 0x74, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x6e, 0x0a, 0x18, 0x4e, 0x6f, + 0x74, 0x65, 0x42, 0x79, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x52, 0x0a, 0x0e, 0x73, 0x70, 0x65, 0x6e, 0x64, 0x61, + 0x62, 0x6c, 0x65, 0x5f, 0x6e, 0x6f, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, + 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x76, 0x69, 0x65, 0x77, 0x2e, 0x76, + 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x70, 0x65, 0x6e, 0x64, 0x61, 0x62, 0x6c, + 0x65, 0x4e, 0x6f, 0x74, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x52, 0x0d, 0x73, 0x70, 0x65, + 0x6e, 0x64, 0x61, 0x62, 0x6c, 0x65, 0x4e, 0x6f, 0x74, 0x65, 0x22, 0x9a, 0x01, 0x0a, 0x17, 0x53, + 0x77, 0x61, 0x70, 0x42, 0x79, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x56, 0x0a, 0x0f, 0x73, 0x77, 0x61, 0x70, 0x5f, 0x63, + 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x2d, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x72, 0x79, 0x70, 0x74, + 0x6f, 0x2e, 0x74, 0x63, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, + 0x74, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0e, + 0x73, 0x77, 0x61, 0x70, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x27, + 0x0a, 0x0f, 0x61, 0x77, 0x61, 0x69, 0x74, 0x5f, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x61, 0x77, 0x61, 0x69, 0x74, 0x44, 0x65, + 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x52, 0x0a, 0x18, 0x53, 0x77, 0x61, 0x70, 0x42, + 0x79, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x36, 0x0a, 0x04, 0x73, 0x77, 0x61, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x22, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x76, 0x69, 0x65, + 0x77, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x77, 0x61, 0x70, 0x52, + 0x65, 0x63, 0x6f, 0x72, 0x64, 0x52, 0x04, 0x73, 0x77, 0x61, 0x70, 0x22, 0x17, 0x0a, 0x15, 0x55, + 0x6e, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x65, 0x64, 0x53, 0x77, 0x61, 0x70, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x22, 0x50, 0x0a, 0x16, 0x55, 0x6e, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x65, + 0x64, 0x53, 0x77, 0x61, 0x70, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x36, + 0x0a, 0x04, 0x73, 0x77, 0x61, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x70, + 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x76, 0x69, 0x65, 0x77, 0x2e, 0x76, 0x31, 0x61, + 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x77, 0x61, 0x70, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, + 0x52, 0x04, 0x73, 0x77, 0x61, 0x70, 0x22, 0x90, 0x01, 0x0a, 0x16, 0x4e, 0x75, 0x6c, 0x6c, 0x69, + 0x66, 0x69, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x4d, 0x0a, 0x09, 0x6e, 0x75, 0x6c, 0x6c, 0x69, 0x66, 0x69, 0x65, 0x72, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, + 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x73, + 0x63, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, + 0x69, 0x66, 0x69, 0x65, 0x72, 0x52, 0x09, 0x6e, 0x75, 0x6c, 0x6c, 0x69, 0x66, 0x69, 0x65, 0x72, + 0x12, 0x27, 0x0a, 0x0f, 0x61, 0x77, 0x61, 0x69, 0x74, 0x5f, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x61, 0x77, 0x61, 0x69, 0x74, + 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x2f, 0x0a, 0x17, 0x4e, 0x75, 0x6c, 0x6c, 0x69, 0x66, 0x69, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x70, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x05, 0x73, 0x70, 0x65, 0x6e, 0x74, 0x22, 0x56, 0x0a, 0x1c, 0x54, 0x72, + 0x01, 0x28, 0x08, 0x52, 0x05, 0x73, 0x70, 0x65, 0x6e, 0x74, 0x22, 0x5c, 0x0a, 0x1c, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x42, 0x79, 0x48, - 0x61, 0x73, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x36, 0x0a, 0x02, 0x69, 0x64, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, - 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x49, 0x64, 0x52, 0x02, - 0x69, 0x64, 0x22, 0x5a, 0x0a, 0x16, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x21, 0x0a, 0x0c, - 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x04, 0x52, 0x0b, 0x73, 0x74, 0x61, 0x72, 0x74, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, - 0x1d, 0x0a, 0x0a, 0x65, 0x6e, 0x64, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x04, 0x52, 0x09, 0x65, 0x6e, 0x64, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x22, 0xdb, - 0x02, 0x0a, 0x0f, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, - 0x66, 0x6f, 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, 0x36, 0x0a, 0x02, 0x69, 0x64, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, + 0x61, 0x73, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3c, 0x0a, 0x02, 0x69, 0x64, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, + 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x78, 0x68, 0x61, 0x73, 0x68, 0x2e, 0x76, 0x31, + 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x49, 0x64, 0x52, 0x02, 0x69, 0x64, 0x22, 0x5a, 0x0a, 0x16, 0x54, 0x72, 0x61, 0x6e, + 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x68, 0x65, 0x69, 0x67, + 0x68, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x73, 0x74, 0x61, 0x72, 0x74, 0x48, + 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x65, 0x6e, 0x64, 0x5f, 0x68, 0x65, 0x69, + 0x67, 0x68, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x65, 0x6e, 0x64, 0x48, 0x65, + 0x69, 0x67, 0x68, 0x74, 0x22, 0xe1, 0x02, 0x0a, 0x0f, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 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, 0x3c, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x70, + 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x78, 0x68, + 0x61, 0x73, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x54, 0x72, 0x61, + 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x52, 0x02, 0x69, 0x64, 0x12, 0x51, + 0x0a, 0x0b, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, + 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, + 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x12, 0x5c, 0x0a, 0x0b, 0x70, 0x65, 0x72, 0x73, 0x70, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x49, 0x64, 0x52, 0x02, - 0x69, 0x64, 0x12, 0x51, 0x0a, 0x0b, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, - 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x54, 0x72, 0x61, - 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x5c, 0x0a, 0x0b, 0x70, 0x65, 0x72, 0x73, 0x70, 0x65, 0x63, - 0x74, 0x69, 0x76, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x70, 0x65, 0x6e, - 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, - 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, - 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x72, 0x73, 0x70, - 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x52, 0x0b, 0x70, 0x65, 0x72, 0x73, 0x70, 0x65, 0x63, 0x74, - 0x69, 0x76, 0x65, 0x12, 0x47, 0x0a, 0x04, 0x76, 0x69, 0x65, 0x77, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x54, 0x72, 0x61, 0x6e, + 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x72, 0x73, 0x70, 0x65, 0x63, 0x74, 0x69, + 0x76, 0x65, 0x52, 0x0b, 0x70, 0x65, 0x72, 0x73, 0x70, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x12, + 0x47, 0x0a, 0x04, 0x76, 0x69, 0x65, 0x77, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x33, 0x2e, + 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72, + 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, + 0x61, 0x31, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x69, + 0x65, 0x77, 0x52, 0x04, 0x76, 0x69, 0x65, 0x77, 0x22, 0x5b, 0x0a, 0x17, 0x54, 0x72, 0x61, 0x6e, + 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x40, 0x0a, 0x07, 0x74, 0x78, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, + 0x76, 0x69, 0x65, 0x77, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x54, 0x72, + 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x06, 0x74, + 0x78, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x61, 0x0a, 0x1d, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x42, 0x79, 0x48, 0x61, 0x73, 0x68, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x40, 0x0a, 0x07, 0x74, 0x78, 0x5f, 0x69, 0x6e, 0x66, + 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, + 0x72, 0x61, 0x2e, 0x76, 0x69, 0x65, 0x77, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, + 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, + 0x52, 0x06, 0x74, 0x78, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x5d, 0x0a, 0x0d, 0x4e, 0x6f, 0x74, 0x65, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4c, 0x0a, 0x0b, 0x6e, 0x6f, 0x74, + 0x65, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, + 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x76, 0x69, 0x65, 0x77, 0x2e, 0x76, + 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x70, 0x65, 0x6e, 0x64, 0x61, 0x62, 0x6c, + 0x65, 0x4e, 0x6f, 0x74, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x52, 0x0a, 0x6e, 0x6f, 0x74, + 0x65, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x22, 0xb3, 0x01, 0x0a, 0x16, 0x4e, 0x6f, 0x74, 0x65, + 0x73, 0x46, 0x6f, 0x72, 0x56, 0x6f, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x4c, 0x0a, 0x0b, 0x6e, 0x6f, 0x74, 0x65, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x72, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, + 0x72, 0x61, 0x2e, 0x76, 0x69, 0x65, 0x77, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, + 0x2e, 0x53, 0x70, 0x65, 0x6e, 0x64, 0x61, 0x62, 0x6c, 0x65, 0x4e, 0x6f, 0x74, 0x65, 0x52, 0x65, + 0x63, 0x6f, 0x72, 0x64, 0x52, 0x0a, 0x6e, 0x6f, 0x74, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, + 0x12, 0x4b, 0x0a, 0x0c, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x5f, 0x6b, 0x65, 0x79, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, + 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6b, 0x65, 0x79, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, + 0x70, 0x68, 0x61, 0x31, 0x2e, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x4b, 0x65, 0x79, + 0x52, 0x0b, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x4b, 0x65, 0x79, 0x22, 0x8c, 0x04, + 0x0a, 0x13, 0x53, 0x70, 0x65, 0x6e, 0x64, 0x61, 0x62, 0x6c, 0x65, 0x4e, 0x6f, 0x74, 0x65, 0x52, + 0x65, 0x63, 0x6f, 0x72, 0x64, 0x12, 0x56, 0x0a, 0x0f, 0x6e, 0x6f, 0x74, 0x65, 0x5f, 0x63, 0x6f, + 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, + 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x6f, + 0x2e, 0x74, 0x63, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x74, + 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0e, 0x6e, + 0x6f, 0x74, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x48, 0x0a, + 0x04, 0x6e, 0x6f, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x70, 0x65, + 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, + 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x68, 0x69, 0x65, 0x6c, 0x64, 0x65, 0x64, 0x5f, 0x70, + 0x6f, 0x6f, 0x6c, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4e, 0x6f, 0x74, + 0x65, 0x52, 0x04, 0x6e, 0x6f, 0x74, 0x65, 0x12, 0x4e, 0x0a, 0x0d, 0x61, 0x64, 0x64, 0x72, 0x65, + 0x73, 0x73, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, + 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6b, + 0x65, 0x79, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x41, 0x64, 0x64, + 0x72, 0x65, 0x73, 0x73, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x0c, 0x61, 0x64, 0x64, 0x72, 0x65, + 0x73, 0x73, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x4d, 0x0a, 0x09, 0x6e, 0x75, 0x6c, 0x6c, 0x69, + 0x66, 0x69, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x70, 0x65, 0x6e, + 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, + 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x63, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, + 0x31, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x69, 0x66, 0x69, 0x65, 0x72, 0x52, 0x09, 0x6e, 0x75, 0x6c, + 0x6c, 0x69, 0x66, 0x69, 0x65, 0x72, 0x12, 0x25, 0x0a, 0x0e, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, + 0x5f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, + 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x21, 0x0a, + 0x0c, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x73, 0x70, 0x65, 0x6e, 0x74, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x04, 0x52, 0x0b, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x53, 0x70, 0x65, 0x6e, 0x74, + 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, + 0x28, 0x04, 0x52, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x4e, 0x0a, 0x06, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x70, + 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, + 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x63, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, + 0x68, 0x61, 0x31, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x52, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x22, 0xeb, 0x03, 0x0a, + 0x0a, 0x53, 0x77, 0x61, 0x70, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x12, 0x56, 0x0a, 0x0f, 0x73, + 0x77, 0x61, 0x70, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, + 0x63, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x2e, 0x74, 0x63, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, + 0x68, 0x61, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, + 0x65, 0x6e, 0x74, 0x52, 0x0e, 0x73, 0x77, 0x61, 0x70, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, + 0x65, 0x6e, 0x74, 0x12, 0x47, 0x0a, 0x04, 0x73, 0x77, 0x61, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, - 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, - 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x56, 0x69, 0x65, 0x77, 0x52, 0x04, 0x76, 0x69, 0x65, 0x77, 0x22, 0x5b, 0x0a, 0x17, - 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x40, 0x0a, 0x07, 0x74, 0x78, 0x5f, 0x69, 0x6e, - 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, - 0x62, 0x72, 0x61, 0x2e, 0x76, 0x69, 0x65, 0x77, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, - 0x31, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, - 0x6f, 0x52, 0x06, 0x74, 0x78, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x61, 0x0a, 0x1d, 0x54, 0x72, 0x61, - 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x42, 0x79, 0x48, 0x61, - 0x73, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x40, 0x0a, 0x07, 0x74, 0x78, - 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x70, 0x65, - 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x76, 0x69, 0x65, 0x77, 0x2e, 0x76, 0x31, 0x61, 0x6c, - 0x70, 0x68, 0x61, 0x31, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x06, 0x74, 0x78, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x5d, 0x0a, 0x0d, - 0x4e, 0x6f, 0x74, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4c, 0x0a, - 0x0b, 0x6e, 0x6f, 0x74, 0x65, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x76, 0x69, - 0x65, 0x77, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x70, 0x65, 0x6e, - 0x64, 0x61, 0x62, 0x6c, 0x65, 0x4e, 0x6f, 0x74, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x52, - 0x0a, 0x6e, 0x6f, 0x74, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x22, 0xb3, 0x01, 0x0a, 0x16, - 0x4e, 0x6f, 0x74, 0x65, 0x73, 0x46, 0x6f, 0x72, 0x56, 0x6f, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4c, 0x0a, 0x0b, 0x6e, 0x6f, 0x74, 0x65, 0x5f, 0x72, - 0x65, 0x63, 0x6f, 0x72, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x70, 0x65, - 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x76, 0x69, 0x65, 0x77, 0x2e, 0x76, 0x31, 0x61, 0x6c, - 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x70, 0x65, 0x6e, 0x64, 0x61, 0x62, 0x6c, 0x65, 0x4e, 0x6f, - 0x74, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x52, 0x0a, 0x6e, 0x6f, 0x74, 0x65, 0x52, 0x65, - 0x63, 0x6f, 0x72, 0x64, 0x12, 0x4b, 0x0a, 0x0c, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, - 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x70, 0x65, 0x6e, - 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6b, 0x65, 0x79, 0x73, 0x2e, - 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, - 0x79, 0x4b, 0x65, 0x79, 0x52, 0x0b, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x4b, 0x65, - 0x79, 0x22, 0x8c, 0x04, 0x0a, 0x13, 0x53, 0x70, 0x65, 0x6e, 0x64, 0x61, 0x62, 0x6c, 0x65, 0x4e, - 0x6f, 0x74, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x12, 0x56, 0x0a, 0x0f, 0x6e, 0x6f, 0x74, - 0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x72, - 0x79, 0x70, 0x74, 0x6f, 0x2e, 0x74, 0x63, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, - 0x31, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, - 0x74, 0x52, 0x0e, 0x6e, 0x6f, 0x74, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, - 0x74, 0x12, 0x48, 0x0a, 0x04, 0x6e, 0x6f, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x34, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, - 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x68, 0x69, 0x65, 0x6c, 0x64, - 0x65, 0x64, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, - 0x2e, 0x4e, 0x6f, 0x74, 0x65, 0x52, 0x04, 0x6e, 0x6f, 0x74, 0x65, 0x12, 0x4e, 0x0a, 0x0d, 0x61, - 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, - 0x72, 0x65, 0x2e, 0x6b, 0x65, 0x79, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, - 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x0c, 0x61, - 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x4d, 0x0a, 0x09, 0x6e, - 0x75, 0x6c, 0x6c, 0x69, 0x66, 0x69, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, - 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, - 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x63, 0x74, 0x2e, 0x76, 0x31, 0x61, - 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x69, 0x66, 0x69, 0x65, 0x72, 0x52, - 0x09, 0x6e, 0x75, 0x6c, 0x6c, 0x69, 0x66, 0x69, 0x65, 0x72, 0x12, 0x25, 0x0a, 0x0e, 0x68, 0x65, - 0x69, 0x67, 0x68, 0x74, 0x5f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x04, 0x52, 0x0d, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x73, 0x70, 0x65, 0x6e, - 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x53, - 0x70, 0x65, 0x6e, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, - 0x18, 0x07, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, - 0x12, 0x4e, 0x0a, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x36, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, - 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x63, 0x74, 0x2e, 0x76, - 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, - 0x6e, 0x74, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x22, 0xeb, 0x03, 0x0a, 0x0a, 0x53, 0x77, 0x61, 0x70, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x12, - 0x56, 0x0a, 0x0f, 0x73, 0x77, 0x61, 0x70, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, - 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, - 0x62, 0x72, 0x61, 0x2e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x2e, 0x74, 0x63, 0x74, 0x2e, 0x76, - 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6d, - 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0e, 0x73, 0x77, 0x61, 0x70, 0x43, 0x6f, 0x6d, - 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x47, 0x0a, 0x04, 0x73, 0x77, 0x61, 0x70, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, - 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, - 0x64, 0x65, 0x78, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x77, 0x61, - 0x70, 0x50, 0x6c, 0x61, 0x69, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x52, 0x04, 0x73, 0x77, 0x61, 0x70, - 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x04, 0x52, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x4d, 0x0a, 0x09, - 0x6e, 0x75, 0x6c, 0x6c, 0x69, 0x66, 0x69, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x2f, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, - 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x63, 0x74, 0x2e, 0x76, 0x31, - 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x69, 0x66, 0x69, 0x65, 0x72, - 0x52, 0x09, 0x6e, 0x75, 0x6c, 0x6c, 0x69, 0x66, 0x69, 0x65, 0x72, 0x12, 0x5a, 0x0a, 0x0b, 0x6f, - 0x75, 0x74, 0x70, 0x75, 0x74, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x39, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, - 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x64, 0x65, 0x78, 0x2e, 0x76, - 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x42, 0x61, 0x74, 0x63, 0x68, 0x53, 0x77, 0x61, - 0x70, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x44, 0x61, 0x74, 0x61, 0x52, 0x0a, 0x6f, 0x75, 0x74, - 0x70, 0x75, 0x74, 0x44, 0x61, 0x74, 0x61, 0x12, 0x25, 0x0a, 0x0e, 0x68, 0x65, 0x69, 0x67, 0x68, - 0x74, 0x5f, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x65, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x04, 0x52, - 0x0d, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x43, 0x6c, 0x61, 0x69, 0x6d, 0x65, 0x64, 0x12, 0x4e, - 0x0a, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x36, - 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, - 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x63, 0x74, 0x2e, 0x76, 0x31, 0x61, - 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, - 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x22, 0xcb, - 0x01, 0x0a, 0x17, 0x4f, 0x77, 0x6e, 0x65, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, - 0x49, 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x5a, 0x0a, 0x0e, 0x70, 0x6f, - 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, - 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x64, 0x65, 0x78, - 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, - 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x0d, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, - 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x54, 0x0a, 0x0c, 0x74, 0x72, 0x61, 0x64, 0x69, 0x6e, - 0x67, 0x5f, 0x70, 0x61, 0x69, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x70, + 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x64, 0x65, 0x78, 0x2e, + 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x77, 0x61, 0x70, 0x50, 0x6c, 0x61, + 0x69, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x52, 0x04, 0x73, 0x77, 0x61, 0x70, 0x12, 0x1a, 0x0a, 0x08, + 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, + 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x4d, 0x0a, 0x09, 0x6e, 0x75, 0x6c, 0x6c, + 0x69, 0x66, 0x69, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x70, 0x65, + 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, + 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x63, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, + 0x61, 0x31, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x69, 0x66, 0x69, 0x65, 0x72, 0x52, 0x09, 0x6e, 0x75, + 0x6c, 0x6c, 0x69, 0x66, 0x69, 0x65, 0x72, 0x12, 0x5a, 0x0a, 0x0b, 0x6f, 0x75, 0x74, 0x70, 0x75, + 0x74, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x64, 0x65, 0x78, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, - 0x68, 0x61, 0x31, 0x2e, 0x54, 0x72, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x50, 0x61, 0x69, 0x72, 0x52, - 0x0b, 0x74, 0x72, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x50, 0x61, 0x69, 0x72, 0x22, 0x6d, 0x0a, 0x18, - 0x4f, 0x77, 0x6e, 0x65, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x51, 0x0a, 0x0b, 0x70, 0x6f, 0x73, 0x69, - 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, - 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, - 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x64, 0x65, 0x78, 0x2e, 0x76, 0x31, 0x61, 0x6c, - 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x52, - 0x0a, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x32, 0xee, 0x15, 0x0a, 0x13, - 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x53, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x12, 0x57, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x25, 0x2e, - 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x76, 0x69, 0x65, 0x77, 0x2e, 0x76, 0x31, - 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, - 0x76, 0x69, 0x65, 0x77, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6b, 0x0a, 0x0c, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x12, 0x2b, 0x2e, 0x70, - 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x76, 0x69, 0x65, 0x77, 0x2e, 0x76, 0x31, 0x61, - 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x53, 0x74, 0x72, 0x65, - 0x61, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x70, 0x65, 0x6e, 0x75, + 0x68, 0x61, 0x31, 0x2e, 0x42, 0x61, 0x74, 0x63, 0x68, 0x53, 0x77, 0x61, 0x70, 0x4f, 0x75, 0x74, + 0x70, 0x75, 0x74, 0x44, 0x61, 0x74, 0x61, 0x52, 0x0a, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x44, + 0x61, 0x74, 0x61, 0x12, 0x25, 0x0a, 0x0e, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x63, 0x6c, + 0x61, 0x69, 0x6d, 0x65, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x68, 0x65, 0x69, + 0x67, 0x68, 0x74, 0x43, 0x6c, 0x61, 0x69, 0x6d, 0x65, 0x64, 0x12, 0x4e, 0x0a, 0x06, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x70, 0x65, 0x6e, + 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, + 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x63, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, + 0x31, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x52, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x22, 0xcb, 0x01, 0x0a, 0x17, 0x4f, + 0x77, 0x6e, 0x65, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x5a, 0x0a, 0x0e, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x33, + 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, + 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, 0x64, 0x65, 0x78, 0x2e, 0x76, 0x31, 0x61, + 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, + 0x61, 0x74, 0x65, 0x52, 0x0d, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, + 0x74, 0x65, 0x12, 0x54, 0x0a, 0x0c, 0x74, 0x72, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x61, + 0x69, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, + 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, + 0x6e, 0x74, 0x2e, 0x64, 0x65, 0x78, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, + 0x54, 0x72, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x50, 0x61, 0x69, 0x72, 0x52, 0x0b, 0x74, 0x72, 0x61, + 0x64, 0x69, 0x6e, 0x67, 0x50, 0x61, 0x69, 0x72, 0x22, 0x6d, 0x0a, 0x18, 0x4f, 0x77, 0x6e, 0x65, + 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x51, 0x0a, 0x0b, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x70, 0x65, 0x6e, 0x75, + 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, + 0x65, 0x6e, 0x74, 0x2e, 0x64, 0x65, 0x78, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, + 0x2e, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x52, 0x0a, 0x70, 0x6f, 0x73, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x32, 0xee, 0x15, 0x0a, 0x13, 0x56, 0x69, 0x65, 0x77, + 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, + 0x57, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x25, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x76, 0x69, 0x65, 0x77, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, - 0x61, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x30, 0x01, 0x12, 0x56, 0x0a, 0x05, 0x4e, 0x6f, 0x74, - 0x65, 0x73, 0x12, 0x24, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x76, 0x69, - 0x65, 0x77, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4e, 0x6f, 0x74, 0x65, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, + 0x61, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x26, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x76, 0x69, 0x65, 0x77, + 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6b, 0x0a, 0x0c, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x12, 0x2b, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x76, 0x69, 0x65, 0x77, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, - 0x31, 0x2e, 0x4e, 0x6f, 0x74, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x30, - 0x01, 0x12, 0x71, 0x0a, 0x0e, 0x4e, 0x6f, 0x74, 0x65, 0x73, 0x46, 0x6f, 0x72, 0x56, 0x6f, 0x74, - 0x69, 0x6e, 0x67, 0x12, 0x2d, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x76, - 0x69, 0x65, 0x77, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4e, 0x6f, 0x74, - 0x65, 0x73, 0x46, 0x6f, 0x72, 0x56, 0x6f, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x76, 0x69, - 0x65, 0x77, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4e, 0x6f, 0x74, 0x65, - 0x73, 0x46, 0x6f, 0x72, 0x56, 0x6f, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x30, 0x01, 0x12, 0x5a, 0x0a, 0x07, 0x57, 0x69, 0x74, 0x6e, 0x65, 0x73, 0x73, 0x12, - 0x26, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x76, 0x69, 0x65, 0x77, 0x2e, - 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x57, 0x69, 0x74, 0x6e, 0x65, 0x73, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, - 0x72, 0x61, 0x2e, 0x76, 0x69, 0x65, 0x77, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, - 0x2e, 0x57, 0x69, 0x74, 0x6e, 0x65, 0x73, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x72, 0x0a, 0x0f, 0x57, 0x69, 0x74, 0x6e, 0x65, 0x73, 0x73, 0x41, 0x6e, 0x64, 0x42, 0x75, - 0x69, 0x6c, 0x64, 0x12, 0x2e, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x76, - 0x69, 0x65, 0x77, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x57, 0x69, 0x74, - 0x6e, 0x65, 0x73, 0x73, 0x41, 0x6e, 0x64, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x76, - 0x69, 0x65, 0x77, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x57, 0x69, 0x74, - 0x6e, 0x65, 0x73, 0x73, 0x41, 0x6e, 0x64, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x59, 0x0a, 0x06, 0x41, 0x73, 0x73, 0x65, 0x74, 0x73, 0x12, 0x25, - 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x76, 0x69, 0x65, 0x77, 0x2e, 0x76, - 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, - 0x2e, 0x76, 0x69, 0x65, 0x77, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x41, - 0x73, 0x73, 0x65, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x30, 0x01, 0x12, - 0x6c, 0x0a, 0x0d, 0x41, 0x70, 0x70, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, - 0x12, 0x2c, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x76, 0x69, 0x65, 0x77, - 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x41, 0x70, 0x70, 0x50, 0x61, 0x72, - 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, - 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x76, 0x69, 0x65, 0x77, 0x2e, 0x76, - 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x41, 0x70, 0x70, 0x50, 0x61, 0x72, 0x61, 0x6d, - 0x65, 0x74, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x60, 0x0a, - 0x09, 0x47, 0x61, 0x73, 0x50, 0x72, 0x69, 0x63, 0x65, 0x73, 0x12, 0x28, 0x2e, 0x70, 0x65, 0x6e, - 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x76, 0x69, 0x65, 0x77, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, - 0x68, 0x61, 0x31, 0x2e, 0x47, 0x61, 0x73, 0x50, 0x72, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, - 0x76, 0x69, 0x65, 0x77, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x47, 0x61, - 0x73, 0x50, 0x72, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x6c, 0x0a, 0x0d, 0x46, 0x4d, 0x44, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, - 0x12, 0x2c, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x76, 0x69, 0x65, 0x77, - 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x46, 0x4d, 0x44, 0x50, 0x61, 0x72, - 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, - 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x76, 0x69, 0x65, 0x77, 0x2e, 0x76, - 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x46, 0x4d, 0x44, 0x50, 0x61, 0x72, 0x61, 0x6d, - 0x65, 0x74, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6f, 0x0a, - 0x0e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x42, 0x79, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, - 0x2d, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x76, 0x69, 0x65, 0x77, 0x2e, - 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, - 0x42, 0x79, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, + 0x31, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, + 0x2e, 0x76, 0x69, 0x65, 0x77, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x30, 0x01, 0x12, 0x56, 0x0a, 0x05, 0x4e, 0x6f, 0x74, 0x65, 0x73, 0x12, 0x24, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x76, 0x69, 0x65, 0x77, 0x2e, 0x76, - 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x42, - 0x79, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5d, - 0x0a, 0x08, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x49, 0x64, 0x12, 0x27, 0x2e, 0x70, 0x65, 0x6e, - 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x76, 0x69, 0x65, 0x77, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, - 0x68, 0x61, 0x31, 0x2e, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x49, 0x64, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x76, - 0x69, 0x65, 0x77, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x57, 0x61, 0x6c, - 0x6c, 0x65, 0x74, 0x49, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6f, 0x0a, - 0x0e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x42, 0x79, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, + 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4e, 0x6f, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, + 0x76, 0x69, 0x65, 0x77, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4e, 0x6f, + 0x74, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x30, 0x01, 0x12, 0x71, 0x0a, + 0x0e, 0x4e, 0x6f, 0x74, 0x65, 0x73, 0x46, 0x6f, 0x72, 0x56, 0x6f, 0x74, 0x69, 0x6e, 0x67, 0x12, 0x2d, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x76, 0x69, 0x65, 0x77, 0x2e, - 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x42, 0x79, - 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, + 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4e, 0x6f, 0x74, 0x65, 0x73, 0x46, 0x6f, + 0x72, 0x56, 0x6f, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x76, 0x69, 0x65, 0x77, 0x2e, 0x76, - 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x42, 0x79, 0x41, - 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x75, - 0x0a, 0x10, 0x45, 0x70, 0x68, 0x65, 0x6d, 0x65, 0x72, 0x61, 0x6c, 0x41, 0x64, 0x64, 0x72, 0x65, - 0x73, 0x73, 0x12, 0x2f, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x76, 0x69, - 0x65, 0x77, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x45, 0x70, 0x68, 0x65, - 0x6d, 0x65, 0x72, 0x61, 0x6c, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x76, - 0x69, 0x65, 0x77, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x45, 0x70, 0x68, - 0x65, 0x6d, 0x65, 0x72, 0x61, 0x6c, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5f, 0x0a, 0x08, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, - 0x73, 0x12, 0x27, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x76, 0x69, 0x65, - 0x77, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x42, 0x61, 0x6c, 0x61, 0x6e, - 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x70, 0x65, 0x6e, + 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4e, 0x6f, 0x74, 0x65, 0x73, 0x46, 0x6f, 0x72, + 0x56, 0x6f, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x30, 0x01, + 0x12, 0x5a, 0x0a, 0x07, 0x57, 0x69, 0x74, 0x6e, 0x65, 0x73, 0x73, 0x12, 0x26, 0x2e, 0x70, 0x65, + 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x76, 0x69, 0x65, 0x77, 0x2e, 0x76, 0x31, 0x61, 0x6c, + 0x70, 0x68, 0x61, 0x31, 0x2e, 0x57, 0x69, 0x74, 0x6e, 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x76, + 0x69, 0x65, 0x77, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x57, 0x69, 0x74, + 0x6e, 0x65, 0x73, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x72, 0x0a, 0x0f, + 0x57, 0x69, 0x74, 0x6e, 0x65, 0x73, 0x73, 0x41, 0x6e, 0x64, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x12, + 0x2e, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x76, 0x69, 0x65, 0x77, 0x2e, + 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x57, 0x69, 0x74, 0x6e, 0x65, 0x73, 0x73, + 0x41, 0x6e, 0x64, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x2f, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x76, 0x69, 0x65, 0x77, 0x2e, + 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x57, 0x69, 0x74, 0x6e, 0x65, 0x73, 0x73, + 0x41, 0x6e, 0x64, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x59, 0x0a, 0x06, 0x41, 0x73, 0x73, 0x65, 0x74, 0x73, 0x12, 0x25, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x76, 0x69, 0x65, 0x77, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, - 0x68, 0x61, 0x31, 0x2e, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x30, 0x01, 0x12, 0x75, 0x0a, 0x10, 0x4e, 0x6f, 0x74, 0x65, 0x42, 0x79, - 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x2f, 0x2e, 0x70, 0x65, 0x6e, + 0x68, 0x61, 0x31, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x26, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x76, 0x69, 0x65, + 0x77, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x30, 0x01, 0x12, 0x6c, 0x0a, 0x0d, 0x41, + 0x70, 0x70, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x12, 0x2c, 0x2e, 0x70, + 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x76, 0x69, 0x65, 0x77, 0x2e, 0x76, 0x31, 0x61, + 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x41, 0x70, 0x70, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, + 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x76, 0x69, 0x65, 0x77, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, - 0x68, 0x61, 0x31, 0x2e, 0x4e, 0x6f, 0x74, 0x65, 0x42, 0x79, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, - 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x70, 0x65, - 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x76, 0x69, 0x65, 0x77, 0x2e, 0x76, 0x31, 0x61, 0x6c, - 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4e, 0x6f, 0x74, 0x65, 0x42, 0x79, 0x43, 0x6f, 0x6d, 0x6d, 0x69, - 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x75, 0x0a, - 0x10, 0x53, 0x77, 0x61, 0x70, 0x42, 0x79, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, - 0x74, 0x12, 0x2f, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x76, 0x69, 0x65, - 0x77, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x77, 0x61, 0x70, 0x42, - 0x79, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x76, 0x69, - 0x65, 0x77, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x77, 0x61, 0x70, - 0x42, 0x79, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x71, 0x0a, 0x0e, 0x55, 0x6e, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x65, - 0x64, 0x53, 0x77, 0x61, 0x70, 0x73, 0x12, 0x2d, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, + 0x68, 0x61, 0x31, 0x2e, 0x41, 0x70, 0x70, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x60, 0x0a, 0x09, 0x47, 0x61, 0x73, + 0x50, 0x72, 0x69, 0x63, 0x65, 0x73, 0x12, 0x28, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x76, 0x69, 0x65, 0x77, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, - 0x55, 0x6e, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x65, 0x64, 0x53, 0x77, 0x61, 0x70, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, - 0x2e, 0x76, 0x69, 0x65, 0x77, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x55, - 0x6e, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x65, 0x64, 0x53, 0x77, 0x61, 0x70, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x30, 0x01, 0x12, 0x72, 0x0a, 0x0f, 0x4e, 0x75, 0x6c, 0x6c, 0x69, - 0x66, 0x69, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x2e, 0x2e, 0x70, 0x65, 0x6e, + 0x47, 0x61, 0x73, 0x50, 0x72, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x29, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x76, 0x69, 0x65, 0x77, + 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x47, 0x61, 0x73, 0x50, 0x72, 0x69, + 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6c, 0x0a, 0x0d, 0x46, + 0x4d, 0x44, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x12, 0x2c, 0x2e, 0x70, + 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x76, 0x69, 0x65, 0x77, 0x2e, 0x76, 0x31, 0x61, + 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x46, 0x4d, 0x44, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, + 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x76, 0x69, 0x65, 0x77, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, - 0x68, 0x61, 0x31, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x69, 0x66, 0x69, 0x65, 0x72, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x70, 0x65, 0x6e, + 0x68, 0x61, 0x31, 0x2e, 0x46, 0x4d, 0x44, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6f, 0x0a, 0x0e, 0x41, 0x64, 0x64, + 0x72, 0x65, 0x73, 0x73, 0x42, 0x79, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x2d, 0x2e, 0x70, 0x65, + 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x76, 0x69, 0x65, 0x77, 0x2e, 0x76, 0x31, 0x61, 0x6c, + 0x70, 0x68, 0x61, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x42, 0x79, 0x49, 0x6e, + 0x64, 0x65, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x76, 0x69, 0x65, 0x77, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, - 0x68, 0x61, 0x31, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x69, 0x66, 0x69, 0x65, 0x72, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x84, 0x01, 0x0a, 0x15, - 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x42, - 0x79, 0x48, 0x61, 0x73, 0x68, 0x12, 0x34, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, - 0x2e, 0x76, 0x69, 0x65, 0x77, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x54, - 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x42, 0x79, - 0x48, 0x61, 0x73, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x35, 0x2e, 0x70, 0x65, + 0x68, 0x61, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x42, 0x79, 0x49, 0x6e, 0x64, + 0x65, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5d, 0x0a, 0x08, 0x57, 0x61, + 0x6c, 0x6c, 0x65, 0x74, 0x49, 0x64, 0x12, 0x27, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, + 0x61, 0x2e, 0x76, 0x69, 0x65, 0x77, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, + 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x49, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x28, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x76, 0x69, 0x65, 0x77, 0x2e, + 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x49, + 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6f, 0x0a, 0x0e, 0x49, 0x6e, 0x64, + 0x65, 0x78, 0x42, 0x79, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x2d, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x76, 0x69, 0x65, 0x77, 0x2e, 0x76, 0x31, 0x61, 0x6c, - 0x70, 0x68, 0x61, 0x31, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x49, 0x6e, 0x66, 0x6f, 0x42, 0x79, 0x48, 0x61, 0x73, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x74, 0x0a, 0x0f, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x2e, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, - 0x2e, 0x76, 0x69, 0x65, 0x77, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x54, - 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, - 0x2e, 0x76, 0x69, 0x65, 0x77, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x54, - 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x30, 0x01, 0x12, 0x7b, 0x0a, 0x12, 0x54, 0x72, 0x61, 0x6e, - 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x12, 0x31, - 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x76, 0x69, 0x65, 0x77, 0x2e, 0x76, - 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x50, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x32, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x76, 0x69, 0x65, - 0x77, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, - 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x81, 0x01, 0x0a, 0x14, 0x42, 0x72, 0x6f, 0x61, 0x64, 0x63, - 0x61, 0x73, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x33, + 0x70, 0x68, 0x61, 0x31, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x42, 0x79, 0x41, 0x64, 0x64, 0x72, + 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x70, 0x65, 0x6e, + 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x76, 0x69, 0x65, 0x77, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, + 0x68, 0x61, 0x31, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x42, 0x79, 0x41, 0x64, 0x64, 0x72, 0x65, + 0x73, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x75, 0x0a, 0x10, 0x45, 0x70, + 0x68, 0x65, 0x6d, 0x65, 0x72, 0x61, 0x6c, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x2f, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x76, 0x69, 0x65, 0x77, 0x2e, 0x76, - 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x42, 0x72, 0x6f, 0x61, 0x64, 0x63, 0x61, 0x73, - 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x34, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x76, - 0x69, 0x65, 0x77, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x42, 0x72, 0x6f, - 0x61, 0x64, 0x63, 0x61, 0x73, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x77, 0x0a, 0x10, 0x4f, 0x77, 0x6e, - 0x65, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x73, 0x12, 0x2f, 0x2e, + 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x45, 0x70, 0x68, 0x65, 0x6d, 0x65, 0x72, 0x61, + 0x6c, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x30, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x76, 0x69, 0x65, 0x77, 0x2e, + 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x45, 0x70, 0x68, 0x65, 0x6d, 0x65, 0x72, + 0x61, 0x6c, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x5f, 0x0a, 0x08, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x12, 0x27, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x76, 0x69, 0x65, 0x77, 0x2e, 0x76, 0x31, - 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4f, 0x77, 0x6e, 0x65, 0x64, 0x50, 0x6f, 0x73, 0x69, - 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, + 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, + 0x61, 0x2e, 0x76, 0x69, 0x65, 0x77, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, + 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x30, 0x01, 0x12, 0x75, 0x0a, 0x10, 0x4e, 0x6f, 0x74, 0x65, 0x42, 0x79, 0x43, 0x6f, 0x6d, 0x6d, + 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x2f, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, + 0x61, 0x2e, 0x76, 0x69, 0x65, 0x77, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, + 0x4e, 0x6f, 0x74, 0x65, 0x42, 0x79, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, + 0x72, 0x61, 0x2e, 0x76, 0x69, 0x65, 0x77, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, + 0x2e, 0x4e, 0x6f, 0x74, 0x65, 0x42, 0x79, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, + 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x75, 0x0a, 0x10, 0x53, 0x77, 0x61, + 0x70, 0x42, 0x79, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x2f, 0x2e, + 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x76, 0x69, 0x65, 0x77, 0x2e, 0x76, 0x31, + 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x77, 0x61, 0x70, 0x42, 0x79, 0x43, 0x6f, 0x6d, + 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x76, 0x69, 0x65, 0x77, 0x2e, 0x76, - 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4f, 0x77, 0x6e, 0x65, 0x64, 0x50, 0x6f, 0x73, - 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x30, 0x01, 0x12, 0x78, 0x0a, 0x11, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x65, 0x41, - 0x6e, 0x64, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x12, 0x30, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, + 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x77, 0x61, 0x70, 0x42, 0x79, 0x43, 0x6f, + 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x71, 0x0a, 0x0e, 0x55, 0x6e, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x65, 0x64, 0x53, 0x77, 0x61, + 0x70, 0x73, 0x12, 0x2d, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x76, 0x69, + 0x65, 0x77, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x55, 0x6e, 0x63, 0x6c, + 0x61, 0x69, 0x6d, 0x65, 0x64, 0x53, 0x77, 0x61, 0x70, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x2e, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x76, 0x69, 0x65, + 0x77, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x55, 0x6e, 0x63, 0x6c, 0x61, + 0x69, 0x6d, 0x65, 0x64, 0x53, 0x77, 0x61, 0x70, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x30, 0x01, 0x12, 0x72, 0x0a, 0x0f, 0x4e, 0x75, 0x6c, 0x6c, 0x69, 0x66, 0x69, 0x65, 0x72, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x2e, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, + 0x61, 0x2e, 0x76, 0x69, 0x65, 0x77, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, + 0x4e, 0x75, 0x6c, 0x6c, 0x69, 0x66, 0x69, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, + 0x61, 0x2e, 0x76, 0x69, 0x65, 0x77, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, + 0x4e, 0x75, 0x6c, 0x6c, 0x69, 0x66, 0x69, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x84, 0x01, 0x0a, 0x15, 0x54, 0x72, 0x61, 0x6e, + 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x42, 0x79, 0x48, 0x61, 0x73, + 0x68, 0x12, 0x34, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x76, 0x69, 0x65, + 0x77, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, + 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x42, 0x79, 0x48, 0x61, 0x73, 0x68, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x35, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x76, 0x69, 0x65, 0x77, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, - 0x2e, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x65, 0x41, 0x6e, 0x64, 0x42, 0x75, 0x69, - 0x6c, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x31, 0x2e, 0x70, 0x65, 0x6e, 0x75, + 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, + 0x42, 0x79, 0x48, 0x61, 0x73, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x74, + 0x0a, 0x0f, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, + 0x6f, 0x12, 0x2e, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x76, 0x69, 0x65, + 0x77, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, + 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x2f, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x76, 0x69, 0x65, + 0x77, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, + 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x30, 0x01, 0x12, 0x7b, 0x0a, 0x12, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x50, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x12, 0x31, 0x2e, 0x70, 0x65, 0x6e, + 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x76, 0x69, 0x65, 0x77, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, + 0x68, 0x61, 0x31, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, + 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x32, 0x2e, + 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x76, 0x69, 0x65, 0x77, 0x2e, 0x76, 0x31, + 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x50, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x81, 0x01, 0x0a, 0x14, 0x42, 0x72, 0x6f, 0x61, 0x64, 0x63, 0x61, 0x73, 0x74, 0x54, + 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x33, 0x2e, 0x70, 0x65, 0x6e, + 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x76, 0x69, 0x65, 0x77, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, + 0x68, 0x61, 0x31, 0x2e, 0x42, 0x72, 0x6f, 0x61, 0x64, 0x63, 0x61, 0x73, 0x74, 0x54, 0x72, 0x61, + 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x34, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x76, 0x69, 0x65, 0x77, 0x2e, + 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x42, 0x72, 0x6f, 0x61, 0x64, 0x63, 0x61, + 0x73, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x77, 0x0a, 0x10, 0x4f, 0x77, 0x6e, 0x65, 0x64, 0x50, 0x6f, + 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x73, 0x12, 0x2f, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x76, 0x69, 0x65, 0x77, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, - 0x61, 0x31, 0x2e, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x65, 0x41, 0x6e, 0x64, 0x42, - 0x75, 0x69, 0x6c, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x32, 0x70, 0x0a, 0x0f, - 0x56, 0x69, 0x65, 0x77, 0x41, 0x75, 0x74, 0x68, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, - 0x5d, 0x0a, 0x08, 0x56, 0x69, 0x65, 0x77, 0x41, 0x75, 0x74, 0x68, 0x12, 0x27, 0x2e, 0x70, 0x65, - 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x76, 0x69, 0x65, 0x77, 0x2e, 0x76, 0x31, 0x61, 0x6c, - 0x70, 0x68, 0x61, 0x31, 0x2e, 0x56, 0x69, 0x65, 0x77, 0x41, 0x75, 0x74, 0x68, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, - 0x76, 0x69, 0x65, 0x77, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x56, 0x69, - 0x65, 0x77, 0x41, 0x75, 0x74, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0xf5, - 0x01, 0x0a, 0x1a, 0x63, 0x6f, 0x6d, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, - 0x76, 0x69, 0x65, 0x77, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x42, 0x09, 0x56, - 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x52, 0x67, 0x69, 0x74, 0x68, - 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2d, - 0x7a, 0x6f, 0x6e, 0x65, 0x2f, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2f, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x6f, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x70, 0x65, 0x6e, 0x75, 0x6d, - 0x62, 0x72, 0x61, 0x2f, 0x76, 0x69, 0x65, 0x77, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, - 0x31, 0x3b, 0x76, 0x69, 0x65, 0x77, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0xa2, 0x02, - 0x03, 0x50, 0x56, 0x58, 0xaa, 0x02, 0x16, 0x50, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, - 0x56, 0x69, 0x65, 0x77, 0x2e, 0x56, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0xca, 0x02, 0x16, - 0x50, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x5c, 0x56, 0x69, 0x65, 0x77, 0x5c, 0x56, 0x31, - 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0xe2, 0x02, 0x22, 0x50, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, - 0x61, 0x5c, 0x56, 0x69, 0x65, 0x77, 0x5c, 0x56, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x5c, - 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x18, 0x50, 0x65, - 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x3a, 0x3a, 0x56, 0x69, 0x65, 0x77, 0x3a, 0x3a, 0x56, 0x31, - 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x61, 0x31, 0x2e, 0x4f, 0x77, 0x6e, 0x65, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x49, 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x70, 0x65, 0x6e, + 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x76, 0x69, 0x65, 0x77, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, + 0x68, 0x61, 0x31, 0x2e, 0x4f, 0x77, 0x6e, 0x65, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, + 0x6e, 0x49, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x30, 0x01, 0x12, 0x78, + 0x0a, 0x11, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x65, 0x41, 0x6e, 0x64, 0x42, 0x75, + 0x69, 0x6c, 0x64, 0x12, 0x30, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x76, + 0x69, 0x65, 0x77, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x41, 0x75, 0x74, + 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x65, 0x41, 0x6e, 0x64, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x31, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, + 0x2e, 0x76, 0x69, 0x65, 0x77, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x41, + 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x65, 0x41, 0x6e, 0x64, 0x42, 0x75, 0x69, 0x6c, 0x64, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0xf5, 0x01, 0x0a, 0x1a, 0x63, 0x6f, 0x6d, + 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x76, 0x69, 0x65, 0x77, 0x2e, 0x76, + 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x42, 0x09, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, + 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x52, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, + 0x2f, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2d, 0x7a, 0x6f, 0x6e, 0x65, 0x2f, 0x70, + 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x6f, + 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2f, 0x76, 0x69, + 0x65, 0x77, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x3b, 0x76, 0x69, 0x65, 0x77, + 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0xa2, 0x02, 0x03, 0x50, 0x56, 0x58, 0xaa, 0x02, + 0x16, 0x50, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x56, 0x69, 0x65, 0x77, 0x2e, 0x56, + 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0xca, 0x02, 0x16, 0x50, 0x65, 0x6e, 0x75, 0x6d, 0x62, + 0x72, 0x61, 0x5c, 0x56, 0x69, 0x65, 0x77, 0x5c, 0x56, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, + 0xe2, 0x02, 0x22, 0x50, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x5c, 0x56, 0x69, 0x65, 0x77, + 0x5c, 0x56, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, + 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x18, 0x50, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, + 0x3a, 0x3a, 0x56, 0x69, 0x65, 0x77, 0x3a, 0x3a, 0x56, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, + 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -4619,7 +4327,7 @@ func file_penumbra_view_v1alpha1_view_proto_rawDescGZIP() []byte { return file_penumbra_view_v1alpha1_view_proto_rawDescData } -var file_penumbra_view_v1alpha1_view_proto_msgTypes = make([]protoimpl.MessageInfo, 64) +var file_penumbra_view_v1alpha1_view_proto_msgTypes = make([]protoimpl.MessageInfo, 61) var file_penumbra_view_v1alpha1_view_proto_goTypes = []interface{}{ (*AuthorizeAndBuildRequest)(nil), // 0: penumbra.view.v1alpha1.AuthorizeAndBuildRequest (*AuthorizeAndBuildResponse)(nil), // 1: penumbra.view.v1alpha1.AuthorizeAndBuildResponse @@ -4637,251 +4345,233 @@ var file_penumbra_view_v1alpha1_view_proto_goTypes = []interface{}{ (*EphemeralAddressResponse)(nil), // 13: penumbra.view.v1alpha1.EphemeralAddressResponse (*BalancesRequest)(nil), // 14: penumbra.view.v1alpha1.BalancesRequest (*BalancesResponse)(nil), // 15: penumbra.view.v1alpha1.BalancesResponse - (*ViewAuthToken)(nil), // 16: penumbra.view.v1alpha1.ViewAuthToken - (*ViewAuthRequest)(nil), // 17: penumbra.view.v1alpha1.ViewAuthRequest - (*ViewAuthResponse)(nil), // 18: penumbra.view.v1alpha1.ViewAuthResponse - (*StatusRequest)(nil), // 19: penumbra.view.v1alpha1.StatusRequest - (*StatusResponse)(nil), // 20: penumbra.view.v1alpha1.StatusResponse - (*StatusStreamRequest)(nil), // 21: penumbra.view.v1alpha1.StatusStreamRequest - (*StatusStreamResponse)(nil), // 22: penumbra.view.v1alpha1.StatusStreamResponse - (*NotesRequest)(nil), // 23: penumbra.view.v1alpha1.NotesRequest - (*NotesForVotingRequest)(nil), // 24: penumbra.view.v1alpha1.NotesForVotingRequest - (*WitnessRequest)(nil), // 25: penumbra.view.v1alpha1.WitnessRequest - (*WitnessResponse)(nil), // 26: penumbra.view.v1alpha1.WitnessResponse - (*WitnessAndBuildRequest)(nil), // 27: penumbra.view.v1alpha1.WitnessAndBuildRequest - (*WitnessAndBuildResponse)(nil), // 28: penumbra.view.v1alpha1.WitnessAndBuildResponse - (*AssetsRequest)(nil), // 29: penumbra.view.v1alpha1.AssetsRequest - (*AssetsResponse)(nil), // 30: penumbra.view.v1alpha1.AssetsResponse - (*AppParametersRequest)(nil), // 31: penumbra.view.v1alpha1.AppParametersRequest - (*AppParametersResponse)(nil), // 32: penumbra.view.v1alpha1.AppParametersResponse - (*GasPricesRequest)(nil), // 33: penumbra.view.v1alpha1.GasPricesRequest - (*GasPricesResponse)(nil), // 34: penumbra.view.v1alpha1.GasPricesResponse - (*FMDParametersRequest)(nil), // 35: penumbra.view.v1alpha1.FMDParametersRequest - (*FMDParametersResponse)(nil), // 36: penumbra.view.v1alpha1.FMDParametersResponse - (*NoteByCommitmentRequest)(nil), // 37: penumbra.view.v1alpha1.NoteByCommitmentRequest - (*NoteByCommitmentResponse)(nil), // 38: penumbra.view.v1alpha1.NoteByCommitmentResponse - (*SwapByCommitmentRequest)(nil), // 39: penumbra.view.v1alpha1.SwapByCommitmentRequest - (*SwapByCommitmentResponse)(nil), // 40: penumbra.view.v1alpha1.SwapByCommitmentResponse - (*UnclaimedSwapsRequest)(nil), // 41: penumbra.view.v1alpha1.UnclaimedSwapsRequest - (*UnclaimedSwapsResponse)(nil), // 42: penumbra.view.v1alpha1.UnclaimedSwapsResponse - (*NullifierStatusRequest)(nil), // 43: penumbra.view.v1alpha1.NullifierStatusRequest - (*NullifierStatusResponse)(nil), // 44: penumbra.view.v1alpha1.NullifierStatusResponse - (*TransactionInfoByHashRequest)(nil), // 45: penumbra.view.v1alpha1.TransactionInfoByHashRequest - (*TransactionInfoRequest)(nil), // 46: penumbra.view.v1alpha1.TransactionInfoRequest - (*TransactionInfo)(nil), // 47: penumbra.view.v1alpha1.TransactionInfo - (*TransactionInfoResponse)(nil), // 48: penumbra.view.v1alpha1.TransactionInfoResponse - (*TransactionInfoByHashResponse)(nil), // 49: penumbra.view.v1alpha1.TransactionInfoByHashResponse - (*NotesResponse)(nil), // 50: penumbra.view.v1alpha1.NotesResponse - (*NotesForVotingResponse)(nil), // 51: penumbra.view.v1alpha1.NotesForVotingResponse - (*SpendableNoteRecord)(nil), // 52: penumbra.view.v1alpha1.SpendableNoteRecord - (*SwapRecord)(nil), // 53: penumbra.view.v1alpha1.SwapRecord - (*OwnedPositionIdsRequest)(nil), // 54: penumbra.view.v1alpha1.OwnedPositionIdsRequest - (*OwnedPositionIdsResponse)(nil), // 55: penumbra.view.v1alpha1.OwnedPositionIdsResponse - (*TransactionPlannerRequest_Output)(nil), // 56: penumbra.view.v1alpha1.TransactionPlannerRequest.Output - (*TransactionPlannerRequest_Swap)(nil), // 57: penumbra.view.v1alpha1.TransactionPlannerRequest.Swap - (*TransactionPlannerRequest_SwapClaim)(nil), // 58: penumbra.view.v1alpha1.TransactionPlannerRequest.SwapClaim - (*TransactionPlannerRequest_Delegate)(nil), // 59: penumbra.view.v1alpha1.TransactionPlannerRequest.Delegate - (*TransactionPlannerRequest_Undelegate)(nil), // 60: penumbra.view.v1alpha1.TransactionPlannerRequest.Undelegate - (*TransactionPlannerRequest_PositionOpen)(nil), // 61: penumbra.view.v1alpha1.TransactionPlannerRequest.PositionOpen - (*TransactionPlannerRequest_PositionClose)(nil), // 62: penumbra.view.v1alpha1.TransactionPlannerRequest.PositionClose - (*TransactionPlannerRequest_PositionWithdraw)(nil), // 63: penumbra.view.v1alpha1.TransactionPlannerRequest.PositionWithdraw - (*v1alpha1.TransactionPlan)(nil), // 64: penumbra.core.transaction.v1alpha1.TransactionPlan - (*v1alpha1.AuthorizationData)(nil), // 65: penumbra.core.transaction.v1alpha1.AuthorizationData - (*v1alpha1.Transaction)(nil), // 66: penumbra.core.transaction.v1alpha1.Transaction - (*v1alpha1.Id)(nil), // 67: penumbra.core.transaction.v1alpha1.Id - (*v1alpha11.Fee)(nil), // 68: penumbra.core.component.fee.v1alpha1.Fee - (*v1alpha1.MemoPlaintext)(nil), // 69: penumbra.core.transaction.v1alpha1.MemoPlaintext - (*v1alpha12.AddressIndex)(nil), // 70: penumbra.core.keys.v1alpha1.AddressIndex - (*v1alpha12.WalletId)(nil), // 71: penumbra.core.keys.v1alpha1.WalletId - (*v1alpha13.IbcRelay)(nil), // 72: penumbra.core.component.ibc.v1alpha1.IbcRelay - (*v1alpha13.Ics20Withdrawal)(nil), // 73: penumbra.core.component.ibc.v1alpha1.Ics20Withdrawal - (*v1alpha12.Address)(nil), // 74: penumbra.core.keys.v1alpha1.Address - (*v1alpha14.AssetId)(nil), // 75: penumbra.core.asset.v1alpha1.AssetId - (*v1alpha14.Value)(nil), // 76: penumbra.core.asset.v1alpha1.Value - (*v1alpha12.FullViewingKey)(nil), // 77: penumbra.core.keys.v1alpha1.FullViewingKey - (*v1alpha15.Amount)(nil), // 78: penumbra.core.num.v1alpha1.Amount - (*v1alpha16.StateCommitment)(nil), // 79: penumbra.crypto.tct.v1alpha1.StateCommitment - (*v1alpha1.WitnessData)(nil), // 80: penumbra.core.transaction.v1alpha1.WitnessData - (*v1alpha14.Denom)(nil), // 81: penumbra.core.asset.v1alpha1.Denom - (*v1alpha14.DenomMetadata)(nil), // 82: penumbra.core.asset.v1alpha1.DenomMetadata - (*v1alpha17.AppParameters)(nil), // 83: penumbra.core.app.v1alpha1.AppParameters - (*v1alpha11.GasPrices)(nil), // 84: penumbra.core.component.fee.v1alpha1.GasPrices - (*v1alpha18.FmdParameters)(nil), // 85: penumbra.core.component.chain.v1alpha1.FmdParameters - (*v1alpha19.Nullifier)(nil), // 86: penumbra.core.component.sct.v1alpha1.Nullifier - (*v1alpha1.TransactionPerspective)(nil), // 87: penumbra.core.transaction.v1alpha1.TransactionPerspective - (*v1alpha1.TransactionView)(nil), // 88: penumbra.core.transaction.v1alpha1.TransactionView - (*v1alpha12.IdentityKey)(nil), // 89: penumbra.core.keys.v1alpha1.IdentityKey - (*v1alpha110.Note)(nil), // 90: penumbra.core.component.shielded_pool.v1alpha1.Note - (*v1alpha19.CommitmentSource)(nil), // 91: penumbra.core.component.sct.v1alpha1.CommitmentSource - (*v1alpha111.SwapPlaintext)(nil), // 92: penumbra.core.component.dex.v1alpha1.SwapPlaintext - (*v1alpha111.BatchSwapOutputData)(nil), // 93: penumbra.core.component.dex.v1alpha1.BatchSwapOutputData - (*v1alpha111.PositionState)(nil), // 94: penumbra.core.component.dex.v1alpha1.PositionState - (*v1alpha111.TradingPair)(nil), // 95: penumbra.core.component.dex.v1alpha1.TradingPair - (*v1alpha111.PositionId)(nil), // 96: penumbra.core.component.dex.v1alpha1.PositionId - (*v1alpha112.RateData)(nil), // 97: penumbra.core.component.stake.v1alpha1.RateData - (*v1alpha111.Position)(nil), // 98: penumbra.core.component.dex.v1alpha1.Position - (*v1alpha111.Reserves)(nil), // 99: penumbra.core.component.dex.v1alpha1.Reserves + (*StatusRequest)(nil), // 16: penumbra.view.v1alpha1.StatusRequest + (*StatusResponse)(nil), // 17: penumbra.view.v1alpha1.StatusResponse + (*StatusStreamRequest)(nil), // 18: penumbra.view.v1alpha1.StatusStreamRequest + (*StatusStreamResponse)(nil), // 19: penumbra.view.v1alpha1.StatusStreamResponse + (*NotesRequest)(nil), // 20: penumbra.view.v1alpha1.NotesRequest + (*NotesForVotingRequest)(nil), // 21: penumbra.view.v1alpha1.NotesForVotingRequest + (*WitnessRequest)(nil), // 22: penumbra.view.v1alpha1.WitnessRequest + (*WitnessResponse)(nil), // 23: penumbra.view.v1alpha1.WitnessResponse + (*WitnessAndBuildRequest)(nil), // 24: penumbra.view.v1alpha1.WitnessAndBuildRequest + (*WitnessAndBuildResponse)(nil), // 25: penumbra.view.v1alpha1.WitnessAndBuildResponse + (*AssetsRequest)(nil), // 26: penumbra.view.v1alpha1.AssetsRequest + (*AssetsResponse)(nil), // 27: penumbra.view.v1alpha1.AssetsResponse + (*AppParametersRequest)(nil), // 28: penumbra.view.v1alpha1.AppParametersRequest + (*AppParametersResponse)(nil), // 29: penumbra.view.v1alpha1.AppParametersResponse + (*GasPricesRequest)(nil), // 30: penumbra.view.v1alpha1.GasPricesRequest + (*GasPricesResponse)(nil), // 31: penumbra.view.v1alpha1.GasPricesResponse + (*FMDParametersRequest)(nil), // 32: penumbra.view.v1alpha1.FMDParametersRequest + (*FMDParametersResponse)(nil), // 33: penumbra.view.v1alpha1.FMDParametersResponse + (*NoteByCommitmentRequest)(nil), // 34: penumbra.view.v1alpha1.NoteByCommitmentRequest + (*NoteByCommitmentResponse)(nil), // 35: penumbra.view.v1alpha1.NoteByCommitmentResponse + (*SwapByCommitmentRequest)(nil), // 36: penumbra.view.v1alpha1.SwapByCommitmentRequest + (*SwapByCommitmentResponse)(nil), // 37: penumbra.view.v1alpha1.SwapByCommitmentResponse + (*UnclaimedSwapsRequest)(nil), // 38: penumbra.view.v1alpha1.UnclaimedSwapsRequest + (*UnclaimedSwapsResponse)(nil), // 39: penumbra.view.v1alpha1.UnclaimedSwapsResponse + (*NullifierStatusRequest)(nil), // 40: penumbra.view.v1alpha1.NullifierStatusRequest + (*NullifierStatusResponse)(nil), // 41: penumbra.view.v1alpha1.NullifierStatusResponse + (*TransactionInfoByHashRequest)(nil), // 42: penumbra.view.v1alpha1.TransactionInfoByHashRequest + (*TransactionInfoRequest)(nil), // 43: penumbra.view.v1alpha1.TransactionInfoRequest + (*TransactionInfo)(nil), // 44: penumbra.view.v1alpha1.TransactionInfo + (*TransactionInfoResponse)(nil), // 45: penumbra.view.v1alpha1.TransactionInfoResponse + (*TransactionInfoByHashResponse)(nil), // 46: penumbra.view.v1alpha1.TransactionInfoByHashResponse + (*NotesResponse)(nil), // 47: penumbra.view.v1alpha1.NotesResponse + (*NotesForVotingResponse)(nil), // 48: penumbra.view.v1alpha1.NotesForVotingResponse + (*SpendableNoteRecord)(nil), // 49: penumbra.view.v1alpha1.SpendableNoteRecord + (*SwapRecord)(nil), // 50: penumbra.view.v1alpha1.SwapRecord + (*OwnedPositionIdsRequest)(nil), // 51: penumbra.view.v1alpha1.OwnedPositionIdsRequest + (*OwnedPositionIdsResponse)(nil), // 52: penumbra.view.v1alpha1.OwnedPositionIdsResponse + (*TransactionPlannerRequest_Output)(nil), // 53: penumbra.view.v1alpha1.TransactionPlannerRequest.Output + (*TransactionPlannerRequest_Swap)(nil), // 54: penumbra.view.v1alpha1.TransactionPlannerRequest.Swap + (*TransactionPlannerRequest_SwapClaim)(nil), // 55: penumbra.view.v1alpha1.TransactionPlannerRequest.SwapClaim + (*TransactionPlannerRequest_Delegate)(nil), // 56: penumbra.view.v1alpha1.TransactionPlannerRequest.Delegate + (*TransactionPlannerRequest_Undelegate)(nil), // 57: penumbra.view.v1alpha1.TransactionPlannerRequest.Undelegate + (*TransactionPlannerRequest_PositionOpen)(nil), // 58: penumbra.view.v1alpha1.TransactionPlannerRequest.PositionOpen + (*TransactionPlannerRequest_PositionClose)(nil), // 59: penumbra.view.v1alpha1.TransactionPlannerRequest.PositionClose + (*TransactionPlannerRequest_PositionWithdraw)(nil), // 60: penumbra.view.v1alpha1.TransactionPlannerRequest.PositionWithdraw + (*v1alpha1.TransactionPlan)(nil), // 61: penumbra.core.transaction.v1alpha1.TransactionPlan + (*v1alpha1.AuthorizationData)(nil), // 62: penumbra.core.transaction.v1alpha1.AuthorizationData + (*v1alpha1.Transaction)(nil), // 63: penumbra.core.transaction.v1alpha1.Transaction + (*v1alpha11.TransactionId)(nil), // 64: penumbra.core.txhash.v1alpha1.TransactionId + (*v1alpha12.Fee)(nil), // 65: penumbra.core.component.fee.v1alpha1.Fee + (*v1alpha1.MemoPlaintext)(nil), // 66: penumbra.core.transaction.v1alpha1.MemoPlaintext + (*v1alpha13.AddressIndex)(nil), // 67: penumbra.core.keys.v1alpha1.AddressIndex + (*v1alpha14.IbcRelay)(nil), // 68: penumbra.core.component.ibc.v1alpha1.IbcRelay + (*v1alpha14.Ics20Withdrawal)(nil), // 69: penumbra.core.component.ibc.v1alpha1.Ics20Withdrawal + (*v1alpha13.Address)(nil), // 70: penumbra.core.keys.v1alpha1.Address + (*v1alpha13.WalletId)(nil), // 71: penumbra.core.keys.v1alpha1.WalletId + (*v1alpha15.AssetId)(nil), // 72: penumbra.core.asset.v1alpha1.AssetId + (*v1alpha15.Value)(nil), // 73: penumbra.core.asset.v1alpha1.Value + (*v1alpha16.Amount)(nil), // 74: penumbra.core.num.v1alpha1.Amount + (*v1alpha17.StateCommitment)(nil), // 75: penumbra.crypto.tct.v1alpha1.StateCommitment + (*v1alpha1.WitnessData)(nil), // 76: penumbra.core.transaction.v1alpha1.WitnessData + (*v1alpha15.Denom)(nil), // 77: penumbra.core.asset.v1alpha1.Denom + (*v1alpha15.DenomMetadata)(nil), // 78: penumbra.core.asset.v1alpha1.DenomMetadata + (*v1alpha18.AppParameters)(nil), // 79: penumbra.core.app.v1alpha1.AppParameters + (*v1alpha12.GasPrices)(nil), // 80: penumbra.core.component.fee.v1alpha1.GasPrices + (*v1alpha19.FmdParameters)(nil), // 81: penumbra.core.component.chain.v1alpha1.FmdParameters + (*v1alpha110.Nullifier)(nil), // 82: penumbra.core.component.sct.v1alpha1.Nullifier + (*v1alpha1.TransactionPerspective)(nil), // 83: penumbra.core.transaction.v1alpha1.TransactionPerspective + (*v1alpha1.TransactionView)(nil), // 84: penumbra.core.transaction.v1alpha1.TransactionView + (*v1alpha13.IdentityKey)(nil), // 85: penumbra.core.keys.v1alpha1.IdentityKey + (*v1alpha111.Note)(nil), // 86: penumbra.core.component.shielded_pool.v1alpha1.Note + (*v1alpha110.CommitmentSource)(nil), // 87: penumbra.core.component.sct.v1alpha1.CommitmentSource + (*v1alpha112.SwapPlaintext)(nil), // 88: penumbra.core.component.dex.v1alpha1.SwapPlaintext + (*v1alpha112.BatchSwapOutputData)(nil), // 89: penumbra.core.component.dex.v1alpha1.BatchSwapOutputData + (*v1alpha112.PositionState)(nil), // 90: penumbra.core.component.dex.v1alpha1.PositionState + (*v1alpha112.TradingPair)(nil), // 91: penumbra.core.component.dex.v1alpha1.TradingPair + (*v1alpha112.PositionId)(nil), // 92: penumbra.core.component.dex.v1alpha1.PositionId + (*v1alpha113.RateData)(nil), // 93: penumbra.core.component.stake.v1alpha1.RateData + (*v1alpha112.Position)(nil), // 94: penumbra.core.component.dex.v1alpha1.Position + (*v1alpha112.Reserves)(nil), // 95: penumbra.core.component.dex.v1alpha1.Reserves } var file_penumbra_view_v1alpha1_view_proto_depIdxs = []int32{ - 64, // 0: penumbra.view.v1alpha1.AuthorizeAndBuildRequest.transaction_plan:type_name -> penumbra.core.transaction.v1alpha1.TransactionPlan - 65, // 1: penumbra.view.v1alpha1.AuthorizeAndBuildRequest.authorization_data:type_name -> penumbra.core.transaction.v1alpha1.AuthorizationData - 66, // 2: penumbra.view.v1alpha1.AuthorizeAndBuildResponse.transaction:type_name -> penumbra.core.transaction.v1alpha1.Transaction - 66, // 3: penumbra.view.v1alpha1.BroadcastTransactionRequest.transaction:type_name -> penumbra.core.transaction.v1alpha1.Transaction - 67, // 4: penumbra.view.v1alpha1.BroadcastTransactionResponse.id:type_name -> penumbra.core.transaction.v1alpha1.Id - 68, // 5: penumbra.view.v1alpha1.TransactionPlannerRequest.fee:type_name -> penumbra.core.component.fee.v1alpha1.Fee - 69, // 6: penumbra.view.v1alpha1.TransactionPlannerRequest.memo:type_name -> penumbra.core.transaction.v1alpha1.MemoPlaintext - 70, // 7: penumbra.view.v1alpha1.TransactionPlannerRequest.source:type_name -> penumbra.core.keys.v1alpha1.AddressIndex - 71, // 8: penumbra.view.v1alpha1.TransactionPlannerRequest.wallet_id:type_name -> penumbra.core.keys.v1alpha1.WalletId - 56, // 9: penumbra.view.v1alpha1.TransactionPlannerRequest.outputs:type_name -> penumbra.view.v1alpha1.TransactionPlannerRequest.Output - 57, // 10: penumbra.view.v1alpha1.TransactionPlannerRequest.swaps:type_name -> penumbra.view.v1alpha1.TransactionPlannerRequest.Swap - 58, // 11: penumbra.view.v1alpha1.TransactionPlannerRequest.swap_claims:type_name -> penumbra.view.v1alpha1.TransactionPlannerRequest.SwapClaim - 59, // 12: penumbra.view.v1alpha1.TransactionPlannerRequest.delegations:type_name -> penumbra.view.v1alpha1.TransactionPlannerRequest.Delegate - 60, // 13: penumbra.view.v1alpha1.TransactionPlannerRequest.undelegations:type_name -> penumbra.view.v1alpha1.TransactionPlannerRequest.Undelegate - 72, // 14: penumbra.view.v1alpha1.TransactionPlannerRequest.ibc_relay_actions:type_name -> penumbra.core.component.ibc.v1alpha1.IbcRelay - 73, // 15: penumbra.view.v1alpha1.TransactionPlannerRequest.ics20_withdrawals:type_name -> penumbra.core.component.ibc.v1alpha1.Ics20Withdrawal - 61, // 16: penumbra.view.v1alpha1.TransactionPlannerRequest.position_opens:type_name -> penumbra.view.v1alpha1.TransactionPlannerRequest.PositionOpen - 62, // 17: penumbra.view.v1alpha1.TransactionPlannerRequest.position_closes:type_name -> penumbra.view.v1alpha1.TransactionPlannerRequest.PositionClose - 63, // 18: penumbra.view.v1alpha1.TransactionPlannerRequest.position_withdraws:type_name -> penumbra.view.v1alpha1.TransactionPlannerRequest.PositionWithdraw - 64, // 19: penumbra.view.v1alpha1.TransactionPlannerResponse.plan:type_name -> penumbra.core.transaction.v1alpha1.TransactionPlan - 70, // 20: penumbra.view.v1alpha1.AddressByIndexRequest.address_index:type_name -> penumbra.core.keys.v1alpha1.AddressIndex - 74, // 21: penumbra.view.v1alpha1.AddressByIndexResponse.address:type_name -> penumbra.core.keys.v1alpha1.Address - 71, // 22: penumbra.view.v1alpha1.WalletIdResponse.wallet_id:type_name -> penumbra.core.keys.v1alpha1.WalletId - 74, // 23: penumbra.view.v1alpha1.IndexByAddressRequest.address:type_name -> penumbra.core.keys.v1alpha1.Address - 70, // 24: penumbra.view.v1alpha1.IndexByAddressResponse.address_index:type_name -> penumbra.core.keys.v1alpha1.AddressIndex - 70, // 25: penumbra.view.v1alpha1.EphemeralAddressRequest.address_index:type_name -> penumbra.core.keys.v1alpha1.AddressIndex - 74, // 26: penumbra.view.v1alpha1.EphemeralAddressResponse.address:type_name -> penumbra.core.keys.v1alpha1.Address - 70, // 27: penumbra.view.v1alpha1.BalancesRequest.account_filter:type_name -> penumbra.core.keys.v1alpha1.AddressIndex - 75, // 28: penumbra.view.v1alpha1.BalancesRequest.asset_id_filter:type_name -> penumbra.core.asset.v1alpha1.AssetId - 70, // 29: penumbra.view.v1alpha1.BalancesResponse.account:type_name -> penumbra.core.keys.v1alpha1.AddressIndex - 76, // 30: penumbra.view.v1alpha1.BalancesResponse.balance:type_name -> penumbra.core.asset.v1alpha1.Value - 77, // 31: penumbra.view.v1alpha1.ViewAuthRequest.fvk:type_name -> penumbra.core.keys.v1alpha1.FullViewingKey - 16, // 32: penumbra.view.v1alpha1.ViewAuthResponse.token:type_name -> penumbra.view.v1alpha1.ViewAuthToken - 71, // 33: penumbra.view.v1alpha1.StatusRequest.wallet_id:type_name -> penumbra.core.keys.v1alpha1.WalletId - 71, // 34: penumbra.view.v1alpha1.StatusStreamRequest.wallet_id:type_name -> penumbra.core.keys.v1alpha1.WalletId - 75, // 35: penumbra.view.v1alpha1.NotesRequest.asset_id:type_name -> penumbra.core.asset.v1alpha1.AssetId - 70, // 36: penumbra.view.v1alpha1.NotesRequest.address_index:type_name -> penumbra.core.keys.v1alpha1.AddressIndex - 78, // 37: penumbra.view.v1alpha1.NotesRequest.amount_to_spend:type_name -> penumbra.core.num.v1alpha1.Amount - 71, // 38: penumbra.view.v1alpha1.NotesRequest.wallet_id:type_name -> penumbra.core.keys.v1alpha1.WalletId - 70, // 39: penumbra.view.v1alpha1.NotesForVotingRequest.address_index:type_name -> penumbra.core.keys.v1alpha1.AddressIndex - 71, // 40: penumbra.view.v1alpha1.NotesForVotingRequest.wallet_id:type_name -> penumbra.core.keys.v1alpha1.WalletId - 79, // 41: penumbra.view.v1alpha1.WitnessRequest.note_commitments:type_name -> penumbra.crypto.tct.v1alpha1.StateCommitment - 64, // 42: penumbra.view.v1alpha1.WitnessRequest.transaction_plan:type_name -> penumbra.core.transaction.v1alpha1.TransactionPlan - 71, // 43: penumbra.view.v1alpha1.WitnessRequest.wallet_id:type_name -> penumbra.core.keys.v1alpha1.WalletId - 80, // 44: penumbra.view.v1alpha1.WitnessResponse.witness_data:type_name -> penumbra.core.transaction.v1alpha1.WitnessData - 64, // 45: penumbra.view.v1alpha1.WitnessAndBuildRequest.transaction_plan:type_name -> penumbra.core.transaction.v1alpha1.TransactionPlan - 65, // 46: penumbra.view.v1alpha1.WitnessAndBuildRequest.authorization_data:type_name -> penumbra.core.transaction.v1alpha1.AuthorizationData - 66, // 47: penumbra.view.v1alpha1.WitnessAndBuildResponse.transaction:type_name -> penumbra.core.transaction.v1alpha1.Transaction - 81, // 48: penumbra.view.v1alpha1.AssetsRequest.include_specific_denominations:type_name -> penumbra.core.asset.v1alpha1.Denom - 82, // 49: penumbra.view.v1alpha1.AssetsResponse.denom_metadata:type_name -> penumbra.core.asset.v1alpha1.DenomMetadata - 83, // 50: penumbra.view.v1alpha1.AppParametersResponse.parameters:type_name -> penumbra.core.app.v1alpha1.AppParameters - 84, // 51: penumbra.view.v1alpha1.GasPricesResponse.gas_prices:type_name -> penumbra.core.component.fee.v1alpha1.GasPrices - 85, // 52: penumbra.view.v1alpha1.FMDParametersResponse.parameters:type_name -> penumbra.core.component.chain.v1alpha1.FmdParameters - 79, // 53: penumbra.view.v1alpha1.NoteByCommitmentRequest.note_commitment:type_name -> penumbra.crypto.tct.v1alpha1.StateCommitment - 71, // 54: penumbra.view.v1alpha1.NoteByCommitmentRequest.wallet_id:type_name -> penumbra.core.keys.v1alpha1.WalletId - 52, // 55: penumbra.view.v1alpha1.NoteByCommitmentResponse.spendable_note:type_name -> penumbra.view.v1alpha1.SpendableNoteRecord - 79, // 56: penumbra.view.v1alpha1.SwapByCommitmentRequest.swap_commitment:type_name -> penumbra.crypto.tct.v1alpha1.StateCommitment - 71, // 57: penumbra.view.v1alpha1.SwapByCommitmentRequest.wallet_id:type_name -> penumbra.core.keys.v1alpha1.WalletId - 53, // 58: penumbra.view.v1alpha1.SwapByCommitmentResponse.swap:type_name -> penumbra.view.v1alpha1.SwapRecord - 71, // 59: penumbra.view.v1alpha1.UnclaimedSwapsRequest.wallet_id:type_name -> penumbra.core.keys.v1alpha1.WalletId - 53, // 60: penumbra.view.v1alpha1.UnclaimedSwapsResponse.swap:type_name -> penumbra.view.v1alpha1.SwapRecord - 86, // 61: penumbra.view.v1alpha1.NullifierStatusRequest.nullifier:type_name -> penumbra.core.component.sct.v1alpha1.Nullifier - 71, // 62: penumbra.view.v1alpha1.NullifierStatusRequest.wallet_id:type_name -> penumbra.core.keys.v1alpha1.WalletId - 67, // 63: penumbra.view.v1alpha1.TransactionInfoByHashRequest.id:type_name -> penumbra.core.transaction.v1alpha1.Id - 67, // 64: penumbra.view.v1alpha1.TransactionInfo.id:type_name -> penumbra.core.transaction.v1alpha1.Id - 66, // 65: penumbra.view.v1alpha1.TransactionInfo.transaction:type_name -> penumbra.core.transaction.v1alpha1.Transaction - 87, // 66: penumbra.view.v1alpha1.TransactionInfo.perspective:type_name -> penumbra.core.transaction.v1alpha1.TransactionPerspective - 88, // 67: penumbra.view.v1alpha1.TransactionInfo.view:type_name -> penumbra.core.transaction.v1alpha1.TransactionView - 47, // 68: penumbra.view.v1alpha1.TransactionInfoResponse.tx_info:type_name -> penumbra.view.v1alpha1.TransactionInfo - 47, // 69: penumbra.view.v1alpha1.TransactionInfoByHashResponse.tx_info:type_name -> penumbra.view.v1alpha1.TransactionInfo - 52, // 70: penumbra.view.v1alpha1.NotesResponse.note_record:type_name -> penumbra.view.v1alpha1.SpendableNoteRecord - 52, // 71: penumbra.view.v1alpha1.NotesForVotingResponse.note_record:type_name -> penumbra.view.v1alpha1.SpendableNoteRecord - 89, // 72: penumbra.view.v1alpha1.NotesForVotingResponse.identity_key:type_name -> penumbra.core.keys.v1alpha1.IdentityKey - 79, // 73: penumbra.view.v1alpha1.SpendableNoteRecord.note_commitment:type_name -> penumbra.crypto.tct.v1alpha1.StateCommitment - 90, // 74: penumbra.view.v1alpha1.SpendableNoteRecord.note:type_name -> penumbra.core.component.shielded_pool.v1alpha1.Note - 70, // 75: penumbra.view.v1alpha1.SpendableNoteRecord.address_index:type_name -> penumbra.core.keys.v1alpha1.AddressIndex - 86, // 76: penumbra.view.v1alpha1.SpendableNoteRecord.nullifier:type_name -> penumbra.core.component.sct.v1alpha1.Nullifier - 91, // 77: penumbra.view.v1alpha1.SpendableNoteRecord.source:type_name -> penumbra.core.component.sct.v1alpha1.CommitmentSource - 79, // 78: penumbra.view.v1alpha1.SwapRecord.swap_commitment:type_name -> penumbra.crypto.tct.v1alpha1.StateCommitment - 92, // 79: penumbra.view.v1alpha1.SwapRecord.swap:type_name -> penumbra.core.component.dex.v1alpha1.SwapPlaintext - 86, // 80: penumbra.view.v1alpha1.SwapRecord.nullifier:type_name -> penumbra.core.component.sct.v1alpha1.Nullifier - 93, // 81: penumbra.view.v1alpha1.SwapRecord.output_data:type_name -> penumbra.core.component.dex.v1alpha1.BatchSwapOutputData - 91, // 82: penumbra.view.v1alpha1.SwapRecord.source:type_name -> penumbra.core.component.sct.v1alpha1.CommitmentSource - 94, // 83: penumbra.view.v1alpha1.OwnedPositionIdsRequest.position_state:type_name -> penumbra.core.component.dex.v1alpha1.PositionState - 95, // 84: penumbra.view.v1alpha1.OwnedPositionIdsRequest.trading_pair:type_name -> penumbra.core.component.dex.v1alpha1.TradingPair - 96, // 85: penumbra.view.v1alpha1.OwnedPositionIdsResponse.position_id:type_name -> penumbra.core.component.dex.v1alpha1.PositionId - 76, // 86: penumbra.view.v1alpha1.TransactionPlannerRequest.Output.value:type_name -> penumbra.core.asset.v1alpha1.Value - 74, // 87: penumbra.view.v1alpha1.TransactionPlannerRequest.Output.address:type_name -> penumbra.core.keys.v1alpha1.Address - 76, // 88: penumbra.view.v1alpha1.TransactionPlannerRequest.Swap.value:type_name -> penumbra.core.asset.v1alpha1.Value - 75, // 89: penumbra.view.v1alpha1.TransactionPlannerRequest.Swap.target_asset:type_name -> penumbra.core.asset.v1alpha1.AssetId - 68, // 90: penumbra.view.v1alpha1.TransactionPlannerRequest.Swap.fee:type_name -> penumbra.core.component.fee.v1alpha1.Fee - 74, // 91: penumbra.view.v1alpha1.TransactionPlannerRequest.Swap.claim_address:type_name -> penumbra.core.keys.v1alpha1.Address - 79, // 92: penumbra.view.v1alpha1.TransactionPlannerRequest.SwapClaim.swap_commitment:type_name -> penumbra.crypto.tct.v1alpha1.StateCommitment - 78, // 93: penumbra.view.v1alpha1.TransactionPlannerRequest.Delegate.amount:type_name -> penumbra.core.num.v1alpha1.Amount - 97, // 94: penumbra.view.v1alpha1.TransactionPlannerRequest.Delegate.rate_data:type_name -> penumbra.core.component.stake.v1alpha1.RateData - 76, // 95: penumbra.view.v1alpha1.TransactionPlannerRequest.Undelegate.value:type_name -> penumbra.core.asset.v1alpha1.Value - 97, // 96: penumbra.view.v1alpha1.TransactionPlannerRequest.Undelegate.rate_data:type_name -> penumbra.core.component.stake.v1alpha1.RateData - 98, // 97: penumbra.view.v1alpha1.TransactionPlannerRequest.PositionOpen.position:type_name -> penumbra.core.component.dex.v1alpha1.Position - 96, // 98: penumbra.view.v1alpha1.TransactionPlannerRequest.PositionClose.position_id:type_name -> penumbra.core.component.dex.v1alpha1.PositionId - 96, // 99: penumbra.view.v1alpha1.TransactionPlannerRequest.PositionWithdraw.position_id:type_name -> penumbra.core.component.dex.v1alpha1.PositionId - 99, // 100: penumbra.view.v1alpha1.TransactionPlannerRequest.PositionWithdraw.reserves:type_name -> penumbra.core.component.dex.v1alpha1.Reserves - 95, // 101: penumbra.view.v1alpha1.TransactionPlannerRequest.PositionWithdraw.trading_pair:type_name -> penumbra.core.component.dex.v1alpha1.TradingPair - 19, // 102: penumbra.view.v1alpha1.ViewProtocolService.Status:input_type -> penumbra.view.v1alpha1.StatusRequest - 21, // 103: penumbra.view.v1alpha1.ViewProtocolService.StatusStream:input_type -> penumbra.view.v1alpha1.StatusStreamRequest - 23, // 104: penumbra.view.v1alpha1.ViewProtocolService.Notes:input_type -> penumbra.view.v1alpha1.NotesRequest - 24, // 105: penumbra.view.v1alpha1.ViewProtocolService.NotesForVoting:input_type -> penumbra.view.v1alpha1.NotesForVotingRequest - 25, // 106: penumbra.view.v1alpha1.ViewProtocolService.Witness:input_type -> penumbra.view.v1alpha1.WitnessRequest - 27, // 107: penumbra.view.v1alpha1.ViewProtocolService.WitnessAndBuild:input_type -> penumbra.view.v1alpha1.WitnessAndBuildRequest - 29, // 108: penumbra.view.v1alpha1.ViewProtocolService.Assets:input_type -> penumbra.view.v1alpha1.AssetsRequest - 31, // 109: penumbra.view.v1alpha1.ViewProtocolService.AppParameters:input_type -> penumbra.view.v1alpha1.AppParametersRequest - 33, // 110: penumbra.view.v1alpha1.ViewProtocolService.GasPrices:input_type -> penumbra.view.v1alpha1.GasPricesRequest - 35, // 111: penumbra.view.v1alpha1.ViewProtocolService.FMDParameters:input_type -> penumbra.view.v1alpha1.FMDParametersRequest - 6, // 112: penumbra.view.v1alpha1.ViewProtocolService.AddressByIndex:input_type -> penumbra.view.v1alpha1.AddressByIndexRequest - 8, // 113: penumbra.view.v1alpha1.ViewProtocolService.WalletId:input_type -> penumbra.view.v1alpha1.WalletIdRequest - 10, // 114: penumbra.view.v1alpha1.ViewProtocolService.IndexByAddress:input_type -> penumbra.view.v1alpha1.IndexByAddressRequest - 12, // 115: penumbra.view.v1alpha1.ViewProtocolService.EphemeralAddress:input_type -> penumbra.view.v1alpha1.EphemeralAddressRequest - 14, // 116: penumbra.view.v1alpha1.ViewProtocolService.Balances:input_type -> penumbra.view.v1alpha1.BalancesRequest - 37, // 117: penumbra.view.v1alpha1.ViewProtocolService.NoteByCommitment:input_type -> penumbra.view.v1alpha1.NoteByCommitmentRequest - 39, // 118: penumbra.view.v1alpha1.ViewProtocolService.SwapByCommitment:input_type -> penumbra.view.v1alpha1.SwapByCommitmentRequest - 41, // 119: penumbra.view.v1alpha1.ViewProtocolService.UnclaimedSwaps:input_type -> penumbra.view.v1alpha1.UnclaimedSwapsRequest - 43, // 120: penumbra.view.v1alpha1.ViewProtocolService.NullifierStatus:input_type -> penumbra.view.v1alpha1.NullifierStatusRequest - 45, // 121: penumbra.view.v1alpha1.ViewProtocolService.TransactionInfoByHash:input_type -> penumbra.view.v1alpha1.TransactionInfoByHashRequest - 46, // 122: penumbra.view.v1alpha1.ViewProtocolService.TransactionInfo:input_type -> penumbra.view.v1alpha1.TransactionInfoRequest - 4, // 123: penumbra.view.v1alpha1.ViewProtocolService.TransactionPlanner:input_type -> penumbra.view.v1alpha1.TransactionPlannerRequest - 2, // 124: penumbra.view.v1alpha1.ViewProtocolService.BroadcastTransaction:input_type -> penumbra.view.v1alpha1.BroadcastTransactionRequest - 54, // 125: penumbra.view.v1alpha1.ViewProtocolService.OwnedPositionIds:input_type -> penumbra.view.v1alpha1.OwnedPositionIdsRequest - 0, // 126: penumbra.view.v1alpha1.ViewProtocolService.AuthorizeAndBuild:input_type -> penumbra.view.v1alpha1.AuthorizeAndBuildRequest - 17, // 127: penumbra.view.v1alpha1.ViewAuthService.ViewAuth:input_type -> penumbra.view.v1alpha1.ViewAuthRequest - 20, // 128: penumbra.view.v1alpha1.ViewProtocolService.Status:output_type -> penumbra.view.v1alpha1.StatusResponse - 22, // 129: penumbra.view.v1alpha1.ViewProtocolService.StatusStream:output_type -> penumbra.view.v1alpha1.StatusStreamResponse - 50, // 130: penumbra.view.v1alpha1.ViewProtocolService.Notes:output_type -> penumbra.view.v1alpha1.NotesResponse - 51, // 131: penumbra.view.v1alpha1.ViewProtocolService.NotesForVoting:output_type -> penumbra.view.v1alpha1.NotesForVotingResponse - 26, // 132: penumbra.view.v1alpha1.ViewProtocolService.Witness:output_type -> penumbra.view.v1alpha1.WitnessResponse - 28, // 133: penumbra.view.v1alpha1.ViewProtocolService.WitnessAndBuild:output_type -> penumbra.view.v1alpha1.WitnessAndBuildResponse - 30, // 134: penumbra.view.v1alpha1.ViewProtocolService.Assets:output_type -> penumbra.view.v1alpha1.AssetsResponse - 32, // 135: penumbra.view.v1alpha1.ViewProtocolService.AppParameters:output_type -> penumbra.view.v1alpha1.AppParametersResponse - 34, // 136: penumbra.view.v1alpha1.ViewProtocolService.GasPrices:output_type -> penumbra.view.v1alpha1.GasPricesResponse - 36, // 137: penumbra.view.v1alpha1.ViewProtocolService.FMDParameters:output_type -> penumbra.view.v1alpha1.FMDParametersResponse - 7, // 138: penumbra.view.v1alpha1.ViewProtocolService.AddressByIndex:output_type -> penumbra.view.v1alpha1.AddressByIndexResponse - 9, // 139: penumbra.view.v1alpha1.ViewProtocolService.WalletId:output_type -> penumbra.view.v1alpha1.WalletIdResponse - 11, // 140: penumbra.view.v1alpha1.ViewProtocolService.IndexByAddress:output_type -> penumbra.view.v1alpha1.IndexByAddressResponse - 13, // 141: penumbra.view.v1alpha1.ViewProtocolService.EphemeralAddress:output_type -> penumbra.view.v1alpha1.EphemeralAddressResponse - 15, // 142: penumbra.view.v1alpha1.ViewProtocolService.Balances:output_type -> penumbra.view.v1alpha1.BalancesResponse - 38, // 143: penumbra.view.v1alpha1.ViewProtocolService.NoteByCommitment:output_type -> penumbra.view.v1alpha1.NoteByCommitmentResponse - 40, // 144: penumbra.view.v1alpha1.ViewProtocolService.SwapByCommitment:output_type -> penumbra.view.v1alpha1.SwapByCommitmentResponse - 42, // 145: penumbra.view.v1alpha1.ViewProtocolService.UnclaimedSwaps:output_type -> penumbra.view.v1alpha1.UnclaimedSwapsResponse - 44, // 146: penumbra.view.v1alpha1.ViewProtocolService.NullifierStatus:output_type -> penumbra.view.v1alpha1.NullifierStatusResponse - 49, // 147: penumbra.view.v1alpha1.ViewProtocolService.TransactionInfoByHash:output_type -> penumbra.view.v1alpha1.TransactionInfoByHashResponse - 48, // 148: penumbra.view.v1alpha1.ViewProtocolService.TransactionInfo:output_type -> penumbra.view.v1alpha1.TransactionInfoResponse - 5, // 149: penumbra.view.v1alpha1.ViewProtocolService.TransactionPlanner:output_type -> penumbra.view.v1alpha1.TransactionPlannerResponse - 3, // 150: penumbra.view.v1alpha1.ViewProtocolService.BroadcastTransaction:output_type -> penumbra.view.v1alpha1.BroadcastTransactionResponse - 55, // 151: penumbra.view.v1alpha1.ViewProtocolService.OwnedPositionIds:output_type -> penumbra.view.v1alpha1.OwnedPositionIdsResponse - 1, // 152: penumbra.view.v1alpha1.ViewProtocolService.AuthorizeAndBuild:output_type -> penumbra.view.v1alpha1.AuthorizeAndBuildResponse - 18, // 153: penumbra.view.v1alpha1.ViewAuthService.ViewAuth:output_type -> penumbra.view.v1alpha1.ViewAuthResponse - 128, // [128:154] is the sub-list for method output_type - 102, // [102:128] is the sub-list for method input_type - 102, // [102:102] is the sub-list for extension type_name - 102, // [102:102] is the sub-list for extension extendee - 0, // [0:102] is the sub-list for field type_name + 61, // 0: penumbra.view.v1alpha1.AuthorizeAndBuildRequest.transaction_plan:type_name -> penumbra.core.transaction.v1alpha1.TransactionPlan + 62, // 1: penumbra.view.v1alpha1.AuthorizeAndBuildRequest.authorization_data:type_name -> penumbra.core.transaction.v1alpha1.AuthorizationData + 63, // 2: penumbra.view.v1alpha1.AuthorizeAndBuildResponse.transaction:type_name -> penumbra.core.transaction.v1alpha1.Transaction + 63, // 3: penumbra.view.v1alpha1.BroadcastTransactionRequest.transaction:type_name -> penumbra.core.transaction.v1alpha1.Transaction + 64, // 4: penumbra.view.v1alpha1.BroadcastTransactionResponse.id:type_name -> penumbra.core.txhash.v1alpha1.TransactionId + 65, // 5: penumbra.view.v1alpha1.TransactionPlannerRequest.fee:type_name -> penumbra.core.component.fee.v1alpha1.Fee + 66, // 6: penumbra.view.v1alpha1.TransactionPlannerRequest.memo:type_name -> penumbra.core.transaction.v1alpha1.MemoPlaintext + 67, // 7: penumbra.view.v1alpha1.TransactionPlannerRequest.source:type_name -> penumbra.core.keys.v1alpha1.AddressIndex + 53, // 8: penumbra.view.v1alpha1.TransactionPlannerRequest.outputs:type_name -> penumbra.view.v1alpha1.TransactionPlannerRequest.Output + 54, // 9: penumbra.view.v1alpha1.TransactionPlannerRequest.swaps:type_name -> penumbra.view.v1alpha1.TransactionPlannerRequest.Swap + 55, // 10: penumbra.view.v1alpha1.TransactionPlannerRequest.swap_claims:type_name -> penumbra.view.v1alpha1.TransactionPlannerRequest.SwapClaim + 56, // 11: penumbra.view.v1alpha1.TransactionPlannerRequest.delegations:type_name -> penumbra.view.v1alpha1.TransactionPlannerRequest.Delegate + 57, // 12: penumbra.view.v1alpha1.TransactionPlannerRequest.undelegations:type_name -> penumbra.view.v1alpha1.TransactionPlannerRequest.Undelegate + 68, // 13: penumbra.view.v1alpha1.TransactionPlannerRequest.ibc_relay_actions:type_name -> penumbra.core.component.ibc.v1alpha1.IbcRelay + 69, // 14: penumbra.view.v1alpha1.TransactionPlannerRequest.ics20_withdrawals:type_name -> penumbra.core.component.ibc.v1alpha1.Ics20Withdrawal + 58, // 15: penumbra.view.v1alpha1.TransactionPlannerRequest.position_opens:type_name -> penumbra.view.v1alpha1.TransactionPlannerRequest.PositionOpen + 59, // 16: penumbra.view.v1alpha1.TransactionPlannerRequest.position_closes:type_name -> penumbra.view.v1alpha1.TransactionPlannerRequest.PositionClose + 60, // 17: penumbra.view.v1alpha1.TransactionPlannerRequest.position_withdraws:type_name -> penumbra.view.v1alpha1.TransactionPlannerRequest.PositionWithdraw + 61, // 18: penumbra.view.v1alpha1.TransactionPlannerResponse.plan:type_name -> penumbra.core.transaction.v1alpha1.TransactionPlan + 67, // 19: penumbra.view.v1alpha1.AddressByIndexRequest.address_index:type_name -> penumbra.core.keys.v1alpha1.AddressIndex + 70, // 20: penumbra.view.v1alpha1.AddressByIndexResponse.address:type_name -> penumbra.core.keys.v1alpha1.Address + 71, // 21: penumbra.view.v1alpha1.WalletIdResponse.wallet_id:type_name -> penumbra.core.keys.v1alpha1.WalletId + 70, // 22: penumbra.view.v1alpha1.IndexByAddressRequest.address:type_name -> penumbra.core.keys.v1alpha1.Address + 67, // 23: penumbra.view.v1alpha1.IndexByAddressResponse.address_index:type_name -> penumbra.core.keys.v1alpha1.AddressIndex + 67, // 24: penumbra.view.v1alpha1.EphemeralAddressRequest.address_index:type_name -> penumbra.core.keys.v1alpha1.AddressIndex + 70, // 25: penumbra.view.v1alpha1.EphemeralAddressResponse.address:type_name -> penumbra.core.keys.v1alpha1.Address + 67, // 26: penumbra.view.v1alpha1.BalancesRequest.account_filter:type_name -> penumbra.core.keys.v1alpha1.AddressIndex + 72, // 27: penumbra.view.v1alpha1.BalancesRequest.asset_id_filter:type_name -> penumbra.core.asset.v1alpha1.AssetId + 67, // 28: penumbra.view.v1alpha1.BalancesResponse.account:type_name -> penumbra.core.keys.v1alpha1.AddressIndex + 73, // 29: penumbra.view.v1alpha1.BalancesResponse.balance:type_name -> penumbra.core.asset.v1alpha1.Value + 72, // 30: penumbra.view.v1alpha1.NotesRequest.asset_id:type_name -> penumbra.core.asset.v1alpha1.AssetId + 67, // 31: penumbra.view.v1alpha1.NotesRequest.address_index:type_name -> penumbra.core.keys.v1alpha1.AddressIndex + 74, // 32: penumbra.view.v1alpha1.NotesRequest.amount_to_spend:type_name -> penumbra.core.num.v1alpha1.Amount + 67, // 33: penumbra.view.v1alpha1.NotesForVotingRequest.address_index:type_name -> penumbra.core.keys.v1alpha1.AddressIndex + 75, // 34: penumbra.view.v1alpha1.WitnessRequest.note_commitments:type_name -> penumbra.crypto.tct.v1alpha1.StateCommitment + 61, // 35: penumbra.view.v1alpha1.WitnessRequest.transaction_plan:type_name -> penumbra.core.transaction.v1alpha1.TransactionPlan + 76, // 36: penumbra.view.v1alpha1.WitnessResponse.witness_data:type_name -> penumbra.core.transaction.v1alpha1.WitnessData + 61, // 37: penumbra.view.v1alpha1.WitnessAndBuildRequest.transaction_plan:type_name -> penumbra.core.transaction.v1alpha1.TransactionPlan + 62, // 38: penumbra.view.v1alpha1.WitnessAndBuildRequest.authorization_data:type_name -> penumbra.core.transaction.v1alpha1.AuthorizationData + 63, // 39: penumbra.view.v1alpha1.WitnessAndBuildResponse.transaction:type_name -> penumbra.core.transaction.v1alpha1.Transaction + 77, // 40: penumbra.view.v1alpha1.AssetsRequest.include_specific_denominations:type_name -> penumbra.core.asset.v1alpha1.Denom + 78, // 41: penumbra.view.v1alpha1.AssetsResponse.denom_metadata:type_name -> penumbra.core.asset.v1alpha1.DenomMetadata + 79, // 42: penumbra.view.v1alpha1.AppParametersResponse.parameters:type_name -> penumbra.core.app.v1alpha1.AppParameters + 80, // 43: penumbra.view.v1alpha1.GasPricesResponse.gas_prices:type_name -> penumbra.core.component.fee.v1alpha1.GasPrices + 81, // 44: penumbra.view.v1alpha1.FMDParametersResponse.parameters:type_name -> penumbra.core.component.chain.v1alpha1.FmdParameters + 75, // 45: penumbra.view.v1alpha1.NoteByCommitmentRequest.note_commitment:type_name -> penumbra.crypto.tct.v1alpha1.StateCommitment + 49, // 46: penumbra.view.v1alpha1.NoteByCommitmentResponse.spendable_note:type_name -> penumbra.view.v1alpha1.SpendableNoteRecord + 75, // 47: penumbra.view.v1alpha1.SwapByCommitmentRequest.swap_commitment:type_name -> penumbra.crypto.tct.v1alpha1.StateCommitment + 50, // 48: penumbra.view.v1alpha1.SwapByCommitmentResponse.swap:type_name -> penumbra.view.v1alpha1.SwapRecord + 50, // 49: penumbra.view.v1alpha1.UnclaimedSwapsResponse.swap:type_name -> penumbra.view.v1alpha1.SwapRecord + 82, // 50: penumbra.view.v1alpha1.NullifierStatusRequest.nullifier:type_name -> penumbra.core.component.sct.v1alpha1.Nullifier + 64, // 51: penumbra.view.v1alpha1.TransactionInfoByHashRequest.id:type_name -> penumbra.core.txhash.v1alpha1.TransactionId + 64, // 52: penumbra.view.v1alpha1.TransactionInfo.id:type_name -> penumbra.core.txhash.v1alpha1.TransactionId + 63, // 53: penumbra.view.v1alpha1.TransactionInfo.transaction:type_name -> penumbra.core.transaction.v1alpha1.Transaction + 83, // 54: penumbra.view.v1alpha1.TransactionInfo.perspective:type_name -> penumbra.core.transaction.v1alpha1.TransactionPerspective + 84, // 55: penumbra.view.v1alpha1.TransactionInfo.view:type_name -> penumbra.core.transaction.v1alpha1.TransactionView + 44, // 56: penumbra.view.v1alpha1.TransactionInfoResponse.tx_info:type_name -> penumbra.view.v1alpha1.TransactionInfo + 44, // 57: penumbra.view.v1alpha1.TransactionInfoByHashResponse.tx_info:type_name -> penumbra.view.v1alpha1.TransactionInfo + 49, // 58: penumbra.view.v1alpha1.NotesResponse.note_record:type_name -> penumbra.view.v1alpha1.SpendableNoteRecord + 49, // 59: penumbra.view.v1alpha1.NotesForVotingResponse.note_record:type_name -> penumbra.view.v1alpha1.SpendableNoteRecord + 85, // 60: penumbra.view.v1alpha1.NotesForVotingResponse.identity_key:type_name -> penumbra.core.keys.v1alpha1.IdentityKey + 75, // 61: penumbra.view.v1alpha1.SpendableNoteRecord.note_commitment:type_name -> penumbra.crypto.tct.v1alpha1.StateCommitment + 86, // 62: penumbra.view.v1alpha1.SpendableNoteRecord.note:type_name -> penumbra.core.component.shielded_pool.v1alpha1.Note + 67, // 63: penumbra.view.v1alpha1.SpendableNoteRecord.address_index:type_name -> penumbra.core.keys.v1alpha1.AddressIndex + 82, // 64: penumbra.view.v1alpha1.SpendableNoteRecord.nullifier:type_name -> penumbra.core.component.sct.v1alpha1.Nullifier + 87, // 65: penumbra.view.v1alpha1.SpendableNoteRecord.source:type_name -> penumbra.core.component.sct.v1alpha1.CommitmentSource + 75, // 66: penumbra.view.v1alpha1.SwapRecord.swap_commitment:type_name -> penumbra.crypto.tct.v1alpha1.StateCommitment + 88, // 67: penumbra.view.v1alpha1.SwapRecord.swap:type_name -> penumbra.core.component.dex.v1alpha1.SwapPlaintext + 82, // 68: penumbra.view.v1alpha1.SwapRecord.nullifier:type_name -> penumbra.core.component.sct.v1alpha1.Nullifier + 89, // 69: penumbra.view.v1alpha1.SwapRecord.output_data:type_name -> penumbra.core.component.dex.v1alpha1.BatchSwapOutputData + 87, // 70: penumbra.view.v1alpha1.SwapRecord.source:type_name -> penumbra.core.component.sct.v1alpha1.CommitmentSource + 90, // 71: penumbra.view.v1alpha1.OwnedPositionIdsRequest.position_state:type_name -> penumbra.core.component.dex.v1alpha1.PositionState + 91, // 72: penumbra.view.v1alpha1.OwnedPositionIdsRequest.trading_pair:type_name -> penumbra.core.component.dex.v1alpha1.TradingPair + 92, // 73: penumbra.view.v1alpha1.OwnedPositionIdsResponse.position_id:type_name -> penumbra.core.component.dex.v1alpha1.PositionId + 73, // 74: penumbra.view.v1alpha1.TransactionPlannerRequest.Output.value:type_name -> penumbra.core.asset.v1alpha1.Value + 70, // 75: penumbra.view.v1alpha1.TransactionPlannerRequest.Output.address:type_name -> penumbra.core.keys.v1alpha1.Address + 73, // 76: penumbra.view.v1alpha1.TransactionPlannerRequest.Swap.value:type_name -> penumbra.core.asset.v1alpha1.Value + 72, // 77: penumbra.view.v1alpha1.TransactionPlannerRequest.Swap.target_asset:type_name -> penumbra.core.asset.v1alpha1.AssetId + 65, // 78: penumbra.view.v1alpha1.TransactionPlannerRequest.Swap.fee:type_name -> penumbra.core.component.fee.v1alpha1.Fee + 70, // 79: penumbra.view.v1alpha1.TransactionPlannerRequest.Swap.claim_address:type_name -> penumbra.core.keys.v1alpha1.Address + 75, // 80: penumbra.view.v1alpha1.TransactionPlannerRequest.SwapClaim.swap_commitment:type_name -> penumbra.crypto.tct.v1alpha1.StateCommitment + 74, // 81: penumbra.view.v1alpha1.TransactionPlannerRequest.Delegate.amount:type_name -> penumbra.core.num.v1alpha1.Amount + 93, // 82: penumbra.view.v1alpha1.TransactionPlannerRequest.Delegate.rate_data:type_name -> penumbra.core.component.stake.v1alpha1.RateData + 73, // 83: penumbra.view.v1alpha1.TransactionPlannerRequest.Undelegate.value:type_name -> penumbra.core.asset.v1alpha1.Value + 93, // 84: penumbra.view.v1alpha1.TransactionPlannerRequest.Undelegate.rate_data:type_name -> penumbra.core.component.stake.v1alpha1.RateData + 94, // 85: penumbra.view.v1alpha1.TransactionPlannerRequest.PositionOpen.position:type_name -> penumbra.core.component.dex.v1alpha1.Position + 92, // 86: penumbra.view.v1alpha1.TransactionPlannerRequest.PositionClose.position_id:type_name -> penumbra.core.component.dex.v1alpha1.PositionId + 92, // 87: penumbra.view.v1alpha1.TransactionPlannerRequest.PositionWithdraw.position_id:type_name -> penumbra.core.component.dex.v1alpha1.PositionId + 95, // 88: penumbra.view.v1alpha1.TransactionPlannerRequest.PositionWithdraw.reserves:type_name -> penumbra.core.component.dex.v1alpha1.Reserves + 91, // 89: penumbra.view.v1alpha1.TransactionPlannerRequest.PositionWithdraw.trading_pair:type_name -> penumbra.core.component.dex.v1alpha1.TradingPair + 16, // 90: penumbra.view.v1alpha1.ViewProtocolService.Status:input_type -> penumbra.view.v1alpha1.StatusRequest + 18, // 91: penumbra.view.v1alpha1.ViewProtocolService.StatusStream:input_type -> penumbra.view.v1alpha1.StatusStreamRequest + 20, // 92: penumbra.view.v1alpha1.ViewProtocolService.Notes:input_type -> penumbra.view.v1alpha1.NotesRequest + 21, // 93: penumbra.view.v1alpha1.ViewProtocolService.NotesForVoting:input_type -> penumbra.view.v1alpha1.NotesForVotingRequest + 22, // 94: penumbra.view.v1alpha1.ViewProtocolService.Witness:input_type -> penumbra.view.v1alpha1.WitnessRequest + 24, // 95: penumbra.view.v1alpha1.ViewProtocolService.WitnessAndBuild:input_type -> penumbra.view.v1alpha1.WitnessAndBuildRequest + 26, // 96: penumbra.view.v1alpha1.ViewProtocolService.Assets:input_type -> penumbra.view.v1alpha1.AssetsRequest + 28, // 97: penumbra.view.v1alpha1.ViewProtocolService.AppParameters:input_type -> penumbra.view.v1alpha1.AppParametersRequest + 30, // 98: penumbra.view.v1alpha1.ViewProtocolService.GasPrices:input_type -> penumbra.view.v1alpha1.GasPricesRequest + 32, // 99: penumbra.view.v1alpha1.ViewProtocolService.FMDParameters:input_type -> penumbra.view.v1alpha1.FMDParametersRequest + 6, // 100: penumbra.view.v1alpha1.ViewProtocolService.AddressByIndex:input_type -> penumbra.view.v1alpha1.AddressByIndexRequest + 8, // 101: penumbra.view.v1alpha1.ViewProtocolService.WalletId:input_type -> penumbra.view.v1alpha1.WalletIdRequest + 10, // 102: penumbra.view.v1alpha1.ViewProtocolService.IndexByAddress:input_type -> penumbra.view.v1alpha1.IndexByAddressRequest + 12, // 103: penumbra.view.v1alpha1.ViewProtocolService.EphemeralAddress:input_type -> penumbra.view.v1alpha1.EphemeralAddressRequest + 14, // 104: penumbra.view.v1alpha1.ViewProtocolService.Balances:input_type -> penumbra.view.v1alpha1.BalancesRequest + 34, // 105: penumbra.view.v1alpha1.ViewProtocolService.NoteByCommitment:input_type -> penumbra.view.v1alpha1.NoteByCommitmentRequest + 36, // 106: penumbra.view.v1alpha1.ViewProtocolService.SwapByCommitment:input_type -> penumbra.view.v1alpha1.SwapByCommitmentRequest + 38, // 107: penumbra.view.v1alpha1.ViewProtocolService.UnclaimedSwaps:input_type -> penumbra.view.v1alpha1.UnclaimedSwapsRequest + 40, // 108: penumbra.view.v1alpha1.ViewProtocolService.NullifierStatus:input_type -> penumbra.view.v1alpha1.NullifierStatusRequest + 42, // 109: penumbra.view.v1alpha1.ViewProtocolService.TransactionInfoByHash:input_type -> penumbra.view.v1alpha1.TransactionInfoByHashRequest + 43, // 110: penumbra.view.v1alpha1.ViewProtocolService.TransactionInfo:input_type -> penumbra.view.v1alpha1.TransactionInfoRequest + 4, // 111: penumbra.view.v1alpha1.ViewProtocolService.TransactionPlanner:input_type -> penumbra.view.v1alpha1.TransactionPlannerRequest + 2, // 112: penumbra.view.v1alpha1.ViewProtocolService.BroadcastTransaction:input_type -> penumbra.view.v1alpha1.BroadcastTransactionRequest + 51, // 113: penumbra.view.v1alpha1.ViewProtocolService.OwnedPositionIds:input_type -> penumbra.view.v1alpha1.OwnedPositionIdsRequest + 0, // 114: penumbra.view.v1alpha1.ViewProtocolService.AuthorizeAndBuild:input_type -> penumbra.view.v1alpha1.AuthorizeAndBuildRequest + 17, // 115: penumbra.view.v1alpha1.ViewProtocolService.Status:output_type -> penumbra.view.v1alpha1.StatusResponse + 19, // 116: penumbra.view.v1alpha1.ViewProtocolService.StatusStream:output_type -> penumbra.view.v1alpha1.StatusStreamResponse + 47, // 117: penumbra.view.v1alpha1.ViewProtocolService.Notes:output_type -> penumbra.view.v1alpha1.NotesResponse + 48, // 118: penumbra.view.v1alpha1.ViewProtocolService.NotesForVoting:output_type -> penumbra.view.v1alpha1.NotesForVotingResponse + 23, // 119: penumbra.view.v1alpha1.ViewProtocolService.Witness:output_type -> penumbra.view.v1alpha1.WitnessResponse + 25, // 120: penumbra.view.v1alpha1.ViewProtocolService.WitnessAndBuild:output_type -> penumbra.view.v1alpha1.WitnessAndBuildResponse + 27, // 121: penumbra.view.v1alpha1.ViewProtocolService.Assets:output_type -> penumbra.view.v1alpha1.AssetsResponse + 29, // 122: penumbra.view.v1alpha1.ViewProtocolService.AppParameters:output_type -> penumbra.view.v1alpha1.AppParametersResponse + 31, // 123: penumbra.view.v1alpha1.ViewProtocolService.GasPrices:output_type -> penumbra.view.v1alpha1.GasPricesResponse + 33, // 124: penumbra.view.v1alpha1.ViewProtocolService.FMDParameters:output_type -> penumbra.view.v1alpha1.FMDParametersResponse + 7, // 125: penumbra.view.v1alpha1.ViewProtocolService.AddressByIndex:output_type -> penumbra.view.v1alpha1.AddressByIndexResponse + 9, // 126: penumbra.view.v1alpha1.ViewProtocolService.WalletId:output_type -> penumbra.view.v1alpha1.WalletIdResponse + 11, // 127: penumbra.view.v1alpha1.ViewProtocolService.IndexByAddress:output_type -> penumbra.view.v1alpha1.IndexByAddressResponse + 13, // 128: penumbra.view.v1alpha1.ViewProtocolService.EphemeralAddress:output_type -> penumbra.view.v1alpha1.EphemeralAddressResponse + 15, // 129: penumbra.view.v1alpha1.ViewProtocolService.Balances:output_type -> penumbra.view.v1alpha1.BalancesResponse + 35, // 130: penumbra.view.v1alpha1.ViewProtocolService.NoteByCommitment:output_type -> penumbra.view.v1alpha1.NoteByCommitmentResponse + 37, // 131: penumbra.view.v1alpha1.ViewProtocolService.SwapByCommitment:output_type -> penumbra.view.v1alpha1.SwapByCommitmentResponse + 39, // 132: penumbra.view.v1alpha1.ViewProtocolService.UnclaimedSwaps:output_type -> penumbra.view.v1alpha1.UnclaimedSwapsResponse + 41, // 133: penumbra.view.v1alpha1.ViewProtocolService.NullifierStatus:output_type -> penumbra.view.v1alpha1.NullifierStatusResponse + 46, // 134: penumbra.view.v1alpha1.ViewProtocolService.TransactionInfoByHash:output_type -> penumbra.view.v1alpha1.TransactionInfoByHashResponse + 45, // 135: penumbra.view.v1alpha1.ViewProtocolService.TransactionInfo:output_type -> penumbra.view.v1alpha1.TransactionInfoResponse + 5, // 136: penumbra.view.v1alpha1.ViewProtocolService.TransactionPlanner:output_type -> penumbra.view.v1alpha1.TransactionPlannerResponse + 3, // 137: penumbra.view.v1alpha1.ViewProtocolService.BroadcastTransaction:output_type -> penumbra.view.v1alpha1.BroadcastTransactionResponse + 52, // 138: penumbra.view.v1alpha1.ViewProtocolService.OwnedPositionIds:output_type -> penumbra.view.v1alpha1.OwnedPositionIdsResponse + 1, // 139: penumbra.view.v1alpha1.ViewProtocolService.AuthorizeAndBuild:output_type -> penumbra.view.v1alpha1.AuthorizeAndBuildResponse + 115, // [115:140] is the sub-list for method output_type + 90, // [90:115] is the sub-list for method input_type + 90, // [90:90] is the sub-list for extension type_name + 90, // [90:90] is the sub-list for extension extendee + 0, // [0:90] is the sub-list for field type_name } func init() { file_penumbra_view_v1alpha1_view_proto_init() } @@ -5083,42 +4773,6 @@ func file_penumbra_view_v1alpha1_view_proto_init() { } } file_penumbra_view_v1alpha1_view_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ViewAuthToken); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_penumbra_view_v1alpha1_view_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ViewAuthRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_penumbra_view_v1alpha1_view_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ViewAuthResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_penumbra_view_v1alpha1_view_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*StatusRequest); i { case 0: return &v.state @@ -5130,7 +4784,7 @@ func file_penumbra_view_v1alpha1_view_proto_init() { return nil } } - file_penumbra_view_v1alpha1_view_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { + file_penumbra_view_v1alpha1_view_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*StatusResponse); i { case 0: return &v.state @@ -5142,7 +4796,7 @@ func file_penumbra_view_v1alpha1_view_proto_init() { return nil } } - file_penumbra_view_v1alpha1_view_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { + file_penumbra_view_v1alpha1_view_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*StatusStreamRequest); i { case 0: return &v.state @@ -5154,7 +4808,7 @@ func file_penumbra_view_v1alpha1_view_proto_init() { return nil } } - file_penumbra_view_v1alpha1_view_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { + file_penumbra_view_v1alpha1_view_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*StatusStreamResponse); i { case 0: return &v.state @@ -5166,7 +4820,7 @@ func file_penumbra_view_v1alpha1_view_proto_init() { return nil } } - file_penumbra_view_v1alpha1_view_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { + file_penumbra_view_v1alpha1_view_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*NotesRequest); i { case 0: return &v.state @@ -5178,7 +4832,7 @@ func file_penumbra_view_v1alpha1_view_proto_init() { return nil } } - file_penumbra_view_v1alpha1_view_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { + file_penumbra_view_v1alpha1_view_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*NotesForVotingRequest); i { case 0: return &v.state @@ -5190,7 +4844,7 @@ func file_penumbra_view_v1alpha1_view_proto_init() { return nil } } - file_penumbra_view_v1alpha1_view_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { + file_penumbra_view_v1alpha1_view_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*WitnessRequest); i { case 0: return &v.state @@ -5202,7 +4856,7 @@ func file_penumbra_view_v1alpha1_view_proto_init() { return nil } } - file_penumbra_view_v1alpha1_view_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { + file_penumbra_view_v1alpha1_view_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*WitnessResponse); i { case 0: return &v.state @@ -5214,7 +4868,7 @@ func file_penumbra_view_v1alpha1_view_proto_init() { return nil } } - file_penumbra_view_v1alpha1_view_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { + file_penumbra_view_v1alpha1_view_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*WitnessAndBuildRequest); i { case 0: return &v.state @@ -5226,7 +4880,7 @@ func file_penumbra_view_v1alpha1_view_proto_init() { return nil } } - file_penumbra_view_v1alpha1_view_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { + file_penumbra_view_v1alpha1_view_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*WitnessAndBuildResponse); i { case 0: return &v.state @@ -5238,7 +4892,7 @@ func file_penumbra_view_v1alpha1_view_proto_init() { return nil } } - file_penumbra_view_v1alpha1_view_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} { + file_penumbra_view_v1alpha1_view_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*AssetsRequest); i { case 0: return &v.state @@ -5250,7 +4904,7 @@ func file_penumbra_view_v1alpha1_view_proto_init() { return nil } } - file_penumbra_view_v1alpha1_view_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} { + file_penumbra_view_v1alpha1_view_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*AssetsResponse); i { case 0: return &v.state @@ -5262,7 +4916,7 @@ func file_penumbra_view_v1alpha1_view_proto_init() { return nil } } - file_penumbra_view_v1alpha1_view_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { + file_penumbra_view_v1alpha1_view_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*AppParametersRequest); i { case 0: return &v.state @@ -5274,7 +4928,7 @@ func file_penumbra_view_v1alpha1_view_proto_init() { return nil } } - file_penumbra_view_v1alpha1_view_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} { + file_penumbra_view_v1alpha1_view_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*AppParametersResponse); i { case 0: return &v.state @@ -5286,7 +4940,7 @@ func file_penumbra_view_v1alpha1_view_proto_init() { return nil } } - file_penumbra_view_v1alpha1_view_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} { + file_penumbra_view_v1alpha1_view_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GasPricesRequest); i { case 0: return &v.state @@ -5298,7 +4952,7 @@ func file_penumbra_view_v1alpha1_view_proto_init() { return nil } } - file_penumbra_view_v1alpha1_view_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} { + file_penumbra_view_v1alpha1_view_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GasPricesResponse); i { case 0: return &v.state @@ -5310,7 +4964,7 @@ func file_penumbra_view_v1alpha1_view_proto_init() { return nil } } - file_penumbra_view_v1alpha1_view_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} { + file_penumbra_view_v1alpha1_view_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*FMDParametersRequest); i { case 0: return &v.state @@ -5322,7 +4976,7 @@ func file_penumbra_view_v1alpha1_view_proto_init() { return nil } } - file_penumbra_view_v1alpha1_view_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} { + file_penumbra_view_v1alpha1_view_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*FMDParametersResponse); i { case 0: return &v.state @@ -5334,7 +4988,7 @@ func file_penumbra_view_v1alpha1_view_proto_init() { return nil } } - file_penumbra_view_v1alpha1_view_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} { + file_penumbra_view_v1alpha1_view_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*NoteByCommitmentRequest); i { case 0: return &v.state @@ -5346,7 +5000,7 @@ func file_penumbra_view_v1alpha1_view_proto_init() { return nil } } - file_penumbra_view_v1alpha1_view_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} { + file_penumbra_view_v1alpha1_view_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*NoteByCommitmentResponse); i { case 0: return &v.state @@ -5358,7 +5012,7 @@ func file_penumbra_view_v1alpha1_view_proto_init() { return nil } } - file_penumbra_view_v1alpha1_view_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} { + file_penumbra_view_v1alpha1_view_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SwapByCommitmentRequest); i { case 0: return &v.state @@ -5370,7 +5024,7 @@ func file_penumbra_view_v1alpha1_view_proto_init() { return nil } } - file_penumbra_view_v1alpha1_view_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} { + file_penumbra_view_v1alpha1_view_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SwapByCommitmentResponse); i { case 0: return &v.state @@ -5382,7 +5036,7 @@ func file_penumbra_view_v1alpha1_view_proto_init() { return nil } } - file_penumbra_view_v1alpha1_view_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} { + file_penumbra_view_v1alpha1_view_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*UnclaimedSwapsRequest); i { case 0: return &v.state @@ -5394,7 +5048,7 @@ func file_penumbra_view_v1alpha1_view_proto_init() { return nil } } - file_penumbra_view_v1alpha1_view_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} { + file_penumbra_view_v1alpha1_view_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*UnclaimedSwapsResponse); i { case 0: return &v.state @@ -5406,7 +5060,7 @@ func file_penumbra_view_v1alpha1_view_proto_init() { return nil } } - file_penumbra_view_v1alpha1_view_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} { + file_penumbra_view_v1alpha1_view_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*NullifierStatusRequest); i { case 0: return &v.state @@ -5418,7 +5072,7 @@ func file_penumbra_view_v1alpha1_view_proto_init() { return nil } } - file_penumbra_view_v1alpha1_view_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} { + file_penumbra_view_v1alpha1_view_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*NullifierStatusResponse); i { case 0: return &v.state @@ -5430,7 +5084,7 @@ func file_penumbra_view_v1alpha1_view_proto_init() { return nil } } - file_penumbra_view_v1alpha1_view_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} { + file_penumbra_view_v1alpha1_view_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*TransactionInfoByHashRequest); i { case 0: return &v.state @@ -5442,7 +5096,7 @@ func file_penumbra_view_v1alpha1_view_proto_init() { return nil } } - file_penumbra_view_v1alpha1_view_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} { + file_penumbra_view_v1alpha1_view_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*TransactionInfoRequest); i { case 0: return &v.state @@ -5454,7 +5108,7 @@ func file_penumbra_view_v1alpha1_view_proto_init() { return nil } } - file_penumbra_view_v1alpha1_view_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} { + file_penumbra_view_v1alpha1_view_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*TransactionInfo); i { case 0: return &v.state @@ -5466,7 +5120,7 @@ func file_penumbra_view_v1alpha1_view_proto_init() { return nil } } - file_penumbra_view_v1alpha1_view_proto_msgTypes[48].Exporter = func(v interface{}, i int) interface{} { + file_penumbra_view_v1alpha1_view_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*TransactionInfoResponse); i { case 0: return &v.state @@ -5478,7 +5132,7 @@ func file_penumbra_view_v1alpha1_view_proto_init() { return nil } } - file_penumbra_view_v1alpha1_view_proto_msgTypes[49].Exporter = func(v interface{}, i int) interface{} { + file_penumbra_view_v1alpha1_view_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*TransactionInfoByHashResponse); i { case 0: return &v.state @@ -5490,7 +5144,7 @@ func file_penumbra_view_v1alpha1_view_proto_init() { return nil } } - file_penumbra_view_v1alpha1_view_proto_msgTypes[50].Exporter = func(v interface{}, i int) interface{} { + file_penumbra_view_v1alpha1_view_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*NotesResponse); i { case 0: return &v.state @@ -5502,7 +5156,7 @@ func file_penumbra_view_v1alpha1_view_proto_init() { return nil } } - file_penumbra_view_v1alpha1_view_proto_msgTypes[51].Exporter = func(v interface{}, i int) interface{} { + file_penumbra_view_v1alpha1_view_proto_msgTypes[48].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*NotesForVotingResponse); i { case 0: return &v.state @@ -5514,7 +5168,7 @@ func file_penumbra_view_v1alpha1_view_proto_init() { return nil } } - file_penumbra_view_v1alpha1_view_proto_msgTypes[52].Exporter = func(v interface{}, i int) interface{} { + file_penumbra_view_v1alpha1_view_proto_msgTypes[49].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SpendableNoteRecord); i { case 0: return &v.state @@ -5526,7 +5180,7 @@ func file_penumbra_view_v1alpha1_view_proto_init() { return nil } } - file_penumbra_view_v1alpha1_view_proto_msgTypes[53].Exporter = func(v interface{}, i int) interface{} { + file_penumbra_view_v1alpha1_view_proto_msgTypes[50].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SwapRecord); i { case 0: return &v.state @@ -5538,7 +5192,7 @@ func file_penumbra_view_v1alpha1_view_proto_init() { return nil } } - file_penumbra_view_v1alpha1_view_proto_msgTypes[54].Exporter = func(v interface{}, i int) interface{} { + file_penumbra_view_v1alpha1_view_proto_msgTypes[51].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*OwnedPositionIdsRequest); i { case 0: return &v.state @@ -5550,7 +5204,7 @@ func file_penumbra_view_v1alpha1_view_proto_init() { return nil } } - file_penumbra_view_v1alpha1_view_proto_msgTypes[55].Exporter = func(v interface{}, i int) interface{} { + file_penumbra_view_v1alpha1_view_proto_msgTypes[52].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*OwnedPositionIdsResponse); i { case 0: return &v.state @@ -5562,7 +5216,7 @@ func file_penumbra_view_v1alpha1_view_proto_init() { return nil } } - file_penumbra_view_v1alpha1_view_proto_msgTypes[56].Exporter = func(v interface{}, i int) interface{} { + file_penumbra_view_v1alpha1_view_proto_msgTypes[53].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*TransactionPlannerRequest_Output); i { case 0: return &v.state @@ -5574,7 +5228,7 @@ func file_penumbra_view_v1alpha1_view_proto_init() { return nil } } - file_penumbra_view_v1alpha1_view_proto_msgTypes[57].Exporter = func(v interface{}, i int) interface{} { + file_penumbra_view_v1alpha1_view_proto_msgTypes[54].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*TransactionPlannerRequest_Swap); i { case 0: return &v.state @@ -5586,7 +5240,7 @@ func file_penumbra_view_v1alpha1_view_proto_init() { return nil } } - file_penumbra_view_v1alpha1_view_proto_msgTypes[58].Exporter = func(v interface{}, i int) interface{} { + file_penumbra_view_v1alpha1_view_proto_msgTypes[55].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*TransactionPlannerRequest_SwapClaim); i { case 0: return &v.state @@ -5598,7 +5252,7 @@ func file_penumbra_view_v1alpha1_view_proto_init() { return nil } } - file_penumbra_view_v1alpha1_view_proto_msgTypes[59].Exporter = func(v interface{}, i int) interface{} { + file_penumbra_view_v1alpha1_view_proto_msgTypes[56].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*TransactionPlannerRequest_Delegate); i { case 0: return &v.state @@ -5610,7 +5264,7 @@ func file_penumbra_view_v1alpha1_view_proto_init() { return nil } } - file_penumbra_view_v1alpha1_view_proto_msgTypes[60].Exporter = func(v interface{}, i int) interface{} { + file_penumbra_view_v1alpha1_view_proto_msgTypes[57].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*TransactionPlannerRequest_Undelegate); i { case 0: return &v.state @@ -5622,7 +5276,7 @@ func file_penumbra_view_v1alpha1_view_proto_init() { return nil } } - file_penumbra_view_v1alpha1_view_proto_msgTypes[61].Exporter = func(v interface{}, i int) interface{} { + file_penumbra_view_v1alpha1_view_proto_msgTypes[58].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*TransactionPlannerRequest_PositionOpen); i { case 0: return &v.state @@ -5634,7 +5288,7 @@ func file_penumbra_view_v1alpha1_view_proto_init() { return nil } } - file_penumbra_view_v1alpha1_view_proto_msgTypes[62].Exporter = func(v interface{}, i int) interface{} { + file_penumbra_view_v1alpha1_view_proto_msgTypes[59].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*TransactionPlannerRequest_PositionClose); i { case 0: return &v.state @@ -5646,7 +5300,7 @@ func file_penumbra_view_v1alpha1_view_proto_init() { return nil } } - file_penumbra_view_v1alpha1_view_proto_msgTypes[63].Exporter = func(v interface{}, i int) interface{} { + file_penumbra_view_v1alpha1_view_proto_msgTypes[60].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*TransactionPlannerRequest_PositionWithdraw); i { case 0: return &v.state @@ -5665,9 +5319,9 @@ func file_penumbra_view_v1alpha1_view_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_penumbra_view_v1alpha1_view_proto_rawDesc, NumEnums: 0, - NumMessages: 64, + NumMessages: 61, NumExtensions: 0, - NumServices: 2, + NumServices: 1, }, GoTypes: file_penumbra_view_v1alpha1_view_proto_goTypes, DependencyIndexes: file_penumbra_view_v1alpha1_view_proto_depIdxs, diff --git a/proto/penumbra/penumbra/cnidarium/v1alpha1/cnidarium.proto b/proto/penumbra/penumbra/cnidarium/v1alpha1/cnidarium.proto index 0d6584598b..4964fd52e6 100644 --- a/proto/penumbra/penumbra/cnidarium/v1alpha1/cnidarium.proto +++ b/proto/penumbra/penumbra/cnidarium/v1alpha1/cnidarium.proto @@ -11,8 +11,10 @@ service QueryService { // General-purpose prefixed key-value state query API, that can be used to query // arbitrary prefixes in the JMT storage. - // Returns a stream of `PrefixValueResponse`s. rpc PrefixValue(PrefixValueRequest) returns (stream PrefixValueResponse); + + // Subscribes to a stream of key-value updates, with regex filtering on keys. + rpc Watch(WatchRequest) returns (stream WatchResponse); } // Performs a key-value query, either by key or by key hash. @@ -49,3 +51,48 @@ message PrefixValueResponse { string key = 1; bytes value = 2; } + +// Requests a stream of new key-value pairs that have been committed to the state. +message WatchRequest { + // A regex for keys in the verifiable storage. + // + // Only key-value updates whose keys match this regex will be returned. + // Note that the empty string matches all keys. + // To exclude all keys, use the regex "$^", which matches no strings. + string key_regex = 1; + // A regex for keys in the nonverifiable storage. + // + // Only key-value updates whose keys match this regex will be returned. + // Note that the empty string matches all keys. + // To exclude all keys, use the regex "$^", which matches no strings. + string nv_key_regex = 2; +} + +// A key-value pair that has been committed to the state. +message WatchResponse { + // Elements of the verifiable storage have string keys. + message KeyValue { + string key = 1; + bytes value = 2; + // If set to true, the key-value pair was deleted. + // This allows distinguishing a deleted key-value pair from a key-value pair whose value is empty. + bool deleted = 3; + } + // Elements of the nonverifiable storage have byte keys. + message NvKeyValue { + bytes key = 1; + bytes value = 2; + // If set to true, the key-value pair was deleted. + // This allows distinguishing a deleted key-value pair from a key-value pair whose value is empty. + bool deleted = 3; + } + + // The state version the key-value pair was committed at. + uint64 version = 1; + + // The entry that was committed. + oneof entry { + KeyValue kv = 5; + NvKeyValue nv_kv = 6; + } +} diff --git a/proto/penumbra/penumbra/core/app/v1alpha1/app.proto b/proto/penumbra/penumbra/core/app/v1alpha1/app.proto index f85c3ff19f..dc58eee45a 100644 --- a/proto/penumbra/penumbra/core/app/v1alpha1/app.proto +++ b/proto/penumbra/penumbra/core/app/v1alpha1/app.proto @@ -2,7 +2,7 @@ syntax = "proto3"; package penumbra.core.app.v1alpha1; import "penumbra/core/component/chain/v1alpha1/chain.proto"; -import "penumbra/core/component/dao/v1alpha1/dao.proto"; +import "penumbra/core/component/community_pool/v1alpha1/community_pool.proto"; import "penumbra/core/component/distributions/v1alpha1/distributions.proto"; import "penumbra/core/component/fee/v1alpha1/fee.proto"; import "penumbra/core/component/governance/v1alpha1/governance.proto"; @@ -38,8 +38,8 @@ message TransactionsByHeightResponse { message AppParameters { // Chain module parameters. core.component.chain.v1alpha1.ChainParameters chain_params = 1; - // DAO module parameters. - core.component.dao.v1alpha1.DaoParameters dao_params = 2; + // Community Pool module parameters. + core.component.community_pool.v1alpha1.CommunityPoolParameters community_pool_params = 2; // Governance module parameters. core.component.governance.v1alpha1.GovernanceParameters governance_params = 3; // IBC module parameters. @@ -80,8 +80,8 @@ message GenesisContent { core.component.ibc.v1alpha1.GenesisContent ibc_content = 4; // Chain module genesis state. core.component.chain.v1alpha1.GenesisContent chain_content = 5; - // DAO module genesis state. - core.component.dao.v1alpha1.GenesisContent dao_content = 6; + // Community Pool module genesis state. + core.component.community_pool.v1alpha1.GenesisContent community_pool_content = 6; // Fee module genesis state. core.component.fee.v1alpha1.GenesisContent fee_content = 7; // Distributions module genesis state. diff --git a/proto/penumbra/penumbra/core/component/community_pool/v1alpha1/community_pool.proto b/proto/penumbra/penumbra/core/component/community_pool/v1alpha1/community_pool.proto new file mode 100644 index 0000000000..19c39b7a8c --- /dev/null +++ b/proto/penumbra/penumbra/core/component/community_pool/v1alpha1/community_pool.proto @@ -0,0 +1,35 @@ +syntax = "proto3"; +package penumbra.core.component.community_pool.v1alpha1; + +import "penumbra/core/asset/v1alpha1/asset.proto"; + +// CommunityPool parameter data. +message CommunityPoolParameters { + // Whether Community Pool spend proposals are enabled. + bool community_pool_spend_proposals_enabled = 1; +} + +// CommunityPool genesis state. +message GenesisContent { + // CommunityPool parameters. + CommunityPoolParameters community_pool_params = 1; +} + +// Query operations for the community_pool component. +service QueryService { + rpc CommunityPoolAssetBalances(CommunityPoolAssetBalancesRequest) returns (stream CommunityPoolAssetBalancesResponse); +} + +// Requests the list of all asset balances associated with the Community Pool. +message CommunityPoolAssetBalancesRequest { + // The expected chain id (empty string if no expectation). + string chain_id = 1; + // (Optional): The specific asset balances to retrieve, if excluded all will be returned. + repeated asset.v1alpha1.AssetId asset_ids = 2; +} + +// The Community Pool's balance of a single asset. +message CommunityPoolAssetBalancesResponse { + // The balance for a single asset. + core.asset.v1alpha1.Value balance = 1; +} diff --git a/proto/penumbra/penumbra/core/component/dao/v1alpha1/dao.proto b/proto/penumbra/penumbra/core/component/dao/v1alpha1/dao.proto deleted file mode 100644 index 39f3d3d953..0000000000 --- a/proto/penumbra/penumbra/core/component/dao/v1alpha1/dao.proto +++ /dev/null @@ -1,35 +0,0 @@ -syntax = "proto3"; -package penumbra.core.component.dao.v1alpha1; - -import "penumbra/core/asset/v1alpha1/asset.proto"; - -// Dao parameter data. -message DaoParameters { - // Whether DAO spend proposals are enabled. - bool dao_spend_proposals_enabled = 1; -} - -// Dao genesis state. -message GenesisContent { - // Dao parameters. - DaoParameters dao_params = 1; -} - -// Query operations for the dao component. -service QueryService { - rpc DaoAssetBalances(DaoAssetBalancesRequest) returns (stream DaoAssetBalancesResponse); -} - -// Requests the list of all asset balances associated with the DAO. -message DaoAssetBalancesRequest { - // The expected chain id (empty string if no expectation). - string chain_id = 1; - // (Optional): The specific asset balances to retrieve, if excluded all will be returned. - repeated asset.v1alpha1.AssetId asset_ids = 2; -} - -// The DAO's balance of a single asset. -message DaoAssetBalancesResponse { - // The balance for a single asset. - core.asset.v1alpha1.Value balance = 1; -} diff --git a/proto/penumbra/penumbra/core/component/governance/v1alpha1/governance.proto b/proto/penumbra/penumbra/core/component/governance/v1alpha1/governance.proto index b4cb8c4b87..7980cc3b20 100644 --- a/proto/penumbra/penumbra/core/component/governance/v1alpha1/governance.proto +++ b/proto/penumbra/penumbra/core/component/governance/v1alpha1/governance.proto @@ -4,10 +4,11 @@ package penumbra.core.component.governance.v1alpha1; import "google/protobuf/any.proto"; import "penumbra/core/asset/v1alpha1/asset.proto"; import "penumbra/core/component/chain/v1alpha1/chain.proto"; -import "penumbra/core/component/dao/v1alpha1/dao.proto"; +import "penumbra/core/component/community_pool/v1alpha1/community_pool.proto"; import "penumbra/core/component/distributions/v1alpha1/distributions.proto"; import "penumbra/core/component/fee/v1alpha1/fee.proto"; import "penumbra/core/component/ibc/v1alpha1/ibc.proto"; +import "penumbra/core/component/sct/v1alpha1/sct.proto"; import "penumbra/core/component/shielded_pool/v1alpha1/shielded_pool.proto"; import "penumbra/core/component/stake/v1alpha1/stake.proto"; import "penumbra/core/keys/v1alpha1/keys.proto"; @@ -87,9 +88,9 @@ message DelegatorVoteBody { // The amount of the delegation note, in unbonded penumbra. num.v1alpha1.Amount unbonded_amount = 5; // The nullifier of the input note. - bytes nullifier = 6; + sct.v1alpha1.Nullifier nullifier = 6; // The randomized validating key for the spend authorization signature. - bytes rk = 7; + crypto.decaf377_rdsa.v1alpha1.SpendVerificationKey rk = 7; } message DelegatorVoteView { @@ -127,18 +128,18 @@ message DelegatorVotePlan { bytes proof_blinding_s = 9; } -message DaoDeposit { - // The value to deposit into the DAO. +message CommunityPoolDeposit { + // The value to deposit into the Community Pool. asset.v1alpha1.Value value = 1; } -message DaoSpend { - // The value to spend from the DAO. +message CommunityPoolSpend { + // The value to spend from the Community Pool. asset.v1alpha1.Value value = 1; } -message DaoOutput { - // The value to output from the DAO. +message CommunityPoolOutput { + // The value to output from the Community Pool. asset.v1alpha1.Value value = 1; // The address to send the output to. keys.v1alpha1.Address address = 2; @@ -243,8 +244,10 @@ message Proposal { Signaling signaling = 5; Emergency emergency = 6; ParameterChange parameter_change = 7; - DaoSpend dao_spend = 8; + CommunityPoolSpend community_pool_spend = 8; UpgradePlan upgrade_plan = 9; + FreezeIbcClient freeze_ibc_client = 10; + UnfreezeIbcClient unfreeze_ibc_client = 11; // A signaling proposal is meant to register a vote on-chain, but does not have an automatic // effect when passed. @@ -279,13 +282,13 @@ message Proposal { ChangedAppParameters new_parameters = 2; } - // A DAO spend proposal describes zero or more transactions to execute on behalf of the DAO, with + // A Community Pool spend proposal describes zero or more transactions to execute on behalf of the Community Pool, with // access to its funds, and zero or more scheduled transactions from previous passed proposals to // cancel. - message DaoSpend { + message CommunityPoolSpend { // The transaction plan to be executed at the time the proposal is passed. This must be a - // transaction plan which can be executed by the DAO, which means it can't require any witness - // data or authorization signatures, but it may use the `DaoSpend` action. + // transaction plan which can be executed by the Community Pool, which means it can't require any witness + // data or authorization signatures, but it may use the `CommunityPoolSpend` action. google.protobuf.Any transaction_plan = 2; } @@ -294,6 +297,16 @@ message Proposal { message UpgradePlan { uint64 height = 1; } + + // Freeze an existing IBC client. + message FreezeIbcClient { + string client_id = 1; + } + + // Unfreeze an existing IBC client. + message UnfreezeIbcClient { + string client_id = 1; + } } // Query operations for the governance component. @@ -424,8 +437,8 @@ message GenesisContent { message ChangedAppParameters { // Chain module parameters. core.component.chain.v1alpha1.ChainParameters chain_params = 1; - // DAO module parameters. - core.component.dao.v1alpha1.DaoParameters dao_params = 2; + // Community Pool module parameters. + core.component.community_pool.v1alpha1.CommunityPoolParameters community_pool_params = 2; // Governance module parameters. core.component.governance.v1alpha1.GovernanceParameters governance_params = 3; // IBC module parameters. diff --git a/proto/penumbra/penumbra/core/component/sct/v1alpha1/sct.proto b/proto/penumbra/penumbra/core/component/sct/v1alpha1/sct.proto index 32f5ed9202..fd5fa67450 100644 --- a/proto/penumbra/penumbra/core/component/sct/v1alpha1/sct.proto +++ b/proto/penumbra/penumbra/core/component/sct/v1alpha1/sct.proto @@ -9,7 +9,7 @@ import "penumbra/crypto/tct/v1alpha1/tct.proto"; // decide whether or not to download block data. message CommitmentSource { // The state commitment was included in the genesis state. - message Genesis { } + message Genesis {} // The commitment was created by a transaction. // // When included in a `CompactBlock` via a `StatePayload`, the transaction source is "dehydrated" @@ -27,8 +27,8 @@ message CommitmentSource { // The epoch index the rewards were issued in. uint64 epoch_index = 1; } - // The commitment was created through a `DaoOutput` in a governance-initated transaction. - message DaoOutput { } + // The commitment was created through a `CommunityPoolOutput` in a governance-initated transaction. + message CommunityPoolOutput {} // The commitment was created by an inbound ICS20 transfer. message Ics20Transfer { // The sequence number of the packet that triggered the transfer @@ -42,7 +42,7 @@ message CommitmentSource { Transaction transaction = 1; Ics20Transfer ics_20_transfer = 2; FundingStreamReward funding_stream_reward = 20; - DaoOutput dao_output = 30; + CommunityPoolOutput community_pool_output = 30; Genesis genesis = 40; } } @@ -83,6 +83,4 @@ message EventBlockRoot { } // Query operations for the SCT component. -service QueryService { -} - +service QueryService {} diff --git a/proto/penumbra/penumbra/core/component/shielded_pool/v1alpha1/shielded_pool.proto b/proto/penumbra/penumbra/core/component/shielded_pool/v1alpha1/shielded_pool.proto index 205291d16c..fbf42f9ea2 100644 --- a/proto/penumbra/penumbra/core/component/shielded_pool/v1alpha1/shielded_pool.proto +++ b/proto/penumbra/penumbra/core/component/shielded_pool/v1alpha1/shielded_pool.proto @@ -2,11 +2,11 @@ syntax = "proto3"; package penumbra.core.component.shielded_pool.v1alpha1; import "penumbra/core/asset/v1alpha1/asset.proto"; +import "penumbra/core/component/sct/v1alpha1/sct.proto"; import "penumbra/core/keys/v1alpha1/keys.proto"; import "penumbra/core/num/v1alpha1/num.proto"; import "penumbra/crypto/decaf377_rdsa/v1alpha1/decaf377_rdsa.proto"; import "penumbra/crypto/tct/v1alpha1/tct.proto"; -import "penumbra/core/component/sct/v1alpha1/sct.proto"; message Note { asset.v1alpha1.Value value = 1; @@ -80,9 +80,9 @@ message SpendBody { // A commitment to the value of the input note. asset.v1alpha1.BalanceCommitment balance_commitment = 1; // The nullifier of the input note. - bytes nullifier = 3; + sct.v1alpha1.Nullifier nullifier = 6; // The randomized validating key for the spend authorization signature. - bytes rk = 4; + crypto.decaf377_rdsa.v1alpha1.SpendVerificationKey rk = 4; } message SpendView { message Visible { diff --git a/proto/penumbra/penumbra/core/component/stake/v1alpha1/stake.proto b/proto/penumbra/penumbra/core/component/stake/v1alpha1/stake.proto index 29a1410c58..6e0b57f594 100644 --- a/proto/penumbra/penumbra/core/component/stake/v1alpha1/stake.proto +++ b/proto/penumbra/penumbra/core/component/stake/v1alpha1/stake.proto @@ -51,7 +51,7 @@ message FundingStream { uint32 rate_bps = 2; } - message ToDao { + message ToCommunityPool { // The portion of the staking reward for the entire delegation pool // allocated to this funding stream, specified in basis points. uint32 rate_bps = 2; @@ -60,7 +60,7 @@ message FundingStream { // The recipient of the funding stream. oneof recipient { ToAddress to_address = 1; - ToDao to_dao = 2; + ToCommunityPool to_community_pool = 2; } } diff --git a/proto/penumbra/penumbra/core/keys/v1alpha1/keys.proto b/proto/penumbra/penumbra/core/keys/v1alpha1/keys.proto index e7d61a3c67..a88862b839 100644 --- a/proto/penumbra/penumbra/core/keys/v1alpha1/keys.proto +++ b/proto/penumbra/penumbra/core/keys/v1alpha1/keys.proto @@ -41,10 +41,6 @@ message SpendKey { bytes inner = 1; } -message SpendVerificationKey { - bytes inner = 1; -} - message FullViewingKey { bytes inner = 1; } diff --git a/proto/penumbra/penumbra/core/transaction/v1alpha1/transaction.proto b/proto/penumbra/penumbra/core/transaction/v1alpha1/transaction.proto index f7e9183133..1a9f13f109 100644 --- a/proto/penumbra/penumbra/core/transaction/v1alpha1/transaction.proto +++ b/proto/penumbra/penumbra/core/transaction/v1alpha1/transaction.proto @@ -10,6 +10,7 @@ import "penumbra/core/component/sct/v1alpha1/sct.proto"; import "penumbra/core/component/shielded_pool/v1alpha1/shielded_pool.proto"; import "penumbra/core/component/stake/v1alpha1/stake.proto"; import "penumbra/core/keys/v1alpha1/keys.proto"; +import "penumbra/core/txhash/v1alpha1/txhash.proto"; import "penumbra/crypto/decaf377_fmd/v1alpha1/decaf377_fmd.proto"; import "penumbra/crypto/decaf377_rdsa/v1alpha1/decaf377_rdsa.proto"; import "penumbra/crypto/tct/v1alpha1/tct.proto"; @@ -18,36 +19,24 @@ import "penumbra/crypto/tct/v1alpha1/tct.proto"; message Transaction { TransactionBody body = 1; // The binding signature is stored separately from the transaction body that it signs. - bytes binding_sig = 2; + crypto.decaf377_rdsa.v1alpha1.BindingSignature binding_sig = 2; // The root of some previous state of the state commitment tree, used as an anchor for all // ZK state transition proofs. crypto.tct.v1alpha1.MerkleRoot anchor = 3; } -// A transaction ID, the Sha256 hash of a transaction. -message Id { - bytes hash = 1; -} - // The body of a transaction. message TransactionBody { // A list of actions (state changes) performed by this transaction. repeated Action actions = 1; // Parameters determining if a transaction should be accepted by this chain. TransactionParameters transaction_parameters = 2; - // The transaction fee. - component.fee.v1alpha1.Fee fee = 3; // Detection data for use with Fuzzy Message Detection DetectionData detection_data = 4; - // Sub-message containing memo ciphertext if a memo was added to the transaction. - MemoData memo_data = 5; -} - -// Represents the encrypted memo data. -message MemoData { - // The encrypted data. It will only be populated if there are - // outputs in the actions of the transaction. 528 bytes. - bytes encrypted_memo = 1; + // The encrypted memo for this transaction. + // + // This field will be present if and only if the transaction has outputs. + MemoCiphertext memo = 5; } // The parameters determining if a transaction should be accepted by the chain. @@ -59,6 +48,8 @@ message TransactionParameters { // The chain this transaction is intended for. Including this prevents // replaying a transaction on one chain onto a different chain. string chain_id = 2; + // The transaction fee. + component.fee.v1alpha1.Fee fee = 3; } // Detection data used by a detection server performing Fuzzy Message Detection. @@ -99,10 +90,10 @@ message Action { component.stake.v1alpha1.Undelegate undelegate = 41; component.stake.v1alpha1.UndelegateClaim undelegate_claim = 42; - // DAO - component.governance.v1alpha1.DaoSpend dao_spend = 50; - component.governance.v1alpha1.DaoOutput dao_output = 51; - component.governance.v1alpha1.DaoDeposit dao_deposit = 52; + // Community Pool + component.governance.v1alpha1.CommunityPoolSpend community_pool_spend = 50; + component.governance.v1alpha1.CommunityPoolOutput community_pool_output = 51; + component.governance.v1alpha1.CommunityPoolDeposit community_pool_deposit = 52; component.ibc.v1alpha1.Ics20Withdrawal ics20_withdrawal = 200; } @@ -121,7 +112,7 @@ message TransactionPerspective { // Any relevant denoms for viewed assets. repeated asset.v1alpha1.DenomMetadata denoms = 5; // The transaction ID associated with this TransactionPerspective - transaction.v1alpha1.Id transaction_id = 6; + txhash.v1alpha1.TransactionId transaction_id = 6; } message PayloadKeyWithCommitment { @@ -139,7 +130,7 @@ message TransactionView { // View of the transaction body TransactionBodyView body_view = 1; // The binding signature is stored separately from the transaction body that it signs. - bytes binding_sig = 2; + crypto.decaf377_rdsa.v1alpha1.BindingSignature binding_sig = 2; // The root of some previous state of the state commitment tree, used as an anchor for all // ZK state transition proofs. crypto.tct.v1alpha1.MerkleRoot anchor = 3; @@ -150,8 +141,6 @@ message TransactionBodyView { repeated ActionView action_views = 1; // Transaction parameters. TransactionParameters transaction_parameters = 2; - // The transaction fee. - component.fee.v1alpha1.Fee fee = 3; // The detection data in this transaction, only populated if // there are outputs in the actions of this transaction. DetectionData detection_data = 4; @@ -187,10 +176,10 @@ message ActionView { component.stake.v1alpha1.Delegate delegate = 41; component.stake.v1alpha1.Undelegate undelegate = 42; - // DAO - component.governance.v1alpha1.DaoSpend dao_spend = 50; - component.governance.v1alpha1.DaoOutput dao_output = 51; - component.governance.v1alpha1.DaoDeposit dao_deposit = 52; + // Community Pool + component.governance.v1alpha1.CommunityPoolSpend community_pool_spend = 50; + component.governance.v1alpha1.CommunityPoolOutput community_pool_output = 51; + component.governance.v1alpha1.CommunityPoolDeposit community_pool_deposit = 52; // TODO: we have no way to recover the opening of the undelegate_claim's // balance commitment, and can only infer the value from looking at the rest @@ -200,15 +189,10 @@ message ActionView { } } -// An authorization hash for a Penumbra transaction. -message EffectHash { - bytes inner = 1; -} - // The data required to authorize a transaction plan. message AuthorizationData { // The computed auth hash for the approved transaction plan. - EffectHash effect_hash = 1; + core.txhash.v1alpha1.EffectHash effect_hash = 1; // The required spend authorizations, returned in the same order as the // Spend actions in the original request. repeated crypto.decaf377_rdsa.v1alpha1.SpendAuthSignature spend_auths = 2; @@ -228,18 +212,22 @@ message WitnessData { // Describes a planned transaction. Permits clients to prepare a transaction // prior submission, so that a user can review it prior to authorizing its execution. +// +// The `TransactionPlan` is a fully determined bundle binding all of a transaction's effects. +// The only thing it does not include is the witness data used for proving. message TransactionPlan { - // The planner interface(s) for Actions to be performed, such as a Spend, Swap, - // or Delegation. See the ActionPlan docs for a full list of options. + // The sequence of actions planned for this transaction. repeated ActionPlan actions = 1; - // Time, as block height, after which TransactionPlan should be considered invalid. - uint64 expiry_height = 2; - // The name of the network for which this TransactionPlan was built. - string chain_id = 3; - component.fee.v1alpha1.Fee fee = 4; + // Parameters determining if a transaction should be accepted by this chain. + TransactionParameters transaction_parameters = 2; + // Detection data for use with Fuzzy Message Detection + DetectionDataPlan detection_data = 4; + // The memo plan for this transaction. + MemoPlan memo = 5; +} + +message DetectionDataPlan { repeated CluePlan clue_plans = 5; - // Planning interface for constructing an optional Memo for the Transaction. - MemoPlan memo_plan = 6; } // Describes a planned transaction action. @@ -281,10 +269,10 @@ message ActionPlan { component.stake.v1alpha1.Undelegate undelegate = 41; component.stake.v1alpha1.UndelegateClaimPlan undelegate_claim = 42; - // DAO - component.governance.v1alpha1.DaoSpend dao_spend = 50; - component.governance.v1alpha1.DaoOutput dao_output = 51; - component.governance.v1alpha1.DaoDeposit dao_deposit = 52; + // Community Pool + component.governance.v1alpha1.CommunityPoolSpend community_pool_spend = 50; + component.governance.v1alpha1.CommunityPoolOutput community_pool_output = 51; + component.governance.v1alpha1.CommunityPoolDeposit community_pool_deposit = 52; } } @@ -298,7 +286,7 @@ message CluePlan { uint64 precision_bits = 3; } -// Describes a plan for forming a `Memo`. +// Describes a plan for forming the transaction memo. message MemoPlan { // The plaintext. MemoPlaintext plaintext = 1; @@ -306,12 +294,20 @@ message MemoPlan { bytes key = 2; } +// The encrypted memo data describing information about the purpose of a transaction. message MemoCiphertext { + // The encrypted data. 528 bytes. bytes inner = 1; } +// The plaintext describing information about the purpose of a transaction. message MemoPlaintext { + // The sender's return address. + // + // This should always be a valid address; the sender is responsible for ensuring + // that if the receiver returns funds to this address, they will not be lost. keys.v1alpha1.Address return_address = 1; + // Free-form text, up to 432 bytes long. string text = 2; } diff --git a/proto/penumbra/penumbra/core/txhash/v1alpha1/txhash.proto b/proto/penumbra/penumbra/core/txhash/v1alpha1/txhash.proto new file mode 100644 index 0000000000..746e62b5ac --- /dev/null +++ b/proto/penumbra/penumbra/core/txhash/v1alpha1/txhash.proto @@ -0,0 +1,15 @@ +syntax = "proto3"; +package penumbra.core.txhash.v1alpha1; + +// The hash of a Penumbra transaction's _effecting data_, describing the effects +// of the transaction on the chain state. +message EffectHash { + bytes inner = 1; +} + +// A transaction ID, the Sha256 hash of a transaction. +// +// This is the hash of the plain byte encoding, used by Tendermint. +message TransactionId { + bytes inner = 1; +} diff --git a/proto/penumbra/penumbra/crypto/decaf377_rdsa/v1alpha1/decaf377_rdsa.proto b/proto/penumbra/penumbra/crypto/decaf377_rdsa/v1alpha1/decaf377_rdsa.proto index 663fbb5bd5..0d38d6e64a 100644 --- a/proto/penumbra/penumbra/crypto/decaf377_rdsa/v1alpha1/decaf377_rdsa.proto +++ b/proto/penumbra/penumbra/crypto/decaf377_rdsa/v1alpha1/decaf377_rdsa.proto @@ -8,3 +8,7 @@ message SpendAuthSignature { message BindingSignature { bytes inner = 1; } + +message SpendVerificationKey { + bytes inner = 1; +} diff --git a/proto/penumbra/penumbra/view/v1alpha1/view.proto b/proto/penumbra/penumbra/view/v1alpha1/view.proto index 03fc754067..1b510b7bdf 100644 --- a/proto/penumbra/penumbra/view/v1alpha1/view.proto +++ b/proto/penumbra/penumbra/view/v1alpha1/view.proto @@ -14,15 +14,13 @@ import "penumbra/core/component/stake/v1alpha1/stake.proto"; import "penumbra/core/keys/v1alpha1/keys.proto"; import "penumbra/core/num/v1alpha1/num.proto"; import "penumbra/core/transaction/v1alpha1/transaction.proto"; +import "penumbra/core/txhash/v1alpha1/txhash.proto"; import "penumbra/crypto/tct/v1alpha1/tct.proto"; // The view protocol is used by a view client, who wants to do some // transaction-related actions, to request data from a view service, which is // responsible for synchronizing and scanning the public chain state with one or // more full viewing keys. -// -// View protocol requests optionally include the wallet id, used to -// identify which set of data to query. service ViewProtocolService { // Get current status of chain sync rpc Status(StatusRequest) returns (StatusResponse); @@ -130,7 +128,7 @@ message BroadcastTransactionRequest { message BroadcastTransactionResponse { // The hash of the transaction that was broadcast. - core.transaction.v1alpha1.Id id = 1; + core.txhash.v1alpha1.TransactionId id = 1; // The height in which the transaction was detected as included in the chain, if any. // Will not be included unless await_detection was true. uint64 detection_height = 2; @@ -147,9 +145,6 @@ message TransactionPlannerRequest { // If present, only spends funds from the given account. core.keys.v1alpha1.AddressIndex source = 4; - // Optionally identifies the wallet id to query. - core.keys.v1alpha1.WalletId wallet_id = 14; - // Request contents repeated Output outputs = 20; repeated Swap swaps = 30; @@ -262,28 +257,8 @@ message BalancesResponse { core.asset.v1alpha1.Value balance = 2; } -// Scaffolding for bearer-token authentication for the ViewService. -message ViewAuthToken { - bytes inner = 1; -} - -message ViewAuthRequest { - core.keys.v1alpha1.FullViewingKey fvk = 1; -} - -message ViewAuthResponse { - ViewAuthToken token = 1; -} - -service ViewAuthService { - rpc ViewAuth(ViewAuthRequest) returns (ViewAuthResponse); -} - // Requests sync status of the view service. -message StatusRequest { - // Identifies the wallet id to query. - core.keys.v1alpha1.WalletId wallet_id = 14; -} +message StatusRequest {} // Returns the status of the view service and whether it is synchronized with the chain state. message StatusResponse { @@ -296,10 +271,7 @@ message StatusResponse { } // Requests streaming updates on the sync height until the view service is synchronized. -message StatusStreamRequest { - // Identifies the wallet id to query. - core.keys.v1alpha1.WalletId wallet_id = 14; -} +message StatusStreamRequest {} // A streaming sync status update message StatusStreamResponse { @@ -329,9 +301,6 @@ message NotesRequest { // // Ignored if `asset_id` is unset or if `include_spent` is set. core.num.v1alpha1.Amount amount_to_spend = 6; - - // Identifies the wallet id to query. - core.keys.v1alpha1.WalletId wallet_id = 14; } // A query for notes to be used for voting on a proposal. @@ -341,9 +310,6 @@ message NotesForVotingRequest { // If set, only return notes with the specified asset id. core.keys.v1alpha1.AddressIndex address_index = 3; - - // Identifies the wallet id to query. - core.keys.v1alpha1.WalletId wallet_id = 14; } message WitnessRequest { @@ -352,9 +318,6 @@ message WitnessRequest { // The transaction plan to witness core.transaction.v1alpha1.TransactionPlan transaction_plan = 3; - - // Identifies the wallet id to query. - core.keys.v1alpha1.WalletId wallet_id = 14; } message WitnessResponse { @@ -419,8 +382,6 @@ message NoteByCommitmentRequest { crypto.tct.v1alpha1.StateCommitment note_commitment = 2; // If set to true, waits to return until the requested note is detected. bool await_detection = 3; - // Identifies the wallet id to query. - core.keys.v1alpha1.WalletId wallet_id = 14; } message NoteByCommitmentResponse { @@ -431,18 +392,13 @@ message SwapByCommitmentRequest { crypto.tct.v1alpha1.StateCommitment swap_commitment = 2; // If set to true, waits to return until the requested swap is detected. bool await_detection = 3; - // Identifies the wallet id to query. - core.keys.v1alpha1.WalletId wallet_id = 14; } message SwapByCommitmentResponse { SwapRecord swap = 1; } -message UnclaimedSwapsRequest { - // Identifies the wallet id to query. - core.keys.v1alpha1.WalletId wallet_id = 1; -} +message UnclaimedSwapsRequest {} message UnclaimedSwapsResponse { SwapRecord swap = 1; @@ -451,8 +407,6 @@ message UnclaimedSwapsResponse { message NullifierStatusRequest { core.component.sct.v1alpha1.Nullifier nullifier = 2; bool await_detection = 3; - // Identifies the wallet id to query. - core.keys.v1alpha1.WalletId wallet_id = 14; } message NullifierStatusResponse { @@ -461,7 +415,7 @@ message NullifierStatusResponse { message TransactionInfoByHashRequest { // The transaction hash to query for. - core.transaction.v1alpha1.Id id = 2; + core.txhash.v1alpha1.TransactionId id = 2; } message TransactionInfoRequest { @@ -475,7 +429,7 @@ message TransactionInfo { // The height the transaction was included in a block, if known. uint64 height = 1; // The hash of the transaction. - core.transaction.v1alpha1.Id id = 2; + core.txhash.v1alpha1.TransactionId id = 2; // The transaction data itself. core.transaction.v1alpha1.Transaction transaction = 3; // The transaction perspective, as seen by this view server. diff --git a/testnets/065-deimos/allocations.csv b/testnets/065-deimos/allocations.csv new file mode 100644 index 0000000000..d53665a4af --- /dev/null +++ b/testnets/065-deimos/allocations.csv @@ -0,0 +1,127 @@ +amount,denom,address +1_000_000__000_000,upenumbra,penumbra1tj9s0dh8ymphnw2qgrva57wpcmpr38e9a8w05t5c8dyynr7dt58hgnare7tunqyuryc7yag084rqxrsrj9yx8uk9yhs8lmg64hl993wn3rphlvan3paxdd6suyhwnpkd6cwzes +20_000,gm,penumbra1tj9s0dh8ymphnw2qgrva57wpcmpr38e9a8w05t5c8dyynr7dt58hgnare7tunqyuryc7yag084rqxrsrj9yx8uk9yhs8lmg64hl993wn3rphlvan3paxdd6suyhwnpkd6cwzes +20_000,gn,penumbra1tj9s0dh8ymphnw2qgrva57wpcmpr38e9a8w05t5c8dyynr7dt58hgnare7tunqyuryc7yag084rqxrsrj9yx8uk9yhs8lmg64hl993wn3rphlvan3paxdd6suyhwnpkd6cwzes +10_000,pizza,penumbra1tj9s0dh8ymphnw2qgrva57wpcmpr38e9a8w05t5c8dyynr7dt58hgnare7tunqyuryc7yag084rqxrsrj9yx8uk9yhs8lmg64hl993wn3rphlvan3paxdd6suyhwnpkd6cwzes +100,cube,penumbra1tj9s0dh8ymphnw2qgrva57wpcmpr38e9a8w05t5c8dyynr7dt58hgnare7tunqyuryc7yag084rqxrsrj9yx8uk9yhs8lmg64hl993wn3rphlvan3paxdd6suyhwnpkd6cwzes +500_000,test_usd,penumbra1tj9s0dh8ymphnw2qgrva57wpcmpr38e9a8w05t5c8dyynr7dt58hgnare7tunqyuryc7yag084rqxrsrj9yx8uk9yhs8lmg64hl993wn3rphlvan3paxdd6suyhwnpkd6cwzes +1_000_000__000_000,upenumbra,penumbra12ts5g469dpjdcn2wmdkz25nng6snxkuxumfnmygtrp2fm6776zjw7r35y2j7s07h8368a4kr3c904w8cjgpm6v3ysaj6gh930z7fwlqq9kvjewsy9fgamzxyj874kgu5uvcshg +20_000,gm,penumbra12ts5g469dpjdcn2wmdkz25nng6snxkuxumfnmygtrp2fm6776zjw7r35y2j7s07h8368a4kr3c904w8cjgpm6v3ysaj6gh930z7fwlqq9kvjewsy9fgamzxyj874kgu5uvcshg +20_000,gn,penumbra12ts5g469dpjdcn2wmdkz25nng6snxkuxumfnmygtrp2fm6776zjw7r35y2j7s07h8368a4kr3c904w8cjgpm6v3ysaj6gh930z7fwlqq9kvjewsy9fgamzxyj874kgu5uvcshg +10_000,pizza,penumbra12ts5g469dpjdcn2wmdkz25nng6snxkuxumfnmygtrp2fm6776zjw7r35y2j7s07h8368a4kr3c904w8cjgpm6v3ysaj6gh930z7fwlqq9kvjewsy9fgamzxyj874kgu5uvcshg +100,cube,penumbra12ts5g469dpjdcn2wmdkz25nng6snxkuxumfnmygtrp2fm6776zjw7r35y2j7s07h8368a4kr3c904w8cjgpm6v3ysaj6gh930z7fwlqq9kvjewsy9fgamzxyj874kgu5uvcshg +500_000,test_usd,penumbra12ts5g469dpjdcn2wmdkz25nng6snxkuxumfnmygtrp2fm6776zjw7r35y2j7s07h8368a4kr3c904w8cjgpm6v3ysaj6gh930z7fwlqq9kvjewsy9fgamzxyj874kgu5uvcshg +1_000_000__000_000,upenumbra,penumbra19zz058ttl8vhsypztc0gyl9yfs7jcn3906kgd3pzeh944klh8vf2ttx7qvscxwtuecw92cy6n55ttjn482q7ufpzwj5yem9xcvecrd2zc6vgctxzc3k7mnpg0lk8vved00e3g0 +20_000,gm,penumbra19zz058ttl8vhsypztc0gyl9yfs7jcn3906kgd3pzeh944klh8vf2ttx7qvscxwtuecw92cy6n55ttjn482q7ufpzwj5yem9xcvecrd2zc6vgctxzc3k7mnpg0lk8vved00e3g0 +20_000,gn,penumbra19zz058ttl8vhsypztc0gyl9yfs7jcn3906kgd3pzeh944klh8vf2ttx7qvscxwtuecw92cy6n55ttjn482q7ufpzwj5yem9xcvecrd2zc6vgctxzc3k7mnpg0lk8vved00e3g0 +10_000,pizza,penumbra19zz058ttl8vhsypztc0gyl9yfs7jcn3906kgd3pzeh944klh8vf2ttx7qvscxwtuecw92cy6n55ttjn482q7ufpzwj5yem9xcvecrd2zc6vgctxzc3k7mnpg0lk8vved00e3g0 +100,cube,penumbra19zz058ttl8vhsypztc0gyl9yfs7jcn3906kgd3pzeh944klh8vf2ttx7qvscxwtuecw92cy6n55ttjn482q7ufpzwj5yem9xcvecrd2zc6vgctxzc3k7mnpg0lk8vved00e3g0 +500_000,test_usd,penumbra19zz058ttl8vhsypztc0gyl9yfs7jcn3906kgd3pzeh944klh8vf2ttx7qvscxwtuecw92cy6n55ttjn482q7ufpzwj5yem9xcvecrd2zc6vgctxzc3k7mnpg0lk8vved00e3g0 +1_000_000__000_000,upenumbra,penumbra1qvqr8cvqyf4pwrl6svw9kj8eypf3fuunrcs83m30zxh57y2ytk94gygmtq5k82cjdq9y3mlaa3fwctwpdjr6fxnwuzrsy4ezm0u2tqpzw0sed82shzcr42sju55en26mavjnw4 +20_000,gm,penumbra1qvqr8cvqyf4pwrl6svw9kj8eypf3fuunrcs83m30zxh57y2ytk94gygmtq5k82cjdq9y3mlaa3fwctwpdjr6fxnwuzrsy4ezm0u2tqpzw0sed82shzcr42sju55en26mavjnw4 +20_000,gn,penumbra1qvqr8cvqyf4pwrl6svw9kj8eypf3fuunrcs83m30zxh57y2ytk94gygmtq5k82cjdq9y3mlaa3fwctwpdjr6fxnwuzrsy4ezm0u2tqpzw0sed82shzcr42sju55en26mavjnw4 +10_000,pizza,penumbra1qvqr8cvqyf4pwrl6svw9kj8eypf3fuunrcs83m30zxh57y2ytk94gygmtq5k82cjdq9y3mlaa3fwctwpdjr6fxnwuzrsy4ezm0u2tqpzw0sed82shzcr42sju55en26mavjnw4 +100,cube,penumbra1qvqr8cvqyf4pwrl6svw9kj8eypf3fuunrcs83m30zxh57y2ytk94gygmtq5k82cjdq9y3mlaa3fwctwpdjr6fxnwuzrsy4ezm0u2tqpzw0sed82shzcr42sju55en26mavjnw4 +500_000,test_usd,penumbra1qvqr8cvqyf4pwrl6svw9kj8eypf3fuunrcs83m30zxh57y2ytk94gygmtq5k82cjdq9y3mlaa3fwctwpdjr6fxnwuzrsy4ezm0u2tqpzw0sed82shzcr42sju55en26mavjnw4 +1_000_000__000_000,upenumbra,penumbra1djxk3jzq5d3ga63vut39gdr9lh57yp34pu79jnjmjna3mmxuqaf476e7ar9je0hfn35cpuu4s7l9vae4gfd4773zepygwed5pfgdad26pvzd6qqaur4czes0cl5ku7jjvhx0e0 +20_000,gm,penumbra1djxk3jzq5d3ga63vut39gdr9lh57yp34pu79jnjmjna3mmxuqaf476e7ar9je0hfn35cpuu4s7l9vae4gfd4773zepygwed5pfgdad26pvzd6qqaur4czes0cl5ku7jjvhx0e0 +20_000,gn,penumbra1djxk3jzq5d3ga63vut39gdr9lh57yp34pu79jnjmjna3mmxuqaf476e7ar9je0hfn35cpuu4s7l9vae4gfd4773zepygwed5pfgdad26pvzd6qqaur4czes0cl5ku7jjvhx0e0 +10_000,pizza,penumbra1djxk3jzq5d3ga63vut39gdr9lh57yp34pu79jnjmjna3mmxuqaf476e7ar9je0hfn35cpuu4s7l9vae4gfd4773zepygwed5pfgdad26pvzd6qqaur4czes0cl5ku7jjvhx0e0 +100,cube,penumbra1djxk3jzq5d3ga63vut39gdr9lh57yp34pu79jnjmjna3mmxuqaf476e7ar9je0hfn35cpuu4s7l9vae4gfd4773zepygwed5pfgdad26pvzd6qqaur4czes0cl5ku7jjvhx0e0 +500_000,test_usd,penumbra1djxk3jzq5d3ga63vut39gdr9lh57yp34pu79jnjmjna3mmxuqaf476e7ar9je0hfn35cpuu4s7l9vae4gfd4773zepygwed5pfgdad26pvzd6qqaur4czes0cl5ku7jjvhx0e0 +1_000_000__000_000,upenumbra,penumbra1f5qra6dk8pmp0m2s42sq4qsxthjp6mmcpj3rjwrn74getpmwhrgzhe545fhz6eew2gdcpn2ee0j7fdm4whxl8ux6p5jz6g5fz72u4pzd4z26jnxeasvsvwapx2lvhxw8uy7dvw +20_000,gm,penumbra1f5qra6dk8pmp0m2s42sq4qsxthjp6mmcpj3rjwrn74getpmwhrgzhe545fhz6eew2gdcpn2ee0j7fdm4whxl8ux6p5jz6g5fz72u4pzd4z26jnxeasvsvwapx2lvhxw8uy7dvw +20_000,gn,penumbra1f5qra6dk8pmp0m2s42sq4qsxthjp6mmcpj3rjwrn74getpmwhrgzhe545fhz6eew2gdcpn2ee0j7fdm4whxl8ux6p5jz6g5fz72u4pzd4z26jnxeasvsvwapx2lvhxw8uy7dvw +10_000,pizza,penumbra1f5qra6dk8pmp0m2s42sq4qsxthjp6mmcpj3rjwrn74getpmwhrgzhe545fhz6eew2gdcpn2ee0j7fdm4whxl8ux6p5jz6g5fz72u4pzd4z26jnxeasvsvwapx2lvhxw8uy7dvw +100,cube,penumbra1f5qra6dk8pmp0m2s42sq4qsxthjp6mmcpj3rjwrn74getpmwhrgzhe545fhz6eew2gdcpn2ee0j7fdm4whxl8ux6p5jz6g5fz72u4pzd4z26jnxeasvsvwapx2lvhxw8uy7dvw +500_000,test_usd,penumbra1f5qra6dk8pmp0m2s42sq4qsxthjp6mmcpj3rjwrn74getpmwhrgzhe545fhz6eew2gdcpn2ee0j7fdm4whxl8ux6p5jz6g5fz72u4pzd4z26jnxeasvsvwapx2lvhxw8uy7dvw +1_000_000__000_000,upenumbra,penumbra18dms48wvudc7qljl6zjq48hyuvxxvhm2se2zltpjndpnn5c092mwych7uvs0xztpc7q0e2j7s89nyfxyj2pmu50zafvhwq5x4prm49ax6c7txmvjjdkgu9c8u0nhyqgrsmfn2c +20_000,gm,penumbra18dms48wvudc7qljl6zjq48hyuvxxvhm2se2zltpjndpnn5c092mwych7uvs0xztpc7q0e2j7s89nyfxyj2pmu50zafvhwq5x4prm49ax6c7txmvjjdkgu9c8u0nhyqgrsmfn2c +20_000,gn,penumbra18dms48wvudc7qljl6zjq48hyuvxxvhm2se2zltpjndpnn5c092mwych7uvs0xztpc7q0e2j7s89nyfxyj2pmu50zafvhwq5x4prm49ax6c7txmvjjdkgu9c8u0nhyqgrsmfn2c +10_000,pizza,penumbra18dms48wvudc7qljl6zjq48hyuvxxvhm2se2zltpjndpnn5c092mwych7uvs0xztpc7q0e2j7s89nyfxyj2pmu50zafvhwq5x4prm49ax6c7txmvjjdkgu9c8u0nhyqgrsmfn2c +100,cube,penumbra18dms48wvudc7qljl6zjq48hyuvxxvhm2se2zltpjndpnn5c092mwych7uvs0xztpc7q0e2j7s89nyfxyj2pmu50zafvhwq5x4prm49ax6c7txmvjjdkgu9c8u0nhyqgrsmfn2c +500_000,test_usd,penumbra18dms48wvudc7qljl6zjq48hyuvxxvhm2se2zltpjndpnn5c092mwych7uvs0xztpc7q0e2j7s89nyfxyj2pmu50zafvhwq5x4prm49ax6c7txmvjjdkgu9c8u0nhyqgrsmfn2c +1_000_000__000_000,upenumbra,penumbra169w7gexlfa9m7gsa3vmwyfpu92j0yxawmlkt06g3qg5ta29czwzepzqp0d0nl324jgcjrc6fy0kmqhjlureeyjulejug8e2h6zj0kqf0vapwszahqm8swg634extm3837kl59v +20_000,gm,penumbra169w7gexlfa9m7gsa3vmwyfpu92j0yxawmlkt06g3qg5ta29czwzepzqp0d0nl324jgcjrc6fy0kmqhjlureeyjulejug8e2h6zj0kqf0vapwszahqm8swg634extm3837kl59v +20_000,gn,penumbra169w7gexlfa9m7gsa3vmwyfpu92j0yxawmlkt06g3qg5ta29czwzepzqp0d0nl324jgcjrc6fy0kmqhjlureeyjulejug8e2h6zj0kqf0vapwszahqm8swg634extm3837kl59v +10_000,pizza,penumbra169w7gexlfa9m7gsa3vmwyfpu92j0yxawmlkt06g3qg5ta29czwzepzqp0d0nl324jgcjrc6fy0kmqhjlureeyjulejug8e2h6zj0kqf0vapwszahqm8swg634extm3837kl59v +100,cube,penumbra169w7gexlfa9m7gsa3vmwyfpu92j0yxawmlkt06g3qg5ta29czwzepzqp0d0nl324jgcjrc6fy0kmqhjlureeyjulejug8e2h6zj0kqf0vapwszahqm8swg634extm3837kl59v +500_000,test_usd,penumbra169w7gexlfa9m7gsa3vmwyfpu92j0yxawmlkt06g3qg5ta29czwzepzqp0d0nl324jgcjrc6fy0kmqhjlureeyjulejug8e2h6zj0kqf0vapwszahqm8swg634extm3837kl59v +1_000_000__000_000,upenumbra,penumbra10as9rd2ny8w6v70sx4cetrph9twy5vu4ystjz6ae0uuutjamfztl2649vdufmya02a6r0907ywuxkhz3uve6thaf5et2jhnx97k0h0t07ad9pdhawls7wzklrktefzwwvrxtsn +20_000,gm,penumbra10as9rd2ny8w6v70sx4cetrph9twy5vu4ystjz6ae0uuutjamfztl2649vdufmya02a6r0907ywuxkhz3uve6thaf5et2jhnx97k0h0t07ad9pdhawls7wzklrktefzwwvrxtsn +20_000,gn,penumbra10as9rd2ny8w6v70sx4cetrph9twy5vu4ystjz6ae0uuutjamfztl2649vdufmya02a6r0907ywuxkhz3uve6thaf5et2jhnx97k0h0t07ad9pdhawls7wzklrktefzwwvrxtsn +10_000,pizza,penumbra10as9rd2ny8w6v70sx4cetrph9twy5vu4ystjz6ae0uuutjamfztl2649vdufmya02a6r0907ywuxkhz3uve6thaf5et2jhnx97k0h0t07ad9pdhawls7wzklrktefzwwvrxtsn +100,cube,penumbra10as9rd2ny8w6v70sx4cetrph9twy5vu4ystjz6ae0uuutjamfztl2649vdufmya02a6r0907ywuxkhz3uve6thaf5et2jhnx97k0h0t07ad9pdhawls7wzklrktefzwwvrxtsn +500_000,test_usd,penumbra10as9rd2ny8w6v70sx4cetrph9twy5vu4ystjz6ae0uuutjamfztl2649vdufmya02a6r0907ywuxkhz3uve6thaf5et2jhnx97k0h0t07ad9pdhawls7wzklrktefzwwvrxtsn +1_000_000__000_000,upenumbra,penumbra1ks9t4vrp9alvk9yfapyu75hjf7p3wva76t0dz9a902zlp8vuyn0q9j2a72pu9j0uxmg356xstqpmafkj28ktx37l4lzq25nmgdeay5ls00yky2pgladnr5z7u3ftav7lw9vnre +20_000,gm,penumbra1ks9t4vrp9alvk9yfapyu75hjf7p3wva76t0dz9a902zlp8vuyn0q9j2a72pu9j0uxmg356xstqpmafkj28ktx37l4lzq25nmgdeay5ls00yky2pgladnr5z7u3ftav7lw9vnre +20_000,gn,penumbra1ks9t4vrp9alvk9yfapyu75hjf7p3wva76t0dz9a902zlp8vuyn0q9j2a72pu9j0uxmg356xstqpmafkj28ktx37l4lzq25nmgdeay5ls00yky2pgladnr5z7u3ftav7lw9vnre +10_000,pizza,penumbra1ks9t4vrp9alvk9yfapyu75hjf7p3wva76t0dz9a902zlp8vuyn0q9j2a72pu9j0uxmg356xstqpmafkj28ktx37l4lzq25nmgdeay5ls00yky2pgladnr5z7u3ftav7lw9vnre +100,cube,penumbra1ks9t4vrp9alvk9yfapyu75hjf7p3wva76t0dz9a902zlp8vuyn0q9j2a72pu9j0uxmg356xstqpmafkj28ktx37l4lzq25nmgdeay5ls00yky2pgladnr5z7u3ftav7lw9vnre +500_000,test_usd,penumbra1ks9t4vrp9alvk9yfapyu75hjf7p3wva76t0dz9a902zlp8vuyn0q9j2a72pu9j0uxmg356xstqpmafkj28ktx37l4lzq25nmgdeay5ls00yky2pgladnr5z7u3ftav7lw9vnre +1_000_000__000_000,upenumbra,penumbra147mfall0zr6am5r45qkwht7xqqrdsp50czde7empv7yq2nk3z8yyfh9k9520ddgswkmzar22vhz9dwtuem7uxw0qytfpv7lk3q9dp8ccaw2fn5c838rfackazmgf3ahh09cxmz +20_000,gm,penumbra147mfall0zr6am5r45qkwht7xqqrdsp50czde7empv7yq2nk3z8yyfh9k9520ddgswkmzar22vhz9dwtuem7uxw0qytfpv7lk3q9dp8ccaw2fn5c838rfackazmgf3ahh09cxmz +20_000,gn,penumbra147mfall0zr6am5r45qkwht7xqqrdsp50czde7empv7yq2nk3z8yyfh9k9520ddgswkmzar22vhz9dwtuem7uxw0qytfpv7lk3q9dp8ccaw2fn5c838rfackazmgf3ahh09cxmz +10_000,pizza,penumbra147mfall0zr6am5r45qkwht7xqqrdsp50czde7empv7yq2nk3z8yyfh9k9520ddgswkmzar22vhz9dwtuem7uxw0qytfpv7lk3q9dp8ccaw2fn5c838rfackazmgf3ahh09cxmz +100,cube,penumbra147mfall0zr6am5r45qkwht7xqqrdsp50czde7empv7yq2nk3z8yyfh9k9520ddgswkmzar22vhz9dwtuem7uxw0qytfpv7lk3q9dp8ccaw2fn5c838rfackazmgf3ahh09cxmz +500_000,test_usd,penumbra147mfall0zr6am5r45qkwht7xqqrdsp50czde7empv7yq2nk3z8yyfh9k9520ddgswkmzar22vhz9dwtuem7uxw0qytfpv7lk3q9dp8ccaw2fn5c838rfackazmgf3ahh09cxmz +1_000_000__000_000,upenumbra,penumbra183uj3sh6d22j6mguu3vlpfcp87lh93jfzn3ucehfk2j4ek07jnwelznq2k8jk200gwrnyyvttexay2u638l7s6dhnh7vec3wscyefslswnhwd44ywqfxzxd4wdt8eqxy8st7k0 +20_000,gm,penumbra183uj3sh6d22j6mguu3vlpfcp87lh93jfzn3ucehfk2j4ek07jnwelznq2k8jk200gwrnyyvttexay2u638l7s6dhnh7vec3wscyefslswnhwd44ywqfxzxd4wdt8eqxy8st7k0 +20_000,gn,penumbra183uj3sh6d22j6mguu3vlpfcp87lh93jfzn3ucehfk2j4ek07jnwelznq2k8jk200gwrnyyvttexay2u638l7s6dhnh7vec3wscyefslswnhwd44ywqfxzxd4wdt8eqxy8st7k0 +10_000,pizza,penumbra183uj3sh6d22j6mguu3vlpfcp87lh93jfzn3ucehfk2j4ek07jnwelznq2k8jk200gwrnyyvttexay2u638l7s6dhnh7vec3wscyefslswnhwd44ywqfxzxd4wdt8eqxy8st7k0 +100,cube,penumbra183uj3sh6d22j6mguu3vlpfcp87lh93jfzn3ucehfk2j4ek07jnwelznq2k8jk200gwrnyyvttexay2u638l7s6dhnh7vec3wscyefslswnhwd44ywqfxzxd4wdt8eqxy8st7k0 +500_000,test_usd,penumbra183uj3sh6d22j6mguu3vlpfcp87lh93jfzn3ucehfk2j4ek07jnwelznq2k8jk200gwrnyyvttexay2u638l7s6dhnh7vec3wscyefslswnhwd44ywqfxzxd4wdt8eqxy8st7k0 +5_000_000__000_000,upenumbra,penumbra1xq2e9x7uhfzezwunvazdamlxepf4jr5htsuqnzlsahuayyqxjjwg9lk0aytwm6wfj3jy29rv2kdpen57903s8wxv3jmqwj6m6v5jgn6y2cypfd03rke652k8wmavxra7e9wkrg +50_000,gm,penumbra1xq2e9x7uhfzezwunvazdamlxepf4jr5htsuqnzlsahuayyqxjjwg9lk0aytwm6wfj3jy29rv2kdpen57903s8wxv3jmqwj6m6v5jgn6y2cypfd03rke652k8wmavxra7e9wkrg +50_000,gn,penumbra1xq2e9x7uhfzezwunvazdamlxepf4jr5htsuqnzlsahuayyqxjjwg9lk0aytwm6wfj3jy29rv2kdpen57903s8wxv3jmqwj6m6v5jgn6y2cypfd03rke652k8wmavxra7e9wkrg +25_000,pizza,penumbra1xq2e9x7uhfzezwunvazdamlxepf4jr5htsuqnzlsahuayyqxjjwg9lk0aytwm6wfj3jy29rv2kdpen57903s8wxv3jmqwj6m6v5jgn6y2cypfd03rke652k8wmavxra7e9wkrg +250,cube,penumbra1xq2e9x7uhfzezwunvazdamlxepf4jr5htsuqnzlsahuayyqxjjwg9lk0aytwm6wfj3jy29rv2kdpen57903s8wxv3jmqwj6m6v5jgn6y2cypfd03rke652k8wmavxra7e9wkrg +1_000_000,test_usd,penumbra1xq2e9x7uhfzezwunvazdamlxepf4jr5htsuqnzlsahuayyqxjjwg9lk0aytwm6wfj3jy29rv2kdpen57903s8wxv3jmqwj6m6v5jgn6y2cypfd03rke652k8wmavxra7e9wkrg +10_000,nala,penumbra1xq2e9x7uhfzezwunvazdamlxepf4jr5htsuqnzlsahuayyqxjjwg9lk0aytwm6wfj3jy29rv2kdpen57903s8wxv3jmqwj6m6v5jgn6y2cypfd03rke652k8wmavxra7e9wkrg +5_000_000__000_000,upenumbra,penumbra1mflr95lhj0vjr86uyffkmxg6hjamjs7rrcykwgnyt8lcz0a6xqzh0xz78hpnq3x70s8cnu4cnyqq2wgkt9nthcc3k8scf4wlraccdmkr6wyzsap88t0du2dlv5xclgkmwmwnct +50_000,gm,penumbra1mflr95lhj0vjr86uyffkmxg6hjamjs7rrcykwgnyt8lcz0a6xqzh0xz78hpnq3x70s8cnu4cnyqq2wgkt9nthcc3k8scf4wlraccdmkr6wyzsap88t0du2dlv5xclgkmwmwnct +50_000,gn,penumbra1mflr95lhj0vjr86uyffkmxg6hjamjs7rrcykwgnyt8lcz0a6xqzh0xz78hpnq3x70s8cnu4cnyqq2wgkt9nthcc3k8scf4wlraccdmkr6wyzsap88t0du2dlv5xclgkmwmwnct +25_000,pizza,penumbra1mflr95lhj0vjr86uyffkmxg6hjamjs7rrcykwgnyt8lcz0a6xqzh0xz78hpnq3x70s8cnu4cnyqq2wgkt9nthcc3k8scf4wlraccdmkr6wyzsap88t0du2dlv5xclgkmwmwnct +250,cube,penumbra1mflr95lhj0vjr86uyffkmxg6hjamjs7rrcykwgnyt8lcz0a6xqzh0xz78hpnq3x70s8cnu4cnyqq2wgkt9nthcc3k8scf4wlraccdmkr6wyzsap88t0du2dlv5xclgkmwmwnct +1_000_000,test_usd,penumbra1mflr95lhj0vjr86uyffkmxg6hjamjs7rrcykwgnyt8lcz0a6xqzh0xz78hpnq3x70s8cnu4cnyqq2wgkt9nthcc3k8scf4wlraccdmkr6wyzsap88t0du2dlv5xclgkmwmwnct +10_000,nala,penumbra1mflr95lhj0vjr86uyffkmxg6hjamjs7rrcykwgnyt8lcz0a6xqzh0xz78hpnq3x70s8cnu4cnyqq2wgkt9nthcc3k8scf4wlraccdmkr6wyzsap88t0du2dlv5xclgkmwmwnct +5_000_000__000_000,upenumbra,penumbra1jdgsqxnqqhqwjc6j3lhm4qnqz4gu02j87p4v0uj95ur9xdtym9acnj6p6ykqx89crmj0gw8r6fl4xh4la2yxyks9czl4lvqsxm9e5u86gdus0fh9hqxvg8aq47cw9fv8l2vh34 +50_000,gm,penumbra1jdgsqxnqqhqwjc6j3lhm4qnqz4gu02j87p4v0uj95ur9xdtym9acnj6p6ykqx89crmj0gw8r6fl4xh4la2yxyks9czl4lvqsxm9e5u86gdus0fh9hqxvg8aq47cw9fv8l2vh34 +50_000,gn,penumbra1jdgsqxnqqhqwjc6j3lhm4qnqz4gu02j87p4v0uj95ur9xdtym9acnj6p6ykqx89crmj0gw8r6fl4xh4la2yxyks9czl4lvqsxm9e5u86gdus0fh9hqxvg8aq47cw9fv8l2vh34 +25_000,pizza,penumbra1jdgsqxnqqhqwjc6j3lhm4qnqz4gu02j87p4v0uj95ur9xdtym9acnj6p6ykqx89crmj0gw8r6fl4xh4la2yxyks9czl4lvqsxm9e5u86gdus0fh9hqxvg8aq47cw9fv8l2vh34 +250,cube,penumbra1jdgsqxnqqhqwjc6j3lhm4qnqz4gu02j87p4v0uj95ur9xdtym9acnj6p6ykqx89crmj0gw8r6fl4xh4la2yxyks9czl4lvqsxm9e5u86gdus0fh9hqxvg8aq47cw9fv8l2vh34 +1_000_000,test_usd,penumbra1jdgsqxnqqhqwjc6j3lhm4qnqz4gu02j87p4v0uj95ur9xdtym9acnj6p6ykqx89crmj0gw8r6fl4xh4la2yxyks9czl4lvqsxm9e5u86gdus0fh9hqxvg8aq47cw9fv8l2vh34 +10_000,nala,penumbra1jdgsqxnqqhqwjc6j3lhm4qnqz4gu02j87p4v0uj95ur9xdtym9acnj6p6ykqx89crmj0gw8r6fl4xh4la2yxyks9czl4lvqsxm9e5u86gdus0fh9hqxvg8aq47cw9fv8l2vh34 +5_000_000__000_000,upenumbra,penumbra1k20526f5je6c3mftpuu7p7mn3tr3p84x4qgm2nla9czwae9awse6mqsvn8qgr83y3cnhh7wkwv0s29ycs9r4p6lr5eeee0emquun8v7qlt7lt8w7ck3ukl5ctnufhzwmj00utn +50_000,gm,penumbra1k20526f5je6c3mftpuu7p7mn3tr3p84x4qgm2nla9czwae9awse6mqsvn8qgr83y3cnhh7wkwv0s29ycs9r4p6lr5eeee0emquun8v7qlt7lt8w7ck3ukl5ctnufhzwmj00utn +50_000,gn,penumbra1k20526f5je6c3mftpuu7p7mn3tr3p84x4qgm2nla9czwae9awse6mqsvn8qgr83y3cnhh7wkwv0s29ycs9r4p6lr5eeee0emquun8v7qlt7lt8w7ck3ukl5ctnufhzwmj00utn +25_000,pizza,penumbra1k20526f5je6c3mftpuu7p7mn3tr3p84x4qgm2nla9czwae9awse6mqsvn8qgr83y3cnhh7wkwv0s29ycs9r4p6lr5eeee0emquun8v7qlt7lt8w7ck3ukl5ctnufhzwmj00utn +250,cube,penumbra1k20526f5je6c3mftpuu7p7mn3tr3p84x4qgm2nla9czwae9awse6mqsvn8qgr83y3cnhh7wkwv0s29ycs9r4p6lr5eeee0emquun8v7qlt7lt8w7ck3ukl5ctnufhzwmj00utn +1_000_000,test_usd,penumbra1k20526f5je6c3mftpuu7p7mn3tr3p84x4qgm2nla9czwae9awse6mqsvn8qgr83y3cnhh7wkwv0s29ycs9r4p6lr5eeee0emquun8v7qlt7lt8w7ck3ukl5ctnufhzwmj00utn +10_000,nala,penumbra1k20526f5je6c3mftpuu7p7mn3tr3p84x4qgm2nla9czwae9awse6mqsvn8qgr83y3cnhh7wkwv0s29ycs9r4p6lr5eeee0emquun8v7qlt7lt8w7ck3ukl5ctnufhzwmj00utn +10_000_000__000_000,upenumbra,penumbra1rqcd3hfvkvc04c4c9vc0ac87lh4y0z8l28k4xp6d0cnd5jc6f6k0neuzp6zdwtpwyfpswtdzv9jzqtpjn5t6wh96pfx3flq2dhqgc42u7c06kj57dl39w2xm6tg0wh4zc8kjjk +10_000_000,gm,penumbra1rqcd3hfvkvc04c4c9vc0ac87lh4y0z8l28k4xp6d0cnd5jc6f6k0neuzp6zdwtpwyfpswtdzv9jzqtpjn5t6wh96pfx3flq2dhqgc42u7c06kj57dl39w2xm6tg0wh4zc8kjjk +10_000_000,gn,penumbra1rqcd3hfvkvc04c4c9vc0ac87lh4y0z8l28k4xp6d0cnd5jc6f6k0neuzp6zdwtpwyfpswtdzv9jzqtpjn5t6wh96pfx3flq2dhqgc42u7c06kj57dl39w2xm6tg0wh4zc8kjjk +10_000_000,pizza,penumbra1rqcd3hfvkvc04c4c9vc0ac87lh4y0z8l28k4xp6d0cnd5jc6f6k0neuzp6zdwtpwyfpswtdzv9jzqtpjn5t6wh96pfx3flq2dhqgc42u7c06kj57dl39w2xm6tg0wh4zc8kjjk +10_000_000,cube,penumbra1rqcd3hfvkvc04c4c9vc0ac87lh4y0z8l28k4xp6d0cnd5jc6f6k0neuzp6zdwtpwyfpswtdzv9jzqtpjn5t6wh96pfx3flq2dhqgc42u7c06kj57dl39w2xm6tg0wh4zc8kjjk +10_000_000,test_usd,penumbra1rqcd3hfvkvc04c4c9vc0ac87lh4y0z8l28k4xp6d0cnd5jc6f6k0neuzp6zdwtpwyfpswtdzv9jzqtpjn5t6wh96pfx3flq2dhqgc42u7c06kj57dl39w2xm6tg0wh4zc8kjjk +10_000_000,test_btc,penumbra1rqcd3hfvkvc04c4c9vc0ac87lh4y0z8l28k4xp6d0cnd5jc6f6k0neuzp6zdwtpwyfpswtdzv9jzqtpjn5t6wh96pfx3flq2dhqgc42u7c06kj57dl39w2xm6tg0wh4zc8kjjk +10_000_000,test_eth,penumbra1rqcd3hfvkvc04c4c9vc0ac87lh4y0z8l28k4xp6d0cnd5jc6f6k0neuzp6zdwtpwyfpswtdzv9jzqtpjn5t6wh96pfx3flq2dhqgc42u7c06kj57dl39w2xm6tg0wh4zc8kjjk +10_000_000,test_atom,penumbra1rqcd3hfvkvc04c4c9vc0ac87lh4y0z8l28k4xp6d0cnd5jc6f6k0neuzp6zdwtpwyfpswtdzv9jzqtpjn5t6wh96pfx3flq2dhqgc42u7c06kj57dl39w2xm6tg0wh4zc8kjjk +10_000_000,test_osmo,penumbra1rqcd3hfvkvc04c4c9vc0ac87lh4y0z8l28k4xp6d0cnd5jc6f6k0neuzp6zdwtpwyfpswtdzv9jzqtpjn5t6wh96pfx3flq2dhqgc42u7c06kj57dl39w2xm6tg0wh4zc8kjjk +10_000_000__000_000,upenumbra,penumbra105shuajmml02qgfwmxz7rqqcjwu8tzjdyd3u75za35cj0se3pv5ssmxlv9qc86hawtae35whfst78g30z9xhyxvh8vrz433rlvslzg5675rwr8rcz7g6pszmc5tkm63u6kqa3f +10_000_000,gm,penumbra105shuajmml02qgfwmxz7rqqcjwu8tzjdyd3u75za35cj0se3pv5ssmxlv9qc86hawtae35whfst78g30z9xhyxvh8vrz433rlvslzg5675rwr8rcz7g6pszmc5tkm63u6kqa3f +10_000_000,gn,penumbra105shuajmml02qgfwmxz7rqqcjwu8tzjdyd3u75za35cj0se3pv5ssmxlv9qc86hawtae35whfst78g30z9xhyxvh8vrz433rlvslzg5675rwr8rcz7g6pszmc5tkm63u6kqa3f +10_000_000,pizza,penumbra105shuajmml02qgfwmxz7rqqcjwu8tzjdyd3u75za35cj0se3pv5ssmxlv9qc86hawtae35whfst78g30z9xhyxvh8vrz433rlvslzg5675rwr8rcz7g6pszmc5tkm63u6kqa3f +10_000_000,cube,penumbra105shuajmml02qgfwmxz7rqqcjwu8tzjdyd3u75za35cj0se3pv5ssmxlv9qc86hawtae35whfst78g30z9xhyxvh8vrz433rlvslzg5675rwr8rcz7g6pszmc5tkm63u6kqa3f +10_000_000,test_usd,penumbra105shuajmml02qgfwmxz7rqqcjwu8tzjdyd3u75za35cj0se3pv5ssmxlv9qc86hawtae35whfst78g30z9xhyxvh8vrz433rlvslzg5675rwr8rcz7g6pszmc5tkm63u6kqa3f +10_000_000,test_btc,penumbra105shuajmml02qgfwmxz7rqqcjwu8tzjdyd3u75za35cj0se3pv5ssmxlv9qc86hawtae35whfst78g30z9xhyxvh8vrz433rlvslzg5675rwr8rcz7g6pszmc5tkm63u6kqa3f +10_000_000,test_eth,penumbra105shuajmml02qgfwmxz7rqqcjwu8tzjdyd3u75za35cj0se3pv5ssmxlv9qc86hawtae35whfst78g30z9xhyxvh8vrz433rlvslzg5675rwr8rcz7g6pszmc5tkm63u6kqa3f +10_000_000,test_atom,penumbra105shuajmml02qgfwmxz7rqqcjwu8tzjdyd3u75za35cj0se3pv5ssmxlv9qc86hawtae35whfst78g30z9xhyxvh8vrz433rlvslzg5675rwr8rcz7g6pszmc5tkm63u6kqa3f +10_000_000,test_osmo,penumbra105shuajmml02qgfwmxz7rqqcjwu8tzjdyd3u75za35cj0se3pv5ssmxlv9qc86hawtae35whfst78g30z9xhyxvh8vrz433rlvslzg5675rwr8rcz7g6pszmc5tkm63u6kqa3f +100,gm,penumbra147mfall0zr6am5r45qkwht7xqqrdsp50czde7empv7yq2nk3z8yyfh9k9520ddgswkmzar22vhz9dwtuem7uxw0qytfpv7lk3q9dp8ccaw2fn5c838rfackazmgf3ahh09cxmz +501_000,test_usd,penumbra147mfall0zr6am5r45qkwht7xqqrdsp50czde7empv7yq2nk3z8yyfh9k9520ddgswkmzar22vhz9dwtuem7uxw0qytfpv7lk3q9dp8ccaw2fn5c838rfackazmgf3ahh09cxmz +1,cube,penumbra147mfall0zr6am5r45qkwht7xqqrdsp50czde7empv7yq2nk3z8yyfh9k9520ddgswkmzar22vhz9dwtuem7uxw0qytfpv7lk3q9dp8ccaw2fn5c838rfackazmgf3ahh09cxmz +2_000__000_000,upenumbra,penumbra147mfall0zr6am5r45qkwht7xqqrdsp50czde7empv7yq2nk3z8yyfh9k9520ddgswkmzar22vhz9dwtuem7uxw0qytfpv7lk3q9dp8ccaw2fn5c838rfackazmgf3ahh09cxmz +1_000,test_usd,penumbra1vmmz304hjlkjq6xv4al5dqumvgk3ek82rneagj07vdqkudjvl6y7zxzr5k6qq24yc7yyyekpu9qm7ef3acg2u8p950hs6hu3e73guq5pfmmvm63qudfx4qmg8h7fdweyw3ektn +1_000__000_000,upenumbra,penumbra1vmmz304hjlkjq6xv4al5dqumvgk3ek82rneagj07vdqkudjvl6y7zxzr5k6qq24yc7yyyekpu9qm7ef3acg2u8p950hs6hu3e73guq5pfmmvm63qudfx4qmg8h7fdweyw3ektn diff --git a/testnets/065-deimos/validators.json b/testnets/065-deimos/validators.json new file mode 100644 index 0000000000..29bdf9f0ce --- /dev/null +++ b/testnets/065-deimos/validators.json @@ -0,0 +1,34 @@ +[ + { + "name": "Penumbra Labs CI 1", + "website": "https://penumbra.zone", + "description": "This is a validator run by Penumbra Labs, using testnets as a public CI", + "funding_streams": [ + [ + 50, + "penumbra1fcy6crf6u4r450k8y4nye43puxet2ytfh7s0dzxsxjk68czej9mp37xv49np0clv4dc8cwg4re0xfs79uwlfehnja4p0revmlek0drezxfse8spg3qc6gux6vyuzuulse7xuxv" + ], + [ + 50, + "penumbra13ahs2s8ms6q0utgetty3zflwteepg87gqm88sqqcdj2mjhhydkykwu6n7dk557x84aa9a6cqhdytw0zk33xjgmuedprrlunc86up6zps8juej9rpuuydjtk7jaxpmrw27gfu9x" + ], + [ + 50, + "penumbra1uw03wyt49u7wm5wgu4nvkdt0v48fdaw5y4az4xlgmnp6ucs6th4xd0zg8wqxwndwfv286ktjwgemyhrxqu0d5qjf8dapr57l3k8yqs09vw9m5ywxsx9hjj2dj4qwnrl2rzxdh9" + ], + [ + 50, + "penumbra1w6em8sdx0467ug9kk0s0sng254tqjfk9gglv6ff7dq2v8arwekevkjte9udzmsj9l83mz74747tj0a49w2vhecxj7ac4upr5c5pvjqhsy7dwn422m8dgdekt7y4lmad026njsv" + ], + [ + 50, + "penumbra1jp4pryqqmh65pq8e7zwk6k2674vwhn4qqphxjk0vukxln0crmp2tdld0mhavuyrspwuajnsk5t5t33u2auxvheunr7qde4l068ez0euvtu08z7rwj6shlh64ndz0wvz7cmu29z" + ], + [ + 50, + "penumbra1hum845ches70c8kp8zfx7nerjwfe653hxsrpgwepwtspcp4jy6ytnxhe5kwn56sku684x6zzqcwp5ycrkee5mmg9kdl3jkr5lqn2xq3kqxvp4d7gwqdue5jznk2ter2teg83gu" + ] + ], + "sequence_number": 0 + } +] \ No newline at end of file diff --git a/testnets/base_addresses.txt b/testnets/base_addresses.txt index 1953088899..fd548df35b 100644 --- a/testnets/base_addresses.txt +++ b/testnets/base_addresses.txt @@ -9,3 +9,4 @@ penumbra169w7gexlfa9m7gsa3vmwyfpu92j0yxawmlkt06g3qg5ta29czwzepzqp0d0nl324jgcjrc6 penumbra10as9rd2ny8w6v70sx4cetrph9twy5vu4ystjz6ae0uuutjamfztl2649vdufmya02a6r0907ywuxkhz3uve6thaf5et2jhnx97k0h0t07ad9pdhawls7wzklrktefzwwvrxtsn penumbra1ks9t4vrp9alvk9yfapyu75hjf7p3wva76t0dz9a902zlp8vuyn0q9j2a72pu9j0uxmg356xstqpmafkj28ktx37l4lzq25nmgdeay5ls00yky2pgladnr5z7u3ftav7lw9vnre penumbra147mfall0zr6am5r45qkwht7xqqrdsp50czde7empv7yq2nk3z8yyfh9k9520ddgswkmzar22vhz9dwtuem7uxw0qytfpv7lk3q9dp8ccaw2fn5c838rfackazmgf3ahh09cxmz +penumbra183uj3sh6d22j6mguu3vlpfcp87lh93jfzn3ucehfk2j4ek07jnwelznq2k8jk200gwrnyyvttexay2u638l7s6dhnh7vec3wscyefslswnhwd44ywqfxzxd4wdt8eqxy8st7k0 diff --git a/testnets/base_allocations.csv b/testnets/base_allocations.csv index d571fef3d2..d53665a4af 100644 --- a/testnets/base_allocations.csv +++ b/testnets/base_allocations.csv @@ -65,6 +65,12 @@ amount,denom,address 10_000,pizza,penumbra147mfall0zr6am5r45qkwht7xqqrdsp50czde7empv7yq2nk3z8yyfh9k9520ddgswkmzar22vhz9dwtuem7uxw0qytfpv7lk3q9dp8ccaw2fn5c838rfackazmgf3ahh09cxmz 100,cube,penumbra147mfall0zr6am5r45qkwht7xqqrdsp50czde7empv7yq2nk3z8yyfh9k9520ddgswkmzar22vhz9dwtuem7uxw0qytfpv7lk3q9dp8ccaw2fn5c838rfackazmgf3ahh09cxmz 500_000,test_usd,penumbra147mfall0zr6am5r45qkwht7xqqrdsp50czde7empv7yq2nk3z8yyfh9k9520ddgswkmzar22vhz9dwtuem7uxw0qytfpv7lk3q9dp8ccaw2fn5c838rfackazmgf3ahh09cxmz +1_000_000__000_000,upenumbra,penumbra183uj3sh6d22j6mguu3vlpfcp87lh93jfzn3ucehfk2j4ek07jnwelznq2k8jk200gwrnyyvttexay2u638l7s6dhnh7vec3wscyefslswnhwd44ywqfxzxd4wdt8eqxy8st7k0 +20_000,gm,penumbra183uj3sh6d22j6mguu3vlpfcp87lh93jfzn3ucehfk2j4ek07jnwelznq2k8jk200gwrnyyvttexay2u638l7s6dhnh7vec3wscyefslswnhwd44ywqfxzxd4wdt8eqxy8st7k0 +20_000,gn,penumbra183uj3sh6d22j6mguu3vlpfcp87lh93jfzn3ucehfk2j4ek07jnwelznq2k8jk200gwrnyyvttexay2u638l7s6dhnh7vec3wscyefslswnhwd44ywqfxzxd4wdt8eqxy8st7k0 +10_000,pizza,penumbra183uj3sh6d22j6mguu3vlpfcp87lh93jfzn3ucehfk2j4ek07jnwelznq2k8jk200gwrnyyvttexay2u638l7s6dhnh7vec3wscyefslswnhwd44ywqfxzxd4wdt8eqxy8st7k0 +100,cube,penumbra183uj3sh6d22j6mguu3vlpfcp87lh93jfzn3ucehfk2j4ek07jnwelznq2k8jk200gwrnyyvttexay2u638l7s6dhnh7vec3wscyefslswnhwd44ywqfxzxd4wdt8eqxy8st7k0 +500_000,test_usd,penumbra183uj3sh6d22j6mguu3vlpfcp87lh93jfzn3ucehfk2j4ek07jnwelznq2k8jk200gwrnyyvttexay2u638l7s6dhnh7vec3wscyefslswnhwd44ywqfxzxd4wdt8eqxy8st7k0 5_000_000__000_000,upenumbra,penumbra1xq2e9x7uhfzezwunvazdamlxepf4jr5htsuqnzlsahuayyqxjjwg9lk0aytwm6wfj3jy29rv2kdpen57903s8wxv3jmqwj6m6v5jgn6y2cypfd03rke652k8wmavxra7e9wkrg 50_000,gm,penumbra1xq2e9x7uhfzezwunvazdamlxepf4jr5htsuqnzlsahuayyqxjjwg9lk0aytwm6wfj3jy29rv2kdpen57903s8wxv3jmqwj6m6v5jgn6y2cypfd03rke652k8wmavxra7e9wkrg 50_000,gn,penumbra1xq2e9x7uhfzezwunvazdamlxepf4jr5htsuqnzlsahuayyqxjjwg9lk0aytwm6wfj3jy29rv2kdpen57903s8wxv3jmqwj6m6v5jgn6y2cypfd03rke652k8wmavxra7e9wkrg diff --git a/testnets/names.txt b/testnets/names.txt index a34012f92d..e18ddb8e29 100644 --- a/testnets/names.txt +++ b/testnets/names.txt @@ -62,3 +62,5 @@ Dione Iapetus Rhea Titan +Deimos +Phobos diff --git a/tools/parameter-setup/Cargo.toml b/tools/parameter-setup/Cargo.toml index a171161f3e..111c48e07e 100644 --- a/tools/parameter-setup/Cargo.toml +++ b/tools/parameter-setup/Cargo.toml @@ -6,12 +6,20 @@ publish = false [dependencies] penumbra-proof-params = { path = "../../crates/crypto/proof-params" } -penumbra-proof-setup = { path = "../../crates/crypto/proof-setup", features = ["parallel"] } +penumbra-proof-setup = { path = "../../crates/crypto/proof-setup", features = [ + "parallel", +] } penumbra-dex = { path = "../../crates/core/component/dex/" } -penumbra-dao = { path = "../../crates/core/component/dao/", features = ["component"] } +penumbra-community-pool = { path = "../../crates/core/component/community-pool/", features = [ + "component", +] } penumbra-governance = { path = "../../crates/core/component/governance/" } -penumbra-shielded-pool = { path = "../../crates/core/component/shielded-pool/", features = ["parallel"] } -penumbra-stake = { path = "../../crates/core/component/stake/", features = ["component"] } +penumbra-shielded-pool = { path = "../../crates/core/component/shielded-pool/", features = [ + "parallel", +] } +penumbra-stake = { path = "../../crates/core/component/stake/", features = [ + "component", +] } ark-groth16 = "0.4" ark-serialize = "0.4" decaf377 = { version = "0.5", features = ["r1cs"] } diff --git a/tools/parameter-setup/src/main.rs b/tools/parameter-setup/src/main.rs index 4276004b14..078fd5c069 100644 --- a/tools/parameter-setup/src/main.rs +++ b/tools/parameter-setup/src/main.rs @@ -17,8 +17,9 @@ use penumbra_proof_setup::single::{ circuit_degree, combine, log::Hashable, transition, Phase1CRSElements, Phase1Contribution, Phase2Contribution, }; -use penumbra_shielded_pool::{NullifierDerivationCircuit, OutputCircuit, SpendCircuit}; -use penumbra_stake::UndelegateClaimCircuit; +use penumbra_shielded_pool::{ + ConvertCircuit, NullifierDerivationCircuit, OutputCircuit, SpendCircuit, +}; use rand_core::OsRng; fn generate_parameters() -> (ProvingKey, VerifyingKey) { @@ -82,12 +83,12 @@ fn main() -> Result<()> { write_params(&target_dir, "swap", &swap_pk, &swap_vk)?; let (swapclaim_pk, swapclaim_vk) = generate_parameters::(); write_params(&target_dir, "swapclaim", &swapclaim_pk, &swapclaim_vk)?; - let (undelegateclaim_pk, undelegateclaim_vk) = generate_parameters::(); + let (convert_pk, convert_vk) = generate_parameters::(); write_params( &target_dir, - "undelegateclaim", - &undelegateclaim_pk, - &undelegateclaim_vk, + "convert", + &convert_pk, + &convert_vk, )?; let (delegator_vote_pk, delegator_vote_vk) = generate_parameters::(); write_params( diff --git a/tools/proto-compiler/Cargo.lock b/tools/proto-compiler/Cargo.lock index 6ab82b95b9..4f554bba17 100644 --- a/tools/proto-compiler/Cargo.lock +++ b/tools/proto-compiler/Cargo.lock @@ -474,9 +474,9 @@ dependencies = [ [[package]] name = "ibc-proto" -version = "0.39.1" +version = "0.40.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8a8b1356652b9f160f5a010dd6b084675b8a28e163bf2b41ca5abecf27d9701" +checksum = "4222cfac37f21da28292db0f2673fdb8455284895891ff09979680243efb9a20" dependencies = [ "base64 0.21.4", "bytes", diff --git a/tools/proto-compiler/Cargo.toml b/tools/proto-compiler/Cargo.toml index 753ac0b823..23a587f00b 100644 --- a/tools/proto-compiler/Cargo.toml +++ b/tools/proto-compiler/Cargo.toml @@ -15,5 +15,5 @@ pbjson-types = "0.6" pbjson-build = "0.6" tempfile = "3" -ibc-proto = { version = "0.39.0" } +ibc-proto = { version = "0.40.0" } ics23 = "0.11.0" diff --git a/tools/proto-compiler/src/main.rs b/tools/proto-compiler/src/main.rs index 898d51e47d..540859efde 100644 --- a/tools/proto-compiler/src/main.rs +++ b/tools/proto-compiler/src/main.rs @@ -89,9 +89,10 @@ fn main() -> anyhow::Result<()> { &[ "../../proto/penumbra/penumbra/core/app/v1alpha1/app.proto", "../../proto/penumbra/penumbra/core/asset/v1alpha1/asset.proto", + "../../proto/penumbra/penumbra/core/txhash/v1alpha1/txhash.proto", "../../proto/penumbra/penumbra/core/component/chain/v1alpha1/chain.proto", "../../proto/penumbra/penumbra/core/component/compact_block/v1alpha1/compact_block.proto", - "../../proto/penumbra/penumbra/core/component/dao/v1alpha1/dao.proto", + "../../proto/penumbra/penumbra/core/component/community_pool/v1alpha1/community_pool.proto", "../../proto/penumbra/penumbra/core/component/dex/v1alpha1/dex.proto", "../../proto/penumbra/penumbra/core/component/distributions/v1alpha1/distributions.proto", "../../proto/penumbra/penumbra/core/component/fee/v1alpha1/fee.proto", diff --git a/tools/summonerd/src/main.rs b/tools/summonerd/src/main.rs index 79d246dbff..8bcae11f35 100644 --- a/tools/summonerd/src/main.rs +++ b/tools/summonerd/src/main.rs @@ -301,7 +301,7 @@ impl Opt { "spend", "output", "delegator_vote", - "undelegateclaim", + "convert", "swap", "swapclaim", "nullifier_derivation",