diff --git a/.github/actions/setup-bitcoind/action.yml b/.github/actions/setup-bitcoind/action.yml new file mode 100644 index 0000000000..b27184c503 --- /dev/null +++ b/.github/actions/setup-bitcoind/action.yml @@ -0,0 +1,34 @@ +name: "Setup bitcoind" +description: "Install a pinned Bitcoin Core release for integration tests" +inputs: + version: + description: "Bitcoin Core version to install" + required: false + default: "30.2" + +runs: + using: "composite" + + steps: + - name: install bitcoind ${{ inputs.version }} + shell: bash + run: | + set -euo pipefail + + if command -v bitcoind >/dev/null 2>&1; then + bitcoind --version + exit 0 + fi + + VERSION="${{ inputs.version }}" + ARCHIVE="bitcoin-${VERSION}-x86_64-linux-gnu.tar.gz" + URL="https://bitcoincore.org/bin/bitcoin-core-${VERSION}/${ARCHIVE}" + WORKDIR="$(mktemp -d)" + + curl --fail --location --retry 5 --output "${WORKDIR}/${ARCHIVE}" "${URL}" + tar -C "${WORKDIR}" -xzf "${WORKDIR}/${ARCHIVE}" + + sudo install -m 0755 "${WORKDIR}/bitcoin-${VERSION}/bin/bitcoind" /usr/local/bin/bitcoind + sudo install -m 0755 "${WORKDIR}/bitcoin-${VERSION}/bin/bitcoin-cli" /usr/local/bin/bitcoin-cli + + bitcoind --version diff --git a/.github/workflows/main.yaml b/.github/workflows/main.yaml index 3bf36c1951..9fa80dda2a 100644 --- a/.github/workflows/main.yaml +++ b/.github/workflows/main.yaml @@ -388,6 +388,9 @@ jobs: name: itest-binaries path: itest + - name: Setup bitcoind + uses: ./.github/actions/setup-bitcoind + - name: Initialize environment run: | chmod +x itest/itest.test itest/btcd-itest itest/lnd-itest itest/tapd-itest itest/chantools/chantools @@ -480,6 +483,9 @@ jobs: name: itest-binaries path: itest + - name: Setup bitcoind + uses: ./.github/actions/setup-bitcoind + - name: Initialize environment run: | chmod +x itest/itest.test itest/btcd-itest itest/lnd-itest itest/tapd-itest itest/chantools/chantools @@ -553,6 +559,40 @@ jobs: format: 'golang' parallel: true + integration-test-v3: + name: run v3 anchor itest + runs-on: ubuntu-latest + steps: + - name: git checkout + uses: actions/checkout@v5 + + - name: Setup go ${{ env.GO_VERSION }} + uses: ./.github/actions/setup-go + with: + go-version: '${{ env.GO_VERSION }}' + key-prefix: itest-v3 + + - name: Setup bitcoind + uses: ./.github/actions/setup-bitcoind + + - name: Initialize environment + run: mkdir -p ~/.aperture + + - name: run v3 anchor itest + run: make itest-v3 + + - name: Zip log files on failure + if: ${{ failure() }} + run: 7z a logs-itest-v3.zip itest/regtest/*.log itest/regtest/logs-tranche*/*.log || true + + - name: Upload log files on failure + uses: actions/upload-artifact@v7 + if: ${{ failure() }} + with: + name: logs-itest-v3 + path: logs-itest-v3.zip + retention-days: 5 + # Custom channel integration tests. custom-channels-itest: name: run custom channels itests @@ -572,6 +612,9 @@ jobs: name: itest-binaries path: itest + - name: Setup bitcoind + uses: ./.github/actions/setup-bitcoind + - name: Initialize environment run: | chmod +x itest/tapd-integrated-itest itest/btcd-itest itest/custom_channels/itest-cc.test diff --git a/Makefile b/Makefile index be1d0d5fe3..48beb077e6 100644 --- a/Makefile +++ b/Makefile @@ -280,6 +280,9 @@ itest-cc-parallel: build-itest build-itest-cc-binary clean-cc-itest-logs itest: build-itest itest-only +itest-v3: + $(MAKE) itest backend=bitcoind icase=anchor_tx_version_v3 + itest-trace: build-itest itest-only-trace itest-only: aperture-dir clean-itest-logs diff --git a/asset/group_key_test.go b/asset/group_key_test.go index 671078bad3..9977df1d4d 100644 --- a/asset/group_key_test.go +++ b/asset/group_key_test.go @@ -333,7 +333,7 @@ func TestNonSpendableLeafScript(t *testing.T) { // Finally, we'll make the dummy spend transaction, and // the output script that we'll attempt to spend. - spendTx := wire.NewMsgTx(1) + spendTx := wire.NewMsgTx(3) spendTx.AddTxIn(&wire.TxIn{}) leafScript, err := txscript.PayToTaprootScript( diff --git a/asset/mock.go b/asset/mock.go index 6f1a199ea7..e31a0baf21 100644 --- a/asset/mock.go +++ b/asset/mock.go @@ -313,6 +313,11 @@ func virtualGenesisTx(newAsset *Asset) (*wire.MsgTx, error) { // With our single input and output mapped, we're ready to construct our // virtual transaction. + // + // IMPORTANT: The virtual transaction version must remain at v2 for + // backwards compatibility. Changing the version would invalidate all + // existing asset witness signatures. Only the anchor (real Bitcoin) + // transactions use v3. virtualTx := wire.NewMsgTx(2) virtualTx.AddTxIn(txIn) virtualTx.AddTxOut(txOut) diff --git a/authmailbox/client_test.go b/authmailbox/client_test.go index 5a561b3128..d06a9b3b21 100644 --- a/authmailbox/client_test.go +++ b/authmailbox/client_test.go @@ -9,6 +9,7 @@ import ( "time" "github.com/btcsuite/btclog/v2" + "github.com/lightninglabs/taproot-assets/asset" "github.com/lightninglabs/taproot-assets/fn" "github.com/lightninglabs/taproot-assets/internal/test" "github.com/lightninglabs/taproot-assets/proof" @@ -169,6 +170,32 @@ func TestServerClientAuthAndRestart(t *testing.T) { t.Cleanup(func() { require.NoError(t, multiSub.Stop()) }) + assertMultiSubConnected := func(targetKeys ...keychain.KeyDescriptor) { + t.Helper() + + serverURL := url.URL{Host: clientCfg.ServerAddress} + require.Eventually(t, func() bool { + multiSub.RLock() + defer multiSub.RUnlock() + + client, ok := multiSub.clients[serverURL] + if !ok { + return false + } + + for _, targetKey := range targetKeys { + key := asset.ToSerialized(targetKey.PubKey) + subscription, ok := client.subscriptions[key] + if !ok || !subscription.IsSubscribed() { + return false + } + } + + return true + }, testTimeout, testMinBackoff) + } + assertMultiSubConnected(clientKey1, clientKey2) + msgChan := multiSub.MessageChan() readMultiSub := func(targetID ...uint64) { t.Helper() @@ -221,6 +248,7 @@ func TestServerClientAuthAndRestart(t *testing.T) { harness.Start(t) client1.assertConnected(t) client2.assertConnected(t) + assertMultiSubConnected(clientKey1, clientKey2) // Let's send another message to all clients. msg2 := &Message{ diff --git a/authmailbox/receive_subscription.go b/authmailbox/receive_subscription.go index 204d8dedec..f8eefcf329 100644 --- a/authmailbox/receive_subscription.go +++ b/authmailbox/receive_subscription.go @@ -7,6 +7,7 @@ import ( "io" "math" "sync" + "sync/atomic" "time" "github.com/btcsuite/btclog/v2" @@ -61,6 +62,7 @@ type receiveSubscription struct { serverStream clientStream streamMutex sync.RWMutex streamCancel func() + subscribed atomic.Bool authOkChan chan struct{} msgChan chan<- *ReceivedMessages @@ -198,10 +200,7 @@ func (s *receiveSubscription) wait(backoff time.Duration) error { // IsSubscribed returns true if at least one account is in an active state and // the subscription stream to the server was established successfully. func (s *receiveSubscription) IsSubscribed() bool { - s.streamMutex.RLock() - defer s.streamMutex.RUnlock() - - return s.serverStream != nil + return s.subscribed.Load() } // connectServerStream opens the initial connection to the server for the stream @@ -412,6 +411,8 @@ func (s *receiveSubscription) readIncomingStream(ctx context.Context) { // The server confirms the account subscription. Nothing for us // to do here. case *respTypeAuthSuccess: + s.subscribed.Store(true) + // Inform the subscription about the arrived auth // confirmation. select { @@ -476,6 +477,7 @@ func (s *receiveSubscription) closeStream(ctx context.Context) error { s.streamMutex.Lock() defer s.streamMutex.Unlock() + s.subscribed.Store(false) if s.streamCancel != nil { s.streamCancel() diff --git a/docs/release-notes/release-notes-0.8.0.md b/docs/release-notes/release-notes-0.8.0.md index 65e5e64b61..c17c49c0ec 100644 --- a/docs/release-notes/release-notes-0.8.0.md +++ b/docs/release-notes/release-notes-0.8.0.md @@ -264,6 +264,11 @@ Add pagination support (offset, limit, direction) to the `ListAssets` RPC endpoint. +- [PR#1857](https://github.com/lightninglabs/taproot-assets/pull/1857) + Add RPC support for selecting the version of newly created anchor + transactions in minting, send, and virtual-PSBT anchoring flows while + keeping v2 as the default. + ## tapcli Updates - [PR#1995](https://github.com/lightninglabs/taproot-assets/pull/1995) @@ -308,6 +313,10 @@ ## Testing +- [PR#1857](https://github.com/lightninglabs/taproot-assets/pull/1857) + Add a dedicated bitcoind-backed integration lane that verifies explicit + v3 anchor transactions end to end. + - [Wallet Backup Integration Tests](https://github.com/lightninglabs/taproot-assets/pull/1980): Add two integration tests for wallet backup covering genesis backup/restore, idempotent import, all three backup modes with size comparison, post-restore diff --git a/go.mod b/go.mod index a8890aab49..319aa24fe5 100644 --- a/go.mod +++ b/go.mod @@ -3,19 +3,19 @@ module github.com/lightninglabs/taproot-assets go 1.25.5 require ( - github.com/btcsuite/btcd v0.24.3-0.20250318170759-4f4ea81776d6 + github.com/btcsuite/btcd v0.25.1-0.20260310163610-1c55c7c18179 github.com/btcsuite/btcd/btcec/v2 v2.3.6 - github.com/btcsuite/btcd/btcutil v1.1.5 + github.com/btcsuite/btcd/btcutil v1.1.6 github.com/btcsuite/btcd/btcutil/psbt v1.1.10 github.com/btcsuite/btcd/chaincfg/chainhash v1.1.0 - github.com/btcsuite/btclog v0.0.0-20241003133417-09c4e92e319c + github.com/btcsuite/btclog v1.0.0 github.com/btcsuite/btclog/v2 v2.0.1-0.20250728225537-6090e87c6c5b github.com/btcsuite/btcwallet v0.16.17 github.com/btcsuite/btcwallet/wallet/txsizes v1.2.5 github.com/btcsuite/btcwallet/wtxmgr v1.5.6 github.com/caddyserver/certmagic v0.17.2 github.com/davecgh/go-spew v1.1.1 - github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0 + github.com/decred/dcrd/dcrec/secp256k1/v4 v4.4.0 github.com/dustin/go-humanize v1.0.1 github.com/go-errors/errors v1.0.1 github.com/golang-migrate/migrate/v4 v4.17.0 @@ -24,14 +24,14 @@ require ( github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0 github.com/jackc/pgconn v1.14.3 github.com/jackc/pgerrcode v0.0.0-20240316143900-6e2875d9b438 - github.com/jessevdk/go-flags v1.4.0 + github.com/jessevdk/go-flags v1.6.1 github.com/lib/pq v1.10.9 - github.com/lightninglabs/aperture v0.4.0 + github.com/lightninglabs/aperture v0.3.14-beta github.com/lightninglabs/lightning-node-connect/hashmailrpc v1.0.4-0.20250610182311-2f1d46ef18b7 github.com/lightninglabs/lndclient v0.20.0-6 github.com/lightninglabs/neutrino/cache v1.1.3 - github.com/lightninglabs/taproot-assets/taprpc v1.0.9 - github.com/lightningnetwork/lnd v0.20.0-beta.rc4.0.20260305102707-7c38c1ea0572 + github.com/lightninglabs/taproot-assets/taprpc v0.0.0-00010101000000-000000000000 + github.com/lightningnetwork/lnd v0.20.0-beta.rc4.0.20260323171750-db765a752b63 github.com/lightningnetwork/lnd/cert v1.2.2 github.com/lightningnetwork/lnd/clock v1.1.1 github.com/lightningnetwork/lnd/fn/v2 v2.0.9 @@ -41,16 +41,16 @@ require ( github.com/ory/dockertest/v3 v3.10.0 github.com/pmezard/go-difflib v1.0.0 github.com/prometheus/client_golang v1.14.0 - github.com/stretchr/testify v1.10.0 + github.com/stretchr/testify v1.11.1 github.com/urfave/cli v1.22.14 - golang.org/x/crypto v0.45.0 - golang.org/x/exp v0.0.0-20240325151524-a685a6edb6d8 - golang.org/x/net v0.47.0 - golang.org/x/sync v0.18.0 - golang.org/x/term v0.37.0 + golang.org/x/crypto v0.46.0 + golang.org/x/exp v0.0.0-20250811191247-51f88131bc50 + golang.org/x/net v0.48.0 + golang.org/x/sync v0.19.0 + golang.org/x/term v0.38.0 golang.org/x/time v0.5.0 - google.golang.org/grpc v1.64.1 - google.golang.org/protobuf v1.34.2 + google.golang.org/grpc v1.79.1 + google.golang.org/protobuf v1.36.10 gopkg.in/macaroon-bakery.v2 v2.1.0 gopkg.in/macaroon.v2 v2.1.0 modernc.org/sqlite v1.34.5 @@ -68,6 +68,7 @@ require ( github.com/aead/chacha20 v0.0.0-20180709150244-8b13a72661da // indirect github.com/aead/siphash v1.0.1 // indirect github.com/beorn7/perks v1.0.1 // indirect + github.com/btcsuite/btcd/v2transport v1.0.1 // indirect github.com/btcsuite/btcwallet/wallet/txauthor v1.3.5 // indirect github.com/btcsuite/btcwallet/wallet/txrules v1.2.2 // indirect github.com/btcsuite/btcwallet/walletdb v1.5.1 // indirect @@ -75,14 +76,14 @@ require ( github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792 // indirect github.com/btcsuite/winsvc v1.0.0 // indirect github.com/cenkalti/backoff/v4 v4.2.1 // indirect - github.com/cespare/xxhash/v2 v2.2.0 // indirect + github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/coder/websocket v1.8.13 // indirect github.com/containerd/continuity v0.3.0 // indirect github.com/coreos/go-semver v0.3.0 // indirect github.com/coreos/go-systemd v0.0.0-20191104093116-d3cd4ed1dbcf // indirect github.com/coreos/go-systemd/v22 v22.5.0 // indirect - github.com/cpuguy83/go-md2man/v2 v2.0.2 // indirect - github.com/decred/dcrd/crypto/blake256 v1.0.1 // indirect + github.com/cpuguy83/go-md2man/v2 v2.0.4 // indirect + github.com/decred/dcrd/crypto/blake256 v1.1.0 // indirect github.com/decred/dcrd/lru v1.1.2 // indirect github.com/docker/cli v28.1.1+incompatible // indirect github.com/docker/docker v28.1.1+incompatible // indirect @@ -129,12 +130,13 @@ require ( github.com/lightninglabs/gozmq v0.0.0-20191113021534-d20a764486bf // indirect github.com/lightninglabs/lightning-node-connect/gbn v1.0.2-0.20250610182311-2f1d46ef18b7 // indirect github.com/lightninglabs/lightning-node-connect/mailbox v1.0.2-0.20250610182311-2f1d46ef18b7 // indirect - github.com/lightninglabs/neutrino v0.16.1 // indirect - github.com/lightningnetwork/lightning-onion v1.2.1-0.20240815225420-8b40adf04ab9 // indirect + github.com/lightninglabs/neutrino v0.16.2 // indirect + github.com/lightningnetwork/lightning-onion v1.3.0 // indirect + github.com/lightningnetwork/lnd/actor v0.0.6-0.20260324142747-bee0d598cef8 // indirect github.com/lightningnetwork/lnd/healthcheck v1.2.6 // indirect github.com/lightningnetwork/lnd/kvdb v1.4.16 // indirect github.com/lightningnetwork/lnd/queue v1.1.1 // indirect - github.com/lightningnetwork/lnd/sqldb v1.0.13-0.20260305102707-7c38c1ea0572 // indirect + github.com/lightningnetwork/lnd/sqldb v1.0.13-0.20260324142747-bee0d598cef8 // indirect github.com/ltcsuite/ltcd v0.0.0-20190101042124-f37f8bf35796 // indirect github.com/mattn/go-isatty v0.0.20 // indirect github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 // indirect @@ -178,25 +180,25 @@ require ( go.etcd.io/etcd/pkg/v3 v3.5.12 // indirect go.etcd.io/etcd/raft/v3 v3.5.12 // indirect go.etcd.io/etcd/server/v3 v3.5.12 // indirect - go.opentelemetry.io/auto/sdk v1.1.0 // indirect + go.opentelemetry.io/auto/sdk v1.2.1 // indirect go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.49.0 // indirect - go.opentelemetry.io/otel v1.37.0 // indirect + go.opentelemetry.io/otel v1.39.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.29.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.20.0 // indirect - go.opentelemetry.io/otel/metric v1.37.0 // indirect - go.opentelemetry.io/otel/sdk v1.37.0 // indirect - go.opentelemetry.io/otel/trace v1.37.0 // indirect + go.opentelemetry.io/otel/metric v1.39.0 // indirect + go.opentelemetry.io/otel/sdk v1.39.0 // indirect + go.opentelemetry.io/otel/trace v1.39.0 // indirect go.opentelemetry.io/proto/otlp v1.3.1 // indirect go.uber.org/atomic v1.10.0 // indirect go.uber.org/multierr v1.6.0 // indirect go.uber.org/zap v1.23.0 // indirect - golang.org/x/mod v0.29.0 // indirect - golang.org/x/sys v0.38.0 // indirect - golang.org/x/text v0.31.0 // indirect - golang.org/x/tools v0.38.0 // indirect + golang.org/x/mod v0.30.0 // indirect + golang.org/x/sys v0.39.0 // indirect + golang.org/x/text v0.32.0 // indirect + golang.org/x/tools v0.39.0 // indirect google.golang.org/genproto v0.0.0-20240213162025-012b6fc9bca9 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20240513163218-0867130af1f8 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240513163218-0867130af1f8 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20251202230838-ff82c1b0f217 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20251202230838-ff82c1b0f217 // indirect gopkg.in/errgo.v1 v1.0.1 // indirect gopkg.in/natefinch/lumberjack.v2 v2.0.0 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect @@ -215,6 +217,9 @@ replace google.golang.org/protobuf => github.com/lightninglabs/protobuf-go-hex-d // did not yet make it into the upstream repository. replace github.com/golang-migrate/migrate/v4 => github.com/lightninglabs/migrate/v4 v4.18.2-9023d66a-fork-pr-2.0.20251211093704-71c1eef09789 +// Keep btcwallet aligned with the lnd master snapshot we depend on. +replace github.com/btcsuite/btcwallet => github.com/btcsuite/btcwallet v0.16.17-0.20260213031108-70a94ea39e9c + // Note this is a temproary replace and will be removed when taprpc is tagged. replace github.com/lightninglabs/taproot-assets/taprpc => ./taprpc diff --git a/go.sum b/go.sum index b0e6fbf147..89c6928e6c 100644 --- a/go.sum +++ b/go.sum @@ -641,30 +641,34 @@ github.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl github.com/btcsuite/btcd v0.20.1-beta/go.mod h1:wVuoA8VJLEcwgqHBwHmzLRazpKxTv13Px/pDuV7OomQ= github.com/btcsuite/btcd v0.22.0-beta.0.20220111032746-97732e52810c/go.mod h1:tjmYdS6MLJ5/s0Fj4DbLgSbDHbEqLJrtnHecBFkdz5M= github.com/btcsuite/btcd v0.23.5-0.20231215221805-96c9fd8078fd/go.mod h1:nm3Bko6zh6bWP60UxwoT5LzdGJsQJaPo6HjduXq9p6A= -github.com/btcsuite/btcd v0.24.3-0.20250318170759-4f4ea81776d6 h1:8n9k3I7e8DkpdQ5YAP4j8ly/LSsbe6qX9vmVbrUGvVw= -github.com/btcsuite/btcd v0.24.3-0.20250318170759-4f4ea81776d6/go.mod h1:OmM4kFtB0klaG/ZqT86rQiyw/1iyXlJgc3UHClPhhbs= +github.com/btcsuite/btcd v0.24.2/go.mod h1:5C8ChTkl5ejr3WHj8tkQSCmydiMEPB0ZhQhehpq7Dgg= +github.com/btcsuite/btcd v0.25.1-0.20260310163610-1c55c7c18179 h1:yJOTxkbxxtuSFrErMqYRvqZLfWggHssioBiWebkV9yo= +github.com/btcsuite/btcd v0.25.1-0.20260310163610-1c55c7c18179/go.mod h1:qbPE+pEiR9643E1s1xu57awsRhlCIm1ZIi6FfeRA4KE= github.com/btcsuite/btcd/btcec/v2 v2.1.0/go.mod h1:2VzYrv4Gm4apmbVVsSq5bqf1Ec8v56E48Vt0Y/umPgA= github.com/btcsuite/btcd/btcec/v2 v2.1.3/go.mod h1:ctjw4H1kknNJmRN4iP1R7bTQ+v3GJkZBd6mui8ZsAZE= github.com/btcsuite/btcd/btcec/v2 v2.3.6 h1:IzlsEr9olcSRKB/n7c4351F3xHKxS2lma+1UFGCYd4E= github.com/btcsuite/btcd/btcec/v2 v2.3.6/go.mod h1:m22FrOAiuxl/tht9wIqAoGHcbnCCaPWyauO8y2LGGtQ= github.com/btcsuite/btcd/btcutil v1.0.0/go.mod h1:Uoxwv0pqYWhD//tfTiipkxNfdhG9UrLwaeswfjfdF0A= github.com/btcsuite/btcd/btcutil v1.1.0/go.mod h1:5OapHB7A2hBBWLm48mmw4MOHNJCcUBTwmWH/0Jn8VHE= -github.com/btcsuite/btcd/btcutil v1.1.5 h1:+wER79R5670vs/ZusMTF1yTcRYE5GUsFbdjdisflzM8= github.com/btcsuite/btcd/btcutil v1.1.5/go.mod h1:PSZZ4UitpLBWzxGd5VGOrLnmOjtPP/a6HaFo12zMs00= +github.com/btcsuite/btcd/btcutil v1.1.6 h1:zFL2+c3Lb9gEgqKNzowKUPQNb8jV7v5Oaodi/AYFd6c= +github.com/btcsuite/btcd/btcutil v1.1.6/go.mod h1:9dFymx8HpuLqBnsPELrImQeTQfKBQqzqGbbV3jK55aE= github.com/btcsuite/btcd/btcutil/psbt v1.1.10 h1:TC1zhxhFfhnGqoPjsrlEpoqzh+9TPOHrCgnPR47Mj9I= github.com/btcsuite/btcd/btcutil/psbt v1.1.10/go.mod h1:ehBEvU91lxSlXtA+zZz3iFYx7Yq9eqnKx4/kSrnsvMY= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.0/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= github.com/btcsuite/btcd/chaincfg/chainhash v1.1.0 h1:59Kx4K6lzOW5w6nFlA0v5+lk/6sjybR934QNHSJZPTQ= github.com/btcsuite/btcd/chaincfg/chainhash v1.1.0/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= +github.com/btcsuite/btcd/v2transport v1.0.1 h1:pIyyyBCPwd087K3Wdb/9tIvUubAQdzTJghjPgzTQVsE= +github.com/btcsuite/btcd/v2transport v1.0.1/go.mod h1:N6H0HGSElVVJKntzaYHYVbW71DtWDLMw2yhwVRO3ZOE= github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f/go.mod h1:TdznJufoqS23FtqVCzL0ZqgP5MqXbb4fg/WgDys70nA= -github.com/btcsuite/btclog v0.0.0-20241003133417-09c4e92e319c h1:4HxD1lBUGUddhzgaNgrCPsFWd7cGYNpeFUgd9ZIgyM0= -github.com/btcsuite/btclog v0.0.0-20241003133417-09c4e92e319c/go.mod h1:w7xnGOhwT3lmrS4H3b/D1XAXxvh+tbhUm8xeHN2y3TQ= +github.com/btcsuite/btclog v1.0.0 h1:sEkpKJMmfGiyZjADwEIgB1NSwMyfdD1FB8v6+w1T0Ns= +github.com/btcsuite/btclog v1.0.0/go.mod h1:w7xnGOhwT3lmrS4H3b/D1XAXxvh+tbhUm8xeHN2y3TQ= github.com/btcsuite/btclog/v2 v2.0.1-0.20250728225537-6090e87c6c5b h1:MQ+Q6sDy37V1wP1Yu79A5KqJutolqUGwA99UZWQDWZM= github.com/btcsuite/btclog/v2 v2.0.1-0.20250728225537-6090e87c6c5b/go.mod h1:XItGUfVOxotJL8kkuk2Hj3EVow5KCugXl3wWfQ6K0AE= github.com/btcsuite/btcutil v0.0.0-20190425235716-9e5f4b9a998d/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg= -github.com/btcsuite/btcwallet v0.16.17 h1:1N6lHznRdcjDopBvcofxaIHknArkJ/EcVKgLKfGL4Dg= -github.com/btcsuite/btcwallet v0.16.17/go.mod h1:YO+W745BAH8n/Rpgj68QsLR6eLlgM4W2do4RejT0buo= +github.com/btcsuite/btcwallet v0.16.17-0.20260213031108-70a94ea39e9c h1:XJN7vcvFiclslw5Zixe9t4YRprTpADcQlBf2IN3nbW8= +github.com/btcsuite/btcwallet v0.16.17-0.20260213031108-70a94ea39e9c/go.mod h1:4TTru0cgIPbCZpY4aRfAVwX87zrQw4GXM8MH6+A5xZw= github.com/btcsuite/btcwallet/wallet/txauthor v1.3.5 h1:Rr0njWI3r341nhSPesKQ2JF+ugDSzdPoeckS75SeDZk= github.com/btcsuite/btcwallet/wallet/txauthor v1.3.5/go.mod h1:+tXJ3Ym0nlQc/iHSwW1qzjmPs3ev+UVWMbGgfV1OZqU= github.com/btcsuite/btcwallet/wallet/txrules v1.2.2 h1:YEO+Lx1ZJJAtdRrjuhXjWrYsmAk26wLTlNzxt2q0lhk= @@ -695,8 +699,9 @@ github.com/census-instrumentation/opencensus-proto v0.3.0/go.mod h1:f6KPmirojxKA github.com/census-instrumentation/opencensus-proto v0.4.1/go.mod h1:4T9NM4+4Vw91VeyqjLS6ao50K5bOcLKN6Q42XnYaRYw= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= @@ -730,8 +735,9 @@ github.com/coreos/go-systemd v0.0.0-20191104093116-d3cd4ed1dbcf h1:iW4rZ826su+pq github.com/coreos/go-systemd v0.0.0-20191104093116-d3cd4ed1dbcf/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd/v22 v22.5.0 h1:RrqgGjYQKalulkV8NGVIfkXQf6YYmOyiJKk8iXXhfZs= github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= -github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w= github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/cpuguy83/go-md2man/v2 v2.0.4 h1:wfIWP927BUkWJb2NmU/kNDYIBTh/ziUX91+lVfRxZq4= +github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/creack/pty v1.1.18 h1:n56/Zwd5o6whRC5PMGretI4IdRLlmBXYNjScPaBgsbY= @@ -741,11 +747,11 @@ github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc= -github.com/decred/dcrd/crypto/blake256 v1.0.1 h1:7PltbUIQB7u/FfZ39+DGa/ShuMyJ5ilcvdfma9wOH6Y= -github.com/decred/dcrd/crypto/blake256 v1.0.1/go.mod h1:2OfgNZ5wDpcsFmHmCK5gZTPcCXqlm2ArzUIkw9czNJo= +github.com/decred/dcrd/crypto/blake256 v1.1.0 h1:zPMNGQCm0g4QTY27fOCorQW7EryeQ/U0x++OzVrdms8= +github.com/decred/dcrd/crypto/blake256 v1.1.0/go.mod h1:2OfgNZ5wDpcsFmHmCK5gZTPcCXqlm2ArzUIkw9czNJo= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1/go.mod h1:hyedUtir6IdtD/7lIxGeCxkaw7y45JueMRL4DIyJDKs= -github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0 h1:rpfIENRNNilwHwZeG5+P150SMrnNEcHYvcCuK6dPZSg= -github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0/go.mod h1:v57UDF4pDQJcEfFUCRop3lJL149eHGSe9Jvczhzjo/0= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.4.0 h1:NMZiJj8QnKe1LgsbDayM4UoHwbvwDRwnI3hwNaAHRnc= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.4.0/go.mod h1:ZXNYxsqcloTdSy/rNShjYzMhyjf0LaoftYK0p+A3h40= github.com/decred/dcrd/lru v1.0.0/go.mod h1:mxKOwFd7lFjN2GZYsiz/ecgqR6kkYAl+0pz0tEMk218= github.com/decred/dcrd/lru v1.1.2 h1:KdCzlkxppuoIDGEvCGah1fZRicrDH36IipvlB1ROkFY= github.com/decred/dcrd/lru v1.1.2/go.mod h1:gEdCVgXs1/YoBvFWt7Scgknbhwik3FgVSzlnCcXL2N8= @@ -1030,8 +1036,9 @@ github.com/jackpal/gateway v1.0.5/go.mod h1:lTpwd4ACLXmpyiCTRtfiNyVnUmqT9RivzCDQ github.com/jackpal/go-nat-pmp v0.0.0-20170405195558-28a68d0c24ad h1:heFfj7z0pGsNCekUlsFhO2jstxO4b5iQ665LjwM5mDc= github.com/jackpal/go-nat-pmp v0.0.0-20170405195558-28a68d0c24ad/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= -github.com/jessevdk/go-flags v1.4.0 h1:4IU2WS7AumrZ/40jfhf4QVDMsQwqA7VEHozFRrGARJA= github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= +github.com/jessevdk/go-flags v1.6.1 h1:Cvu5U8UGrLay1rZfv/zP7iLpSHGUZ/Ou68T0iX1bBK4= +github.com/jessevdk/go-flags v1.6.1/go.mod h1:Mk8T1hIAWpOiJiHa9rJASDK2UGWji0EuPGBnNLMooyc= github.com/jonboulle/clockwork v0.2.2 h1:UOGuzwb1PwsrDAObMuhUnj0p5ULPj8V/xJ7Kx9qUBdQ= github.com/jonboulle/clockwork v0.2.2/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8= github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= @@ -1092,8 +1099,8 @@ github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/libdns/libdns v0.2.1 h1:Wu59T7wSHRgtA0cfxC+n1c/e+O3upJGWytknkmFEDis= github.com/libdns/libdns v0.2.1/go.mod h1:yQCXzk1lEZmmCPa857bnk4TsOiqYasqpyOEeSObbb40= -github.com/lightninglabs/aperture v0.4.0 h1:GxI7vypu8srbbGHiDgM2M/vSE8xj0LZzj3ASLC6crXY= -github.com/lightninglabs/aperture v0.4.0/go.mod h1:cQY0FwDqm6oBILlXWJC8toJssaH9F1qXVwghqSesyJI= +github.com/lightninglabs/aperture v0.3.14-beta h1:Qs4vozQO6i9bcB6sncFRr1hcitwK2OsrDCfeOsoWH1w= +github.com/lightninglabs/aperture v0.3.14-beta/go.mod h1:QWBweJKRn8C5GJ+SmsTygr3lIZWYODLZ9n57wuWvw8I= github.com/lightninglabs/gozmq v0.0.0-20191113021534-d20a764486bf h1:HZKvJUHlcXI/f/O0Avg7t8sqkPo78HFzjmeYFl6DPnc= github.com/lightninglabs/gozmq v0.0.0-20191113021534-d20a764486bf/go.mod h1:vxmQPeIQxPf6Jf9rM8R+B4rKBqLA2AjttNxkFBL2Plk= github.com/lightninglabs/lightning-node-connect/gbn v1.0.2-0.20250610182311-2f1d46ef18b7 h1:OGfvIx/ILY41IwaXkevUsgu/AyqW0IoHBLP3Qx/5Djc= @@ -1106,16 +1113,18 @@ github.com/lightninglabs/lndclient v0.20.0-6 h1:sh23eZkOpHxe39c4QRYwhsM7qbnJlS++ github.com/lightninglabs/lndclient v0.20.0-6/go.mod h1:gBtIFPGmC2xIspGIv/G5+HiPSGJsFD8uIow7Oke1HFI= github.com/lightninglabs/migrate/v4 v4.18.2-9023d66a-fork-pr-2.0.20251211093704-71c1eef09789 h1:7kX7vUgHUazAHcCJ6uzBDa4/2MEGEbMEfa01GtfqmTQ= github.com/lightninglabs/migrate/v4 v4.18.2-9023d66a-fork-pr-2.0.20251211093704-71c1eef09789/go.mod h1:99BKpIi6ruaaXRM1A77eqZ+FWPQ3cfRa+ZVy5bmWMaY= -github.com/lightninglabs/neutrino v0.16.1 h1:5Kz4ToxncEVkpKC6fwUjXKtFKJhuxlG3sBB3MdJTJjs= -github.com/lightninglabs/neutrino v0.16.1/go.mod h1:L+5UAccpUdyM7yDgmQySgixf7xmwBgJtOfs/IP26jCs= +github.com/lightninglabs/neutrino v0.16.2 h1:jHMMDLPX8asfwgN0/C4BY8uVaYupFzZYuWQkX8Go3fk= +github.com/lightninglabs/neutrino v0.16.2/go.mod h1:fNjnbuSPw4lRsVAzvjC1JG7IE7rqae/mbek2tNkN/Dw= github.com/lightninglabs/neutrino/cache v1.1.3 h1:rgnabC41W+XaPuBTQrdeFjFCCAVKh1yctAgmb3Se9zA= github.com/lightninglabs/neutrino/cache v1.1.3/go.mod h1:qxkJb+pUxR5p84jl5uIGFCR4dGdFkhNUwMSxw3EUWls= github.com/lightninglabs/protobuf-go-hex-display v1.34.2-hex-display h1:w7FM5LH9Z6CpKxl13mS48idsu6F+cEZf0lkyiV+Dq9g= github.com/lightninglabs/protobuf-go-hex-display v1.34.2-hex-display/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw= -github.com/lightningnetwork/lightning-onion v1.2.1-0.20240815225420-8b40adf04ab9 h1:6D3LrdagJweLLdFm1JNodZsBk6iU4TTsBBFLQ4yiXfI= -github.com/lightningnetwork/lightning-onion v1.2.1-0.20240815225420-8b40adf04ab9/go.mod h1:EDqJ3MuZIbMq0QI1czTIKDJ/GS8S14RXPwapHw8cw6w= -github.com/lightningnetwork/lnd v0.20.0-beta.rc4.0.20260305102707-7c38c1ea0572 h1:peXc+YcS6Ufa4rVSMj+kCiBSUw0YTizKrbgQdCL87eo= -github.com/lightningnetwork/lnd v0.20.0-beta.rc4.0.20260305102707-7c38c1ea0572/go.mod h1:fpkIKYZQaqvW3uEIqk5D97V0s84H5xeduhxYlSq9HmE= +github.com/lightningnetwork/lightning-onion v1.3.0 h1:FqILgHjD6euc/Muo1VOzZ4+XDPuFnw6EYROBq0rR/5c= +github.com/lightningnetwork/lightning-onion v1.3.0/go.mod h1:nP85zMHG7c0si/eHBbSQpuDCtnIXfSvFrK3tW6YWzmU= +github.com/lightningnetwork/lnd v0.20.0-beta.rc4.0.20260323171750-db765a752b63 h1:fXGJgxRqUAUOcTH7OVlyB0B8FtczvfhPlUjObaPQtbs= +github.com/lightningnetwork/lnd v0.20.0-beta.rc4.0.20260323171750-db765a752b63/go.mod h1:0HIHJE5fzmzMyigayvQnc/BU1TUq1aK4oixcrOkdAOY= +github.com/lightningnetwork/lnd/actor v0.0.6-0.20260324142747-bee0d598cef8 h1:82JaKxDt+pj3PGXwU1vHz5a3Yf6EU9EOAKl+WXacHcU= +github.com/lightningnetwork/lnd/actor v0.0.6-0.20260324142747-bee0d598cef8/go.mod h1:RqB1iHhxJuCpyvByIKzKFUNGLzUiGzuzyCpzhvcJEfI= github.com/lightningnetwork/lnd/cert v1.2.2 h1:71YK6hogeJtxSxw2teq3eGeuy4rHGKcFf0d0Uy4qBjI= github.com/lightningnetwork/lnd/cert v1.2.2/go.mod h1:jQmFn/Ez4zhDgq2hnYSw8r35bqGVxViXhX6Cd7HXM6U= github.com/lightningnetwork/lnd/clock v1.1.1 h1:OfR3/zcJd2RhH0RU+zX/77c0ZiOnIMsDIBjgjWdZgA0= @@ -1128,8 +1137,8 @@ github.com/lightningnetwork/lnd/kvdb v1.4.16 h1:9BZgWdDfjmHRHLS97cz39bVuBAqMc4/p github.com/lightningnetwork/lnd/kvdb v1.4.16/go.mod h1:HW+bvwkxNaopkz3oIgBV6NEnV4jCEZCACFUcNg4xSjM= github.com/lightningnetwork/lnd/queue v1.1.1 h1:99ovBlpM9B0FRCGYJo6RSFDlt8/vOkQQZznVb18iNMI= github.com/lightningnetwork/lnd/queue v1.1.1/go.mod h1:7A6nC1Qrm32FHuhx/mi1cieAiBZo5O6l8IBIoQxvkz4= -github.com/lightningnetwork/lnd/sqldb v1.0.13-0.20260305102707-7c38c1ea0572 h1:oZG5q1sIhtRN9XcvbGhrb6GTj1y0uB49swjfNO5L0sE= -github.com/lightningnetwork/lnd/sqldb v1.0.13-0.20260305102707-7c38c1ea0572/go.mod h1:XaG3d8AR7/e6+HUw5jvNvm+gs6MowB+iE9myFH8Rc14= +github.com/lightningnetwork/lnd/sqldb v1.0.13-0.20260324142747-bee0d598cef8 h1:fqpWVuOw4Lg+aJ8LO8bZnNTeGITv1/OUdWn4UEm1m+s= +github.com/lightningnetwork/lnd/sqldb v1.0.13-0.20260324142747-bee0d598cef8/go.mod h1:XaG3d8AR7/e6+HUw5jvNvm+gs6MowB+iE9myFH8Rc14= github.com/lightningnetwork/lnd/ticker v1.1.1 h1:J/b6N2hibFtC7JLV77ULQp++QLtCwT6ijJlbdiZFbSM= github.com/lightningnetwork/lnd/ticker v1.1.1/go.mod h1:waPTRAAcwtu7Ji3+3k+u/xH5GHovTsCoSVpho0KDvdA= github.com/lightningnetwork/lnd/tlv v1.3.2 h1:MO4FCk7F4k5xPMqVZF6Nb/kOpxlwPrUQpYjmyKny5s0= @@ -1238,8 +1247,8 @@ github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6L github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= -github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= -github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= +github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= +github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= github.com/rs/zerolog v1.13.0/go.mod h1:YbFCdg8HfsridGWAh22vktObvhZbQsZXe4/zB0OKkWU= github.com/rs/zerolog v1.15.0/go.mod h1:xYTKnLHcpfU2225ny5qZjxnj9NvkumZYjJHlAThCjNc= @@ -1283,8 +1292,8 @@ github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= -github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 h1:epCh84lMvA70Z7CTTCmYQn2CKbY8j86K7/FAIr141uY= github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7/go.mod h1:q4W45IWZaF22tdD+VEXcAWRA037jwmWEB5VWYORlTpc= github.com/tmc/grpc-websocket-proxy v0.0.0-20201229170055-e5319fda7802 h1:uruHq4dN7GR16kFc5fp3d1RIYzJW5onx8Ybykw2YQFA= @@ -1339,24 +1348,26 @@ go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= -go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= -go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= +go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64= +go.opentelemetry.io/auto/sdk v1.2.1/go.mod h1:KRTj+aOaElaLi+wW1kO/DZRXwkF4C5xPbEe3ZiIhN7Y= go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.49.0 h1:4Pp6oUg3+e/6M4C0A/3kJ2VYa++dsWVTtGgLVj5xtHg= go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.49.0/go.mod h1:Mjt1i1INqiaoZOMGR1RIUJN+i3ChKoFRqzrRQhlkbs0= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.60.0 h1:sbiXRNDSWJOTobXh5HyQKjq6wUC5tNybqjIqDpAY4CU= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.60.0/go.mod h1:69uWxva0WgAA/4bu2Yy70SLDBwZXuQ6PbBpbsa5iZrQ= -go.opentelemetry.io/otel v1.37.0 h1:9zhNfelUvx0KBfu/gb+ZgeAfAgtWrfHJZcAqFC228wQ= -go.opentelemetry.io/otel v1.37.0/go.mod h1:ehE/umFRLnuLa/vSccNq9oS1ErUlkkK71gMcN34UG8I= +go.opentelemetry.io/otel v1.39.0 h1:8yPrr/S0ND9QEfTfdP9V+SiwT4E0G7Y5MO7p85nis48= +go.opentelemetry.io/otel v1.39.0/go.mod h1:kLlFTywNWrFyEdH0oj2xK0bFYZtHRYUdv1NklR/tgc8= go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.29.0 h1:dIIDULZJpgdiHz5tXrTgKIMLkus6jEFa7x5SOKcyR7E= go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.29.0/go.mod h1:jlRVBe7+Z1wyxFSUs48L6OBQZ5JwH2Hg/Vbl+t9rAgI= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.20.0 h1:gvmNvqrPYovvyRmCSygkUDyL8lC5Tl845MLEwqpxhEU= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.20.0/go.mod h1:vNUq47TGFioo+ffTSnKNdob241vePmtNZnAODKapKd0= -go.opentelemetry.io/otel/metric v1.37.0 h1:mvwbQS5m0tbmqML4NqK+e3aDiO02vsf/WgbsdpcPoZE= -go.opentelemetry.io/otel/metric v1.37.0/go.mod h1:04wGrZurHYKOc+RKeye86GwKiTb9FKm1WHtO+4EVr2E= -go.opentelemetry.io/otel/sdk v1.37.0 h1:ItB0QUqnjesGRvNcmAcU0LyvkVyGJ2xftD29bWdDvKI= -go.opentelemetry.io/otel/sdk v1.37.0/go.mod h1:VredYzxUvuo2q3WRcDnKDjbdvmO0sCzOvVAiY+yUkAg= -go.opentelemetry.io/otel/trace v1.37.0 h1:HLdcFNbRQBE2imdSEgm/kwqmQj1Or1l/7bW6mxVK7z4= -go.opentelemetry.io/otel/trace v1.37.0/go.mod h1:TlgrlQ+PtQO5XFerSPUYG0JSgGyryXewPGyayAWSBS0= +go.opentelemetry.io/otel/metric v1.39.0 h1:d1UzonvEZriVfpNKEVmHXbdf909uGTOQjA0HF0Ls5Q0= +go.opentelemetry.io/otel/metric v1.39.0/go.mod h1:jrZSWL33sD7bBxg1xjrqyDjnuzTUB0x1nBERXd7Ftcs= +go.opentelemetry.io/otel/sdk v1.39.0 h1:nMLYcjVsvdui1B/4FRkwjzoRVsMK8uL/cj0OyhKzt18= +go.opentelemetry.io/otel/sdk v1.39.0/go.mod h1:vDojkC4/jsTJsE+kh+LXYQlbL8CgrEcwmt1ENZszdJE= +go.opentelemetry.io/otel/sdk/metric v1.39.0 h1:cXMVVFVgsIf2YL6QkRF4Urbr/aMInf+2WKg+sEJTtB8= +go.opentelemetry.io/otel/sdk/metric v1.39.0/go.mod h1:xq9HEVH7qeX69/JnwEfp6fVq5wosJsY1mt4lLfYdVew= +go.opentelemetry.io/otel/trace v1.39.0 h1:2d2vfpEDmCJ5zVYz7ijaJdOF59xLomrvj7bjt6/qCJI= +go.opentelemetry.io/otel/trace v1.39.0/go.mod h1:88w4/PnZSazkGzz/w84VHpQafiU4EtqqlVdxWy+rNOA= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= go.opentelemetry.io/proto/otlp v0.15.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= go.opentelemetry.io/proto/otlp v0.19.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= @@ -1403,8 +1414,8 @@ golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5y golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= golang.org/x/crypto v0.20.0/go.mod h1:Xwo95rrVNIoSMx9wa1JroENMToLWn3RNVrTBpLHgZPQ= -golang.org/x/crypto v0.45.0 h1:jMBrvKuj23MTlT0bQEOBcAE0mjg8mK9RXFhRH6nyF3Q= -golang.org/x/crypto v0.45.0/go.mod h1:XTGrrkGJve7CYK7J8PEww4aY7gM3qMCElcJQ8n8JdX4= +golang.org/x/crypto v0.46.0 h1:cKRW/pmt1pKAfetfu+RCEvjvZkA9RimPbh7bhFjGVBU= +golang.org/x/crypto v0.46.0/go.mod h1:Evb/oLKmMraqjZ2iQTwDwvCtJkczlDuTmdJXoZVzqU0= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -1420,8 +1431,8 @@ golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u0 golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= golang.org/x/exp v0.0.0-20220827204233-334a2380cb91/go.mod h1:cyybsKvd6eL0RnXn6p/Grxp8F5bW7iYuBgsNCOHpMYE= -golang.org/x/exp v0.0.0-20240325151524-a685a6edb6d8 h1:aAcj0Da7eBAtrTp03QXWvm88pSyOt+UgdZw2BFZ+lEw= -golang.org/x/exp v0.0.0-20240325151524-a685a6edb6d8/go.mod h1:CQ1k9gNrJ50XIzaKCRR2hssIjF07kZFEiieALBM/ARQ= +golang.org/x/exp v0.0.0-20250811191247-51f88131bc50 h1:3yiSh9fhy5/RhCSntf4Sy0Tnx50DmMpQ4MQdKKk4yg4= +golang.org/x/exp v0.0.0-20250811191247-51f88131bc50/go.mod h1:rT6SFzZ7oxADUDx58pcaKFTcZ+inxAa9fTrYx/uVYwg= golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= @@ -1464,8 +1475,8 @@ golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91 golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.9.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.29.0 h1:HV8lRxZC4l2cr3Zq1LvtOsi/ThTgWnUk/y64QSs8GwA= -golang.org/x/mod v0.29.0/go.mod h1:NyhrlYXJ2H4eJiRy/WDBO6HMqZQ6q9nk4JzS3NuCK+w= +golang.org/x/mod v0.30.0 h1:fDEXFVZ/fmCKProc/yAXXUijritrDzahmwwefnjoPFk= +golang.org/x/mod v0.30.0/go.mod h1:lAsf5O2EvJeSFMiBxXDki7sCgAxEUcZHXoXMKT4GJKc= golang.org/x/net v0.0.0-20180719180050-a680a1efc54d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -1535,8 +1546,8 @@ golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= -golang.org/x/net v0.47.0 h1:Mx+4dIFzqraBXUugkia1OOvlD6LemFo1ALMHjrXDOhY= -golang.org/x/net v0.47.0/go.mod h1:/jNxtkgq5yWUGYkaZGqo27cfGZ1c5Nen03aYrrKpVRU= +golang.org/x/net v0.48.0 h1:zyQRTTrjc33Lhh0fBgT/H3oZq9WuvRR5gPC70xpDiQU= +golang.org/x/net v0.48.0/go.mod h1:+ndRgGjkh8FGtu1w1FGbEC31if4VrNVMuKTgcAAnQRY= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -1583,8 +1594,8 @@ golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20220819030929-7fc1605a5dde/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220929204114-8fcdb60fdcc0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.18.0 h1:kr88TuHDroi+UVf+0hZnirlk8o8T+4MrK6mr60WkH/I= -golang.org/x/sync v0.18.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= +golang.org/x/sync v0.19.0 h1:vV+1eWNmZ5geRlYjzm2adRgW2/mcpevXNg50YZtPCE4= +golang.org/x/sync v0.19.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -1683,8 +1694,8 @@ golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.38.0 h1:3yZWxaJjBmCWXqhN1qh02AkOnCQ1poK6oF+a7xWL6Gc= -golang.org/x/sys v0.38.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/sys v0.39.0 h1:CvCKL8MeisomCi6qNZ+wbb0DN9E5AATixKsvNtMoMFk= +golang.org/x/sys v0.39.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= @@ -1696,8 +1707,8 @@ golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY= golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= -golang.org/x/term v0.37.0 h1:8EGAD0qCmHYZg6J17DvsMy9/wJ7/D/4pV/wfnld5lTU= -golang.org/x/term v0.37.0/go.mod h1:5pB4lxRNYYVZuTLmy8oR2BH8dflOR+IbTYFD8fi3254= +golang.org/x/term v0.38.0 h1:PQ5pkm/rLO6HnxFR7N2lJHOZX6Kez5Y1gDSJla6jo7Q= +golang.org/x/term v0.38.0/go.mod h1:bSEAKrOT1W+VSu9TSCMtoGEOUcKxOKgl3LE5QEF/xVg= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -1715,8 +1726,8 @@ golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/text v0.31.0 h1:aC8ghyu4JhP8VojJ2lEHBnochRno1sgL6nEi9WGFGMM= -golang.org/x/text v0.31.0/go.mod h1:tKRAlv61yKIjGGHX/4tP1LTbc13YSec1pxVEWXzfoeM= +golang.org/x/text v0.32.0 h1:ZD01bjUt1FQ9WJ0ClOL5vxgxOI/sVCNgX1YtKwcY0mU= +golang.org/x/text v0.32.0/go.mod h1:o/rUWzghvpD5TXrTIBuJU77MTaN0ljMWE47kxGJQ7jY= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -1795,8 +1806,8 @@ golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc golang.org/x/tools v0.3.0/go.mod h1:/rWhSS2+zyEVwoJf8YAX6L2f0ntZ7Kn/mGgAWcipA5k= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/tools v0.7.0/go.mod h1:4pg6aUX35JBAogB10C9AtvVL+qowtN4pT3CGSQex14s= -golang.org/x/tools v0.38.0 h1:Hx2Xv8hISq8Lm16jvBZ2VQf+RLmbd7wVUsALibYI/IQ= -golang.org/x/tools v0.38.0/go.mod h1:yEsQ/d/YK8cjh0L6rZlY8tgtlKiBNTL14pGDJPJpYQs= +golang.org/x/tools v0.39.0 h1:ik4ho21kwuQln40uelmciQPp9SipgNDdrafrYA4TmQQ= +golang.org/x/tools v0.39.0/go.mod h1:JnefbkDPyD8UU2kI5fuf8ZX4/yUeh9W877ZeBONxUqQ= golang.org/x/xerrors v0.0.0-20190410155217-1f06c39b4373/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20190513163551-3ee3066db522/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -1811,6 +1822,8 @@ gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJ gonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0= gonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0= gonum.org/v1/gonum v0.11.0/go.mod h1:fSG4YDCxxUZQJ7rKsQrj0gMOg00Il0Z96/qMA4bVQhA= +gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= +gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= gonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc= gonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY= @@ -2016,10 +2029,10 @@ google.golang.org/genproto v0.0.0-20230331144136-dcfb400f0633/go.mod h1:UUQDJDOl google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1/go.mod h1:nKE/iIaLqn2bQwXBg8f1g2Ylh6r5MN5CmZvuzZCgsCU= google.golang.org/genproto v0.0.0-20240213162025-012b6fc9bca9 h1:9+tzLLstTlPTRyJTh+ah5wIMsBW5c4tQwGTN3thOW9Y= google.golang.org/genproto v0.0.0-20240213162025-012b6fc9bca9/go.mod h1:mqHbVIp48Muh7Ywss/AD6I5kNVKZMmAa/QEW58Gxp2s= -google.golang.org/genproto/googleapis/api v0.0.0-20240513163218-0867130af1f8 h1:W5Xj/70xIA4x60O/IFyXivR5MGqblAb8R3w26pnD6No= -google.golang.org/genproto/googleapis/api v0.0.0-20240513163218-0867130af1f8/go.mod h1:vPrPUTsDCYxXWjP7clS81mZ6/803D8K4iM9Ma27VKas= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240513163218-0867130af1f8 h1:mxSlqyb8ZAHsYDCfiXN1EDdNTdvjUJSLY+OnAUtYNYA= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240513163218-0867130af1f8/go.mod h1:I7Y+G38R2bu5j1aLzfFmQfTcU/WnFuqDwLZAbvKTKpM= +google.golang.org/genproto/googleapis/api v0.0.0-20251202230838-ff82c1b0f217 h1:fCvbg86sFXwdrl5LgVcTEvNC+2txB5mgROGmRL5mrls= +google.golang.org/genproto/googleapis/api v0.0.0-20251202230838-ff82c1b0f217/go.mod h1:+rXWjjaukWZun3mLfjmVnQi18E1AsFbDN9QdJ5YXLto= +google.golang.org/genproto/googleapis/rpc v0.0.0-20251202230838-ff82c1b0f217 h1:gRkg/vSppuSQoDjxyiGfN4Upv/h/DQmIR10ZU8dh4Ww= +google.golang.org/genproto/googleapis/rpc v0.0.0-20251202230838-ff82c1b0f217/go.mod h1:7i2o+ce6H/6BluujYR+kqX3GKH+dChPTQU19wjRPiGk= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= @@ -2061,8 +2074,8 @@ google.golang.org/grpc v1.52.3/go.mod h1:pu6fVzoFb+NBYNAvQL08ic+lvB2IojljRYuun5v google.golang.org/grpc v1.53.0/go.mod h1:OnIrk0ipVdj4N5d9IUoFUx72/VlD7+jUsHwZgwSMQpw= google.golang.org/grpc v1.54.0/go.mod h1:PUSEXI6iWghWaB6lXM4knEgpJNu2qUcKfDtNci3EC2g= google.golang.org/grpc v1.56.3/go.mod h1:I9bI3vqKfayGqPUAwGdOSu7kt6oIJLixfffKrpXqQ9s= -google.golang.org/grpc v1.64.1 h1:LKtvyfbX3UGVPFcGqJ9ItpVWW6oN/2XqTxfAnwRRXiA= -google.golang.org/grpc v1.64.1/go.mod h1:hiQF4LFZelK2WKaP6W0L92zGHtiQdZxk8CrSdvyjeP0= +google.golang.org/grpc v1.79.1 h1:zGhSi45ODB9/p3VAawt9a+O/MULLl9dpizzNNpq7flY= +google.golang.org/grpc v1.79.1/go.mod h1:KmT0Kjez+0dde/v2j9vzwoAScgEPx/Bw1CYChhHLrHQ= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= google.golang.org/grpc/examples v0.0.0-20210424002626-9572fd6faeae/go.mod h1:Ly7ZA/ARzg8fnPU9TyZIxoz33sEUuWX7txiqs8lPTgE= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= diff --git a/internal/test/grpc.go b/internal/test/grpc.go index 8b43401d08..c01010c1aa 100644 --- a/internal/test/grpc.go +++ b/internal/test/grpc.go @@ -11,6 +11,7 @@ import ( "github.com/lightningnetwork/lnd/cert" "github.com/lightningnetwork/lnd/lntest/port" "github.com/stretchr/testify/require" + "golang.org/x/net/http2" "golang.org/x/sync/errgroup" "google.golang.org/grpc" ) @@ -115,5 +116,8 @@ func genCert(t *testing.T) *tls.Config { tlsCert, _, err := cert.LoadCertFromBytes(certBytes, keyBytes) require.NoError(t, err) - return cert.TLSConfFromCert(tlsCert) + tlsCfg := cert.TLSConfFromCert(tlsCert) + tlsCfg.NextProtos = []string{http2.NextProtoTLS} + + return tlsCfg } diff --git a/itest/addrs_test.go b/itest/addrs_test.go index c4b3e8861b..ffbbaa1533 100644 --- a/itest/addrs_test.go +++ b/itest/addrs_test.go @@ -39,7 +39,7 @@ func testAddresses(t *harnessTest) { // for multiple internal asset transfers when only sending one of them // to an external address. rpcAssets := MintAssetsConfirmBatch( - t.t, t.lndHarness.Miner().Client, t.tapd, + t.t, t.lndHarness.Miner(), t.tapd, []*mintrpc.MintAssetRequest{ simpleAssets[0], issuableAssets[0], }, @@ -80,7 +80,7 @@ func testAddresses(t *harnessTest) { AssertAddrEvent(t.t, secondTapd, addr, 1, statusDetected) // Mine a block to make sure the events are marked as confirmed. - MineBlocks(t.t, t.lndHarness.Miner().Client, 1, 1) + MineBlocks(t.t, t.lndHarness.Miner(), 1, 1) // Eventually the event should be marked as confirmed. AssertAddrEvent(t.t, secondTapd, addr, 1, statusConfirmed) @@ -219,7 +219,7 @@ func testAddresses(t *harnessTest) { require.NoError(t.t, err) // Confirm the transfer. - MineBlocks(t.t, t.lndHarness.Miner().Client, 1, 1) + MineBlocks(t.t, t.lndHarness.Miner(), 1, 1) AssertAddrEvent(t.t, secondTapd, oldAddr, 1, statusConfirmed) AssertNonInteractiveRecvComplete(t.t, secondTapd, 3) @@ -239,7 +239,7 @@ func testAddresses(t *harnessTest) { }) require.NoError(t.t, err) - MineBlocks(t.t, t.lndHarness.Miner().Client, 1, 1) + MineBlocks(t.t, t.lndHarness.Miner(), 1, 1) AssertAddrEvent(t.t, secondTapd, newAddr, 1, statusConfirmed) AssertNonInteractiveRecvComplete(t.t, secondTapd, 4) @@ -253,7 +253,7 @@ func testAddresses(t *harnessTest) { func testMultiAddress(t *harnessTest) { // First, mint an asset, so we have one to create addresses for. rpcAssets := MintAssetsConfirmBatch( - t.t, t.lndHarness.Miner().Client, t.tapd, + t.t, t.lndHarness.Miner(), t.tapd, []*mintrpc.MintAssetRequest{ simpleAssets[0], issuableAssets[0], }, @@ -325,7 +325,7 @@ func testAddressAssetSyncer(t *harnessTest) { ctx := context.Background() - miner := t.lndHarness.Miner().Client + miner := t.lndHarness.Miner() // Now that Bob is active, we'll mint some assets with the main node. rpcAssets := MintAssetsConfirmBatch( @@ -642,7 +642,7 @@ func runMultiSendTest(ctx context.Context, t *harnessTest, alice, AssertAddrEvent(t.t, alice, aliceAddr2, 1, statusDetected) // Mine a block to make sure the events are marked as confirmed. - _ = MineBlocks(t.t, t.lndHarness.Miner().Client, 1, 1) + _ = MineBlocks(t.t, t.lndHarness.Miner(), 1, 1) // Eventually the events should be marked as confirmed. AssertAddrEventByStatus(t.t, bob, statusConfirmed, 2) @@ -706,7 +706,7 @@ func runMultiSendTest(ctx context.Context, t *harnessTest, alice, func testUnknownTlvType(t *harnessTest) { // First, mint an asset, so we have one to create addresses for. rpcAssets := MintAssetsConfirmBatch( - t.t, t.lndHarness.Miner().Client, t.tapd, + t.t, t.lndHarness.Miner(), t.tapd, []*mintrpc.MintAssetRequest{ simpleAssets[0], issuableAssets[0], }, @@ -751,7 +751,7 @@ func testUnknownTlvType(t *harnessTest) { AssertAddrEvent(t.t, bob, bobAddr, 1, statusDetected) // Mine a block to make sure the events are marked as confirmed. - _ = MineBlocks(t.t, t.lndHarness.Miner().Client, 1, 1) + _ = MineBlocks(t.t, t.lndHarness.Miner(), 1, 1) // Eventually the event should be marked as confirmed. AssertAddrEventByStatus(t.t, bob, statusConfirmed, 1) @@ -875,7 +875,7 @@ func testUnknownTlvType(t *harnessTest) { func testAddrReceives(t *harnessTest) { // First, mint a few assets, so we have some to create addresses for. rpcAssets := MintAssetsConfirmBatch( - t.t, t.lndHarness.Miner().Client, t.tapd, + t.t, t.lndHarness.Miner(), t.tapd, []*mintrpc.MintAssetRequest{ simpleAssets[0], issuableAssets[0], }, @@ -915,7 +915,7 @@ func testAddrReceives(t *harnessTest) { AssertAddrEvent(t.t, bob, addr, 1, statusDetected) // Mine a block to make sure the events are marked as confirmed. - MineBlocks(t.t, t.lndHarness.Miner().Client, 1, 1) + MineBlocks(t.t, t.lndHarness.Miner(), 1, 1) // Eventually the event should be marked as confirmed. AssertAddrEvent(t.t, bob, addr, 1, statusConfirmed) @@ -1214,6 +1214,14 @@ func withFeeRate(feeRate uint32) sendOption { } } +// withAnchorTxVersion is an option to specify the anchor transaction version +// for the send. +func withAnchorTxVersion(version taprpc.AnchorTxVersion) sendOption { + return func(options *sendOptions) { + options.sendAssetRequest.AnchorTxVersion = version + } +} + // withSendLabel is an option to specify the label for the send. func withSendLabel(label string) sendOption { return func(options *sendOptions) { diff --git a/itest/addrs_v2_test.go b/itest/addrs_v2_test.go index 14bb7890d1..a1d7cbab2c 100644 --- a/itest/addrs_v2_test.go +++ b/itest/addrs_v2_test.go @@ -22,7 +22,7 @@ func testAddressV2WithSimpleAsset(t *harnessTest) { // for multiple internal asset transfers when only sending one of them // to an external address. rpcAssets := MintAssetsConfirmBatch( - t.t, t.lndHarness.Miner().Client, t.tapd, + t.t, t.lndHarness.Miner(), t.tapd, []*mintrpc.MintAssetRequest{ simpleAssets[0], simpleAssets[1], }, @@ -71,7 +71,7 @@ func testAddressV2WithSimpleAsset(t *harnessTest) { t.Logf("Got response from sending assets: %v", sendRespJSON) // Mine a block to make sure the events are marked as confirmed. - MineBlocks(t.t, t.lndHarness.Miner().Client, 1, 1) + MineBlocks(t.t, t.lndHarness.Miner(), 1, 1) // Eventually the event should be marked as confirmed. AssertAddrEvent(t.t, secondTapd, addr, 1, statusConfirmed) @@ -173,7 +173,7 @@ func testAddressV2WithSimpleAsset(t *harnessTest) { AssertAddrEvent(t.t, t.tapd, addr, 1, statusDetected) // Mine a block to make sure the events are marked as confirmed. - MineBlocks(t.t, t.lndHarness.Miner().Client, 1, 1) + MineBlocks(t.t, t.lndHarness.Miner(), 1, 1) // Eventually the event should be marked as confirmed. AssertAddrEvent(t.t, t.tapd, addr, 1, statusConfirmed) @@ -197,7 +197,7 @@ func testAddressV2WithGroupKey(t *harnessTest) { firstTrancheReq := CopyRequest(issuableAssets[0]) firstTranche := MintAssetsConfirmBatch( - t.t, t.lndHarness.Miner().Client, t.tapd, + t.t, t.lndHarness.Miner(), t.tapd, []*mintrpc.MintAssetRequest{firstTrancheReq}, ) firstAsset := firstTranche[0] @@ -212,7 +212,7 @@ func testAddressV2WithGroupKey(t *harnessTest) { secondTrancheReq.Asset.GroupKey = groupKey secondTranche := MintAssetsConfirmBatch( - t.t, t.lndHarness.Miner().Client, t.tapd, + t.t, t.lndHarness.Miner(), t.tapd, []*mintrpc.MintAssetRequest{secondTrancheReq}, ) secondAsset := secondTranche[0] @@ -265,7 +265,7 @@ func testAddressV2WithGroupKey(t *harnessTest) { t.Logf("Sent asset to group addr: %v", toJSON(t.t, sendResp)) AssertAssetOutboundTransferWithOutputs( - t.t, t.lndHarness.Miner().Client, t.tapd, + t.t, t.lndHarness.Miner(), t.tapd, sendResp.Transfer, [][]byte{firstAssetID, secondAssetID}, []uint64{firstAsset.Amount, secondAsset.Amount}, 0, 1, 2, true, ) @@ -300,7 +300,7 @@ func testAddressV2WithGroupKey(t *harnessTest) { }) require.NoError(t.t, err) - MineBlocks(t.t, t.lndHarness.Miner().Client, 1, 1) + MineBlocks(t.t, t.lndHarness.Miner(), 1, 1) AssertAddrEventByStatus(t.t, bobTapd, statusCompleted, 1) AssertBalanceByGroup( t.t, bobTapd, hex.EncodeToString(groupKey), totalAmount, @@ -340,7 +340,7 @@ func testAddressV2WithGroupKey(t *harnessTest) { require.NoError(t.t, err) AssertAssetOutboundTransferWithOutputs( - t.t, t.lndHarness.Miner().Client, bobTapd, + t.t, t.lndHarness.Miner(), bobTapd, sendResp3.Transfer, [][]byte{firstAssetID, secondAssetID}, []uint64{totalAmount/2 - 50, 50, totalAmount / 2}, 1, 2, 3, true, @@ -373,7 +373,7 @@ func testAddressV2WithGroupKey(t *harnessTest) { require.NoError(t.t, err) AssertAssetOutboundTransferWithOutputs( - t.t, t.lndHarness.Miner().Client, t.tapd, + t.t, t.lndHarness.Miner(), t.tapd, sendResp4.Transfer, [][]byte{bobUtxo.AssetGenesis.AssetId}, []uint64{bobUtxo.Amount - 1234, 1234}, 1, 2, 2, true, ) @@ -393,7 +393,7 @@ func testAddressV2WithGroupKeyMultipleRoundTrips(t *harnessTest) { firstTrancheReq.Asset.Amount = 212e5 firstTranche := MintAssetsConfirmBatch( - t.t, t.lndHarness.Miner().Client, t.tapd, + t.t, t.lndHarness.Miner(), t.tapd, []*mintrpc.MintAssetRequest{firstTrancheReq}, ) firstAsset := firstTranche[0] @@ -410,7 +410,7 @@ func testAddressV2WithGroupKeyMultipleRoundTrips(t *harnessTest) { secondTrancheReq.Asset.Amount = 202e5 secondTranche := MintAssetsConfirmBatch( - t.t, t.lndHarness.Miner().Client, t.tapd, + t.t, t.lndHarness.Miner(), t.tapd, []*mintrpc.MintAssetRequest{secondTrancheReq}, ) secondAsset := secondTranche[0] @@ -426,7 +426,7 @@ func testAddressV2WithGroupKeyMultipleRoundTrips(t *harnessTest) { thirdTrancheReq.Asset.Amount = 182e5 thirdTranche := MintAssetsConfirmBatch( - t.t, t.lndHarness.Miner().Client, t.tapd, + t.t, t.lndHarness.Miner(), t.tapd, []*mintrpc.MintAssetRequest{thirdTrancheReq}, ) thirdAsset := thirdTranche[0] @@ -476,7 +476,7 @@ func testAddressV2WithGroupKeyMultipleRoundTrips(t *harnessTest) { require.NoError(t.t, err) t.Logf("Sent asset to group addr: %v", toJSON(t.t, sendResp)) AssertAssetOutboundTransferWithOutputs( - t.t, t.lndHarness.Miner().Client, t.tapd, + t.t, t.lndHarness.Miner(), t.tapd, sendResp.Transfer, [][]byte{firstAssetID}, []uint64{firstAsset.Amount}, currentTransferIdx, numTransfers, 1, true, @@ -499,7 +499,7 @@ func testAddressV2WithGroupKeyMultipleRoundTrips(t *harnessTest) { require.NoError(t.t, err) t.Logf("Sent asset to group addr: %v", toJSON(t.t, sendResp)) AssertAssetOutboundTransferWithOutputs( - t.t, t.lndHarness.Miner().Client, t.tapd, + t.t, t.lndHarness.Miner(), t.tapd, sendResp.Transfer, [][]byte{secondAssetID}, []uint64{secondAsset.Amount}, currentTransferIdx, numTransfers, 1, true, @@ -522,7 +522,7 @@ func testAddressV2WithGroupKeyMultipleRoundTrips(t *harnessTest) { require.NoError(t.t, err) t.Logf("Sent asset to group addr: %v", toJSON(t.t, sendResp)) AssertAssetOutboundTransferWithOutputs( - t.t, t.lndHarness.Miner().Client, t.tapd, + t.t, t.lndHarness.Miner(), t.tapd, sendResp.Transfer, [][]byte{thirdAssetID}, []uint64{thirdAsset.Amount}, currentTransferIdx, numTransfers, 1, true, @@ -557,7 +557,7 @@ func testAddressV2WithGroupKeyMultipleRoundTrips(t *harnessTest) { t.Logf("Sent asset to group addr: %v", toJSON(t.t, sendResp)) - MineBlocks(t.t, t.lndHarness.Miner().Client, 1, 1) + MineBlocks(t.t, t.lndHarness.Miner(), 1, 1) AssertAddrEventByStatus(t.t, t.tapd, statusCompleted, bobNumTransfers) @@ -577,7 +577,7 @@ func testAddressV2WithGroupKeyMultipleRoundTrips(t *harnessTest) { }) require.NoError(t.t, err) t.Logf("Sent asset to group addr: %v", toJSON(t.t, sendResp)) - MineBlocks(t.t, t.lndHarness.Miner().Client, 1, 1) + MineBlocks(t.t, t.lndHarness.Miner(), 1, 1) AssertAddrEventByStatus( t.t, bobTapd, statusCompleted, numTransfers, ) @@ -598,7 +598,7 @@ func testAddressV2WithGroupKeyMultipleRoundTrips(t *harnessTest) { ) require.NoError(t.t, err) t.Logf("Sent asset to group addr: %v", toJSON(t.t, sendResp)) - MineBlocks(t.t, t.lndHarness.Miner().Client, 1, 1) + MineBlocks(t.t, t.lndHarness.Miner(), 1, 1) AssertAddrEventByStatus( t.t, t.tapd, statusCompleted, bobNumTransfers, ) @@ -627,7 +627,7 @@ func testAddressV2WithGroupKeyMultipleRoundTrips(t *harnessTest) { require.NoError(t.t, err) t.Logf("Sent asset to group addr: %v", toJSON(t.t, sendResp)) AssertAssetOutboundTransferWithOutputs( - t.t, t.lndHarness.Miner().Client, t.tapd, + t.t, t.lndHarness.Miner(), t.tapd, sendResp.Transfer, [][]byte{assetIDs[idx]}, []uint64{amount}, currentTransferIdx, numTransfers, 1, true, @@ -647,7 +647,7 @@ func testAddressV2WithGroupKeyRestart(t *harnessTest) { // We start by minting an asset group with a group key. We'll only use // one tranche for this test. firstTranche := MintAssetsConfirmBatch( - t.t, t.lndHarness.Miner().Client, t.tapd, + t.t, t.lndHarness.Miner(), t.tapd, []*mintrpc.MintAssetRequest{issuableAssets[0]}, ) firstAsset := firstTranche[0] @@ -724,7 +724,7 @@ func testAddressV2WithGroupKeyRestart(t *harnessTest) { // Mine a block to make sure the events are marked as confirmed. t.Logf("Universe stopped, going to mine a block to confirm the send...") - _ = MineBlocks(t.t, t.lndHarness.Miner().Client, 1, 1) + _ = MineBlocks(t.t, t.lndHarness.Miner(), 1, 1) AssertSendEvents( t.t, nil, sendEvents, tapfreighter.SendStateWaitTxConf, @@ -799,7 +799,7 @@ func testAddressV2WithGroupKeyRestart(t *harnessTest) { require.NoError(t.t, err) AssertAssetOutboundTransferWithOutputs( - t.t, t.lndHarness.Miner().Client, bobTapd, + t.t, t.lndHarness.Miner(), bobTapd, sendResp2.Transfer, [][]byte{firstAssetID}, []uint64{bobAmount / 2, bobAmount / 2}, 0, 1, 2, true, ) @@ -843,7 +843,7 @@ func testAddressV2ImportFailsWithoutCourier(t *harnessTest) { }() assets := MintAssetsConfirmBatch( - t.t, t.lndHarness.Miner().Client, tapd, + t.t, t.lndHarness.Miner(), tapd, []*mintrpc.MintAssetRequest{simpleAssets[0]}, ) asset := assets[0] diff --git a/itest/anchor_tx_version_test.go b/itest/anchor_tx_version_test.go new file mode 100644 index 0000000000..bd9bcd9c3b --- /dev/null +++ b/itest/anchor_tx_version_test.go @@ -0,0 +1,102 @@ +package itest + +import ( + "context" + + "github.com/lightninglabs/taproot-assets/taprpc" + wrpc "github.com/lightninglabs/taproot-assets/taprpc/assetwalletrpc" + "github.com/lightninglabs/taproot-assets/taprpc/mintrpc" + "github.com/lightninglabs/taproot-assets/tapsend" + "github.com/stretchr/testify/require" +) + +// testAnchorTxVersionV3 verifies that minting and transfer flows honor an +// explicit request for v3 Bitcoin anchor transactions. +func testAnchorTxVersionV3(t *harnessTest) { + if t.lndHarness.ChainBackendName() != "bitcoind" { + t.t.Skip( + "v3 anchor coverage requires the bitcoind chain " + + "backend", + ) + } + + ctx := context.Background() + miner := t.lndHarness.Miner() + + rpcAssets := MintAssetsConfirmBatch( + t.t, miner, t.tapd, + []*mintrpc.MintAssetRequest{simpleAssets[0]}, + WithMintAnchorTxVersion( + taprpc.AnchorTxVersion_ANCHOR_TX_VERSION_V3, + ), + ) + mintedAsset := rpcAssets[0] + genInfo := mintedAsset.AssetGenesis + + AssertAssetAnchorTxVersion( + t.t, miner, mintedAsset, tapsend.AnchorTxVersionV3, + ) + + bobLnd := t.lndHarness.NewNodeWithCoins("Bob", nil) + bobTapd := setupTapdHarness(t.t, t, bobLnd, t.universeServer) + defer func() { + require.NoError(t.t, bobTapd.stop(!*noDelete)) + }() + + const bobAmt = 1000 + bobAddr, err := bobTapd.NewAddr(ctx, &taprpc.NewAddrRequest{ + AssetId: genInfo.AssetId, + Amt: bobAmt, + }) + require.NoError(t.t, err) + + AssertAddrCreated(t.t, bobTapd, mintedAsset, bobAddr) + + sendResp, sendEvents := sendAsset( + t, t.tapd, withReceiverAddresses(bobAddr), withAnchorTxVersion( + taprpc.AnchorTxVersion_ANCHOR_TX_VERSION_V3, + ), + ) + ConfirmAndAssertOutboundTransfer( + t.t, miner, t.tapd, sendResp, genInfo.AssetId, + []uint64{mintedAsset.Amount - bobAmt, bobAmt}, 0, 1, + ) + AssertTransferAnchorTxVersion( + t.t, miner, sendResp.Transfer, tapsend.AnchorTxVersionV3, + ) + AssertNonInteractiveRecvComplete(t.t, bobTapd, 1) + AssertSendEventsComplete(t.t, bobAddr.ScriptKey, sendEvents) + + const aliceAmt = 600 + aliceAddr, err := t.tapd.NewAddr(ctx, &taprpc.NewAddrRequest{ + AssetId: genInfo.AssetId, + Amt: aliceAmt, + }) + require.NoError(t.t, err) + + fundResp := fundAddressSendPacket(t, bobTapd, aliceAddr) + signResp, err := bobTapd.SignVirtualPsbt( + ctx, &wrpc.SignVirtualPsbtRequest{ + FundedPsbt: fundResp.FundedPsbt, + }, + ) + require.NoError(t.t, err) + + psbtSendResp, err := bobTapd.AnchorVirtualPsbts( + ctx, &wrpc.AnchorVirtualPsbtsRequest{ + VirtualPsbts: [][]byte{signResp.SignedPsbt}, + AnchorTxVersion: taprpc. + AnchorTxVersion_ANCHOR_TX_VERSION_V3, + }, + ) + require.NoError(t.t, err) + + ConfirmAndAssertOutboundTransfer( + t.t, miner, bobTapd, psbtSendResp, genInfo.AssetId, + []uint64{bobAmt - aliceAmt, aliceAmt}, 0, 1, + ) + AssertTransferAnchorTxVersion( + t.t, miner, psbtSendResp.Transfer, tapsend.AnchorTxVersionV3, + ) + AssertNonInteractiveRecvComplete(t.t, t.tapd, 1) +} diff --git a/itest/assertions.go b/itest/assertions.go index e30ab723cc..aaa530f46e 100644 --- a/itest/assertions.go +++ b/itest/assertions.go @@ -16,7 +16,6 @@ import ( "github.com/btcsuite/btcd/btcec/v2/schnorr" "github.com/btcsuite/btcd/btcutil" "github.com/btcsuite/btcd/chaincfg/chainhash" - "github.com/btcsuite/btcd/rpcclient" "github.com/btcsuite/btcd/wire" "github.com/lightninglabs/taproot-assets/address" "github.com/lightninglabs/taproot-assets/asset" @@ -35,6 +34,7 @@ import ( unirpc "github.com/lightninglabs/taproot-assets/taprpc/universerpc" "github.com/lightninglabs/taproot-assets/universe" "github.com/lightningnetwork/lnd/lnrpc/chainrpc" + lntestminer "github.com/lightningnetwork/lnd/lntest/miner" "github.com/lightningnetwork/lnd/lntest/wait" "github.com/lightningnetwork/lnd/lntypes" "github.com/lightningnetwork/lnd/lnwallet/chainfee" @@ -338,25 +338,33 @@ func AssertAssetState(t *testing.T, assets map[string][]*taprpc.Asset, // AssertAssetStateByScriptKey makes sure that an asset with the given (possibly // non-unique!) name exists in the list of assets and then performs the given // additional checks on that asset. -func AssertAssetStateByScriptKey(t *testing.T, assets []*taprpc.Asset, - scriptKey []byte, assetChecks ...AssetCheck) *taprpc.Asset { +func assetStateByScriptKey(assets []*taprpc.Asset, scriptKey []byte, + assetChecks ...AssetCheck) (*taprpc.Asset, error) { - var a *taprpc.Asset for _, rpcAsset := range assets { - if bytes.Equal(rpcAsset.ScriptKey, scriptKey) { - a = rpcAsset + if !bytes.Equal(rpcAsset.ScriptKey, scriptKey) { + continue + } - for _, check := range assetChecks { - err := check(rpcAsset) - require.NoError(t, err) + for _, check := range assetChecks { + err := check(rpcAsset) + if err != nil { + return nil, err } - - break } + + return rpcAsset, nil } - require.NotNil(t, a, fmt.Errorf("asset with matching metadata not"+ - "found in asset list")) + return nil, fmt.Errorf("asset with matching metadata not found in " + + "asset list") +} + +func AssertAssetStateByScriptKey(t *testing.T, assets []*taprpc.Asset, + scriptKey []byte, assetChecks ...AssetCheck) *taprpc.Asset { + + a, err := assetStateByScriptKey(assets, scriptKey, assetChecks...) + require.NoError(t, err) return a } @@ -380,7 +388,7 @@ func AssertTxInBlock(t *testing.T, block *wire.MsgBlock, // AssertTransferFeeRate checks that fee paid for the TX anchoring an asset // transfer is close to the expected fee for that TX, at a given fee rate. -func AssertTransferFeeRate(t *testing.T, minerClient *rpcclient.Client, +func AssertTransferFeeRate(t *testing.T, minerClient *lntestminer.HarnessMiner, transferResp *taprpc.SendAssetResponse, inputAmt int64, feeRate chainfee.SatPerKWeight) { @@ -392,7 +400,8 @@ func AssertTransferFeeRate(t *testing.T, minerClient *rpcclient.Client, // AssertFeeRate checks that the fee paid for a given TX is close to the // expected fee for the same TX, at a given fee rate. -func AssertFeeRate(t *testing.T, minerClient *rpcclient.Client, inputAmt int64, +func AssertFeeRate(t *testing.T, + minerClient *lntestminer.HarnessMiner, inputAmt int64, txid *chainhash.Hash, feeRate chainfee.SatPerKWeight) { var ( @@ -401,8 +410,7 @@ func AssertFeeRate(t *testing.T, minerClient *rpcclient.Client, inputAmt int64, maxVsizeDifference = lntypes.VByte(2) ) - verboseTx, err := minerClient.GetRawTransactionVerbose(txid) - require.NoError(t, err) + verboseTx := minerClient.GetRawTransactionVerbose(*txid) vsize := verboseTx.Vsize weight := verboseTx.Weight @@ -1195,7 +1203,7 @@ func AssertMintEvents(t *testing.T, batchKey []byte, // the correct state before confirming it and then asserting the confirmed state // with the node. func ConfirmAndAssertOutboundTransfer(t *testing.T, - minerClient *rpcclient.Client, sender commands.RpcClientsBundle, + minerClient *lntestminer.HarnessMiner, sender commands.RpcClientsBundle, sendResp *taprpc.SendAssetResponse, assetID []byte, expectedAmounts []uint64, currentTransferIdx, numTransfers int) *wire.MsgBlock { @@ -1210,7 +1218,7 @@ func ConfirmAndAssertOutboundTransfer(t *testing.T, // transfer has the correct state and number of outputs before confirming it and // then asserting the confirmed state with the node. func ConfirmAndAssertOutboundTransferWithOutputs(t *testing.T, - minerClient *rpcclient.Client, sender commands.RpcClientsBundle, + minerClient *lntestminer.HarnessMiner, sender commands.RpcClientsBundle, sendResp *taprpc.SendAssetResponse, assetID []byte, expectedAmounts []uint64, currentTransferIdx, numTransfers, numOutputs int) *wire.MsgBlock { @@ -1225,7 +1233,7 @@ func ConfirmAndAssertOutboundTransferWithOutputs(t *testing.T, // AssertAssetOutboundTransferWithOutputs makes sure the given outbound transfer // has the correct state and number of outputs. func AssertAssetOutboundTransferWithOutputs(t *testing.T, - minerClient *rpcclient.Client, sender commands.RpcClientsBundle, + minerClient *lntestminer.HarnessMiner, sender commands.RpcClientsBundle, transfer *taprpc.AssetTransfer, inputAssetIDs [][]byte, expectedAmounts []uint64, currentTransferIdx, numTransfers, numOutputs int, confirm bool) *wire.MsgBlock { @@ -2749,23 +2757,40 @@ func LargestUtxo(t *testing.T, client taprpc.TaprootAssetsClient, // UpdateAndMineSupplyCommit updates the on-chain supply commitment for an asset // group and mines the commitment transaction. func UpdateAndMineSupplyCommit(t *testing.T, ctx context.Context, - tapd unirpc.UniverseClient, miner *rpcclient.Client, + tapd unirpc.UniverseClient, miner *lntestminer.HarnessMiner, groupKeyBytes []byte, expectedTxsInBlock int) []*wire.MsgBlock { groupKeyUpdate := &unirpc.UpdateSupplyCommitRequest_GroupKeyBytes{ GroupKeyBytes: groupKeyBytes, } - respUpdate, err := tapd.UpdateSupplyCommit( - ctx, &unirpc.UpdateSupplyCommitRequest{ - GroupKey: groupKeyUpdate, - }, - ) - require.NoError(t, err) - require.NotNil(t, respUpdate) + req := &unirpc.UpdateSupplyCommitRequest{ + GroupKey: groupKeyUpdate, + } - // Mine the supply commitment transaction. - minedBlocks := MineBlocks(t, miner, 1, expectedTxsInBlock) + var txids []chainhash.Hash + require.Eventually(t, func() bool { + respUpdate, err := tapd.UpdateSupplyCommit(ctx, req) + if err != nil || respUpdate == nil { + return false + } + + // Burn events are delivered asynchronously after the + // burn transfer confirms, so the first commit tick can + // race and become a no-op. Give each tick a moment to + // produce the follow-on commitment tx before retrying. + // Otherwise we'd enqueue a second tick while the first + // commitment is already in flight. + txids, err = WaitForNTxsInMempool( + miner, expectedTxsInBlock, 2*time.Second, + ) + return err == nil + }, defaultWaitTimeout, 2*time.Second) + + minedBlocks := miner.MineBlocks(1) + for _, txid := range txids { + AssertTxInBlock(t, minedBlocks[0], &txid) + } require.Len(t, minedBlocks, 1) return minedBlocks diff --git a/itest/asset_meta_test.go b/itest/asset_meta_test.go index 90101bf3ad..34e6291d5d 100644 --- a/itest/asset_meta_test.go +++ b/itest/asset_meta_test.go @@ -151,7 +151,7 @@ func testMintAssetWithDecimalDisplayMetaField(t *harnessTest) { firstAssetReq := &mintrpc.MintAssetRequest{Asset: firstAsset} rpcSimpleAssets := MintAssetsConfirmBatch( - t.t, t.lndHarness.Miner().Client, t.tapd, + t.t, t.lndHarness.Miner(), t.tapd, []*mintrpc.MintAssetRequest{firstAssetReq}, ) require.Len(t.t, rpcSimpleAssets, 1) @@ -211,7 +211,7 @@ func testMintAssetWithDecimalDisplayMetaField(t *harnessTest) { // same decimal display as the group anchor. secondAssetReq.Asset.AssetMeta.Data = []byte(`{"foo": "bar"}`) secondAssets := MintAssetsConfirmBatch( - t.t, t.lndHarness.Miner().Client, t.tapd, + t.t, t.lndHarness.Miner(), t.tapd, []*mintrpc.MintAssetRequest{secondAssetReq}, ) require.Len(t.t, secondAssets, 1) @@ -258,7 +258,7 @@ func testMintAssetWithDecimalDisplayMetaField(t *harnessTest) { } thirdAssetReq := &mintrpc.MintAssetRequest{Asset: thirdAsset} thirdAssets := MintAssetsConfirmBatch( - t.t, t.lndHarness.Miner().Client, t.tapd, + t.t, t.lndHarness.Miner(), t.tapd, []*mintrpc.MintAssetRequest{thirdAssetReq}, ) diff --git a/itest/assets_test.go b/itest/assets_test.go index 163b4138f2..c4ceae8c96 100644 --- a/itest/assets_test.go +++ b/itest/assets_test.go @@ -98,10 +98,10 @@ func testMintAssets(t *harnessTest) { ctx := context.Background() rpcSimpleAssets := MintAssetsConfirmBatch( - t.t, t.lndHarness.Miner().Client, t.tapd, simpleAssets, + t.t, t.lndHarness.Miner(), t.tapd, simpleAssets, ) rpcIssuableAssets := MintAssetsConfirmBatch( - t.t, t.lndHarness.Miner().Client, t.tapd, issuableAssets, + t.t, t.lndHarness.Miner(), t.tapd, issuableAssets, ) // Now that all our assets have been issued, we'll use the balance @@ -194,14 +194,14 @@ func testMintBatchResume(t *harnessTest) { require.NoError(t.t, t.tapd.start(false)) hashes, err := WaitForNTxsInMempool( - t.lndHarness.Miner().Client, 1, defaultWaitTimeout, + t.lndHarness.Miner(), 1, defaultWaitTimeout, ) require.NoError(t.t, err) - mintTXID := *hashes[0] + mintTXID := hashes[0] // Mine a block to confirm the assets. - block := MineBlocks(t.t, t.lndHarness.Miner().Client, 1, 1)[0] + block := MineBlocks(t.t, t.lndHarness.Miner(), 1, 1)[0] blockHash := block.BlockHash() WaitForBatchState( t.t, ctx, t.tapd, defaultWaitTimeout, batchKey, @@ -302,7 +302,7 @@ func testMintAssetNameCollisionError(t *harnessTest) { }, } rpcSimpleAssets := MintAssetsConfirmBatch( - t.t, t.lndHarness.Miner().Client, t.tapd, + t.t, t.lndHarness.Miner(), t.tapd, []*mintrpc.MintAssetRequest{&assetMint}, ) @@ -413,7 +413,7 @@ func testMintAssetNameCollisionError(t *harnessTest) { // Minting the asset with the name collision should work, even though // it is also part of a cancelled batch. rpcCollideAsset := MintAssetsConfirmBatch( - t.t, t.lndHarness.Miner().Client, t.tapd, + t.t, t.lndHarness.Miner(), t.tapd, []*mintrpc.MintAssetRequest{&assetCollide}, ) @@ -449,11 +449,11 @@ func testMintAssetsWithTapscriptSibling(t *harnessTest) { } rpcSimpleAssets := MintAssetsConfirmBatch( - t.t, t.lndHarness.Miner().Client, t.tapd, simpleAssets, + t.t, t.lndHarness.Miner(), t.tapd, simpleAssets, WithSiblingBranch(siblingReq), ) rpcIssuableAssets := MintAssetsConfirmBatch( - t.t, t.lndHarness.Miner().Client, t.tapd, issuableAssets, + t.t, t.lndHarness.Miner(), t.tapd, issuableAssets, ) AssertMintedAssetBalances( t.t, t.tapd, rpcSimpleAssets, rpcIssuableAssets, false, @@ -554,7 +554,7 @@ func testMintAssetsWithTapscriptSibling(t *harnessTest) { func testMintBatchAndTransfer(t *harnessTest) { ctx := context.Background() rpcSimpleAssets := MintAssetsConfirmBatch( - t.t, t.lndHarness.Miner().Client, t.tapd, simpleAssets, + t.t, t.lndHarness.Miner(), t.tapd, simpleAssets, ) // List the batch right after minting. @@ -594,7 +594,7 @@ func testMintBatchAndTransfer(t *harnessTest) { AssertAddrEvent(t.t, secondTapd, addr, 1, statusDetected) // Mine a block to make sure the events are marked as confirmed. - MineBlocks(t.t, t.lndHarness.Miner().Client, 1, 1) + MineBlocks(t.t, t.lndHarness.Miner(), 1, 1) // Eventually the event should be marked as confirmed. AssertAddrEvent(t.t, secondTapd, addr, 1, statusConfirmed) @@ -654,7 +654,7 @@ func testAssetBalances(t *harnessTest) { // Mint assets for testing. rpcSimpleAssets := MintAssetsConfirmBatch( - t.t, t.lndHarness.Miner().Client, t.tapd, simpleAssets, + t.t, t.lndHarness.Miner(), t.tapd, simpleAssets, ) targetAsset := rpcSimpleAssets[0] @@ -857,7 +857,7 @@ func testListAssets(t *harnessTest) { for i := range numBatches { MintAssetsConfirmBatch( - t.t, t.lndHarness.Miner().Client, t.tapd, + t.t, t.lndHarness.Miner(), t.tapd, []*mintrpc.MintAssetRequest{ { Asset: &mintrpc.MintAsset{ @@ -1031,7 +1031,7 @@ func testFetchAsset(t *harnessTest) { // Mint a batch with a simple asset and a grouped asset. rpcAssets := MintAssetsConfirmBatch( - t.t, t.lndHarness.Miner().Client, t.tapd, + t.t, t.lndHarness.Miner(), t.tapd, []*mintrpc.MintAssetRequest{ { Asset: &mintrpc.MintAsset{ diff --git a/itest/authmailbox_cleanup_test.go b/itest/authmailbox_cleanup_test.go index 38998d4850..45c6f5f50e 100644 --- a/itest/authmailbox_cleanup_test.go +++ b/itest/authmailbox_cleanup_test.go @@ -51,7 +51,7 @@ func testAuthMailboxCleanup(t *harnessTest) { require.NoError(t.t, err) // Fund the P2TR output from the miner. - txHash, err := t.lndHarness.Miner().SendOutputs([]*wire.TxOut{ + txHash, err := SendOutputs(t.lndHarness.Miner(), []*wire.TxOut{ { Value: 100_000, PkScript: pkScript, @@ -171,7 +171,7 @@ func testAuthMailboxCleanup(t *harnessTest) { spendTx.TxIn[0].Witness = wire.TxWitness{sig} - _, err = t.lndHarness.Miner().Client.SendRawTransaction( + _, err = t.lndHarness.Miner().SendRawTransaction( spendTx, true, ) require.NoError(t.t, err) diff --git a/itest/authmailbox_remove_test.go b/itest/authmailbox_remove_test.go index e41d9ec000..7396f68966 100644 --- a/itest/authmailbox_remove_test.go +++ b/itest/authmailbox_remove_test.go @@ -31,7 +31,7 @@ func testAuthMailboxRemoveMessage(t *harnessTest) { ) require.NoError(t.t, err) - txHash, err := t.lndHarness.Miner().SendOutputs([]*wire.TxOut{ + txHash, err := SendOutputs(t.lndHarness.Miner(), []*wire.TxOut{ { Value: 100_000, PkScript: pkScript, diff --git a/itest/authmailbox_test.go b/itest/authmailbox_test.go index aa3d9062a6..14268ece18 100644 --- a/itest/authmailbox_test.go +++ b/itest/authmailbox_test.go @@ -36,7 +36,7 @@ func testAuthMailboxStoreAndFetchMessage(t *harnessTest) { ) require.NoError(t.t, err) - txHash, err := t.lndHarness.Miner().SendOutputs([]*wire.TxOut{ + txHash, err := SendOutputs(t.lndHarness.Miner(), []*wire.TxOut{ { Value: 100000, PkScript: pkScriptBip86, diff --git a/itest/backup_test.go b/itest/backup_test.go index d62ef5906e..332818325e 100644 --- a/itest/backup_test.go +++ b/itest/backup_test.go @@ -38,7 +38,7 @@ func testBackupRestoreGenesis(t *harnessTest) { } rpcAssets := MintAssetsConfirmBatch( - t.t, t.lndHarness.Miner().Client, t.tapd, backupAssets, + t.t, t.lndHarness.Miner(), t.tapd, backupAssets, ) require.Len(t.t, rpcAssets, 1) @@ -148,7 +148,7 @@ func testBackupRestoreTransferred(t *harnessTest) { }, }} rpcAssets := MintAssetsConfirmBatch( - t.t, t.lndHarness.Miner().Client, t.tapd, mintReq, + t.t, t.lndHarness.Miner(), t.tapd, mintReq, ) require.Len(t.t, rpcAssets, 1) mintedAssets = append(mintedAssets, rpcAssets[0]) @@ -175,7 +175,7 @@ func testBackupRestoreTransferred(t *harnessTest) { AssertAddrCreated(t.t, bobTapd, asset, bobAddr) sendResp, _ := sendAssetsToAddr(t, t.tapd, bobAddr) ConfirmAndAssertOutboundTransfer( - t.t, t.lndHarness.Miner().Client, t.tapd, + t.t, t.lndHarness.Miner(), t.tapd, sendResp, asset.AssetGenesis.AssetId, []uint64{0, asset.Amount}, i, i+1, ) @@ -357,7 +357,7 @@ func testBackupRestoreTransferred(t *harnessTest) { AssertAddrCreated(t.t, t.tapd, asset, aliceAddr) sendResp, _ := sendAssetsToAddr(t, eveTapd, aliceAddr) ConfirmAndAssertOutboundTransfer( - t.t, t.lndHarness.Miner().Client, eveTapd, + t.t, t.lndHarness.Miner(), eveTapd, sendResp, asset.AssetGenesis.AssetId, []uint64{0, asset.Amount}, i, i+1, ) diff --git a/itest/burn_test.go b/itest/burn_test.go index 520c24a187..e8f313b18f 100644 --- a/itest/burn_test.go +++ b/itest/burn_test.go @@ -8,6 +8,7 @@ import ( "github.com/btcsuite/btcd/wire" "github.com/lightninglabs/taproot-assets/address" "github.com/lightninglabs/taproot-assets/asset" + "github.com/lightninglabs/taproot-assets/itest/rpcassert" "github.com/lightninglabs/taproot-assets/rpcserver" "github.com/lightninglabs/taproot-assets/tappsbt" "github.com/lightninglabs/taproot-assets/taprpc" @@ -19,7 +20,7 @@ import ( // testBurnAssets tests that we're able to mint assets and then burn assets // again. func testBurnAssets(t *harnessTest) { - minerClient := t.lndHarness.Miner().Client + minerClient := t.lndHarness.Miner() rpcAssets := MintAssetsConfirmBatch( t.t, minerClient, t.tapd, []*mintrpc.MintAssetRequest{ simpleAssets[0], simpleAssets[1], issuableAssets[0], @@ -139,17 +140,24 @@ func testBurnAssets(t *harnessTest) { // We'll now assert that the burned asset has the correct state. burnedAsset := burnResp.BurnProof.Asset - allAssets, err := t.tapd.ListAssets(ctx, &taprpc.ListAssetRequest{ - IncludeSpent: true, - ScriptKeyType: allScriptKeysQuery, - }) - require.NoError(t.t, err) - AssertAssetStateByScriptKey( - t.t, allAssets.Assets, burnedAsset.ScriptKey, - AssetAmountCheck(burnedAsset.Amount), - AssetTypeCheck(burnedAsset.AssetGenesis.AssetType), - AssetScriptKeyIsLocalCheck(false), - AssetScriptKeyIsBurnCheck(true), + rpcassert.ListAssetsRPC( + t.t, ctx, t.tapd, + func(resp *taprpc.ListAssetResponse) error { + _, err := assetStateByScriptKey( + resp.Assets, burnedAsset.ScriptKey, + AssetAmountCheck(burnedAsset.Amount), + AssetTypeCheck( + burnedAsset.AssetGenesis.AssetType, + ), + AssetScriptKeyIsLocalCheck(false), + AssetScriptKeyIsBurnCheck(true), + ) + return err + }, + &taprpc.ListAssetRequest{ + IncludeSpent: true, + ScriptKeyType: allScriptKeysQuery, + }, ) AssertBalances( t.t, t.tapd, burnAmt, WithNumUtxos(1), WithNumAnchorUtxos(1), @@ -389,7 +397,7 @@ func testBurnAssets(t *harnessTest) { func testBurnGroupedAssets(t *harnessTest) { var ( ctx = context.Background() - miner = t.lndHarness.Miner().Client + miner = t.lndHarness.Miner() firstMintReq = issuableAssets[0] burnNote = "blazeit" @@ -472,17 +480,24 @@ func testBurnGroupedAssets(t *harnessTest) { // Ensure that the burnt asset has the correct state. burnedAsset := burnResp.BurnProof.Asset - allAssets, err := t.tapd.ListAssets(ctx, &taprpc.ListAssetRequest{ - IncludeSpent: true, - ScriptKeyType: allScriptKeysQuery, - }) - require.NoError(t.t, err) - AssertAssetStateByScriptKey( - t.t, allAssets.Assets, burnedAsset.ScriptKey, - AssetAmountCheck(burnedAsset.Amount), - AssetTypeCheck(burnedAsset.AssetGenesis.AssetType), - AssetScriptKeyIsLocalCheck(false), - AssetScriptKeyIsBurnCheck(true), + rpcassert.ListAssetsRPC( + t.t, ctx, t.tapd, + func(resp *taprpc.ListAssetResponse) error { + _, err := assetStateByScriptKey( + resp.Assets, burnedAsset.ScriptKey, + AssetAmountCheck(burnedAsset.Amount), + AssetTypeCheck( + burnedAsset.AssetGenesis.AssetType, + ), + AssetScriptKeyIsLocalCheck(false), + AssetScriptKeyIsBurnCheck(true), + ) + return err + }, + &taprpc.ListAssetRequest{ + IncludeSpent: true, + ScriptKeyType: allScriptKeysQuery, + }, ) // Our asset balance should have been decreased by the burned amount. @@ -511,7 +526,7 @@ func testBurnGroupedAssets(t *harnessTest) { // testFullBurnUTXO tests that we can burn the full amount of an asset UTXO. func testFullBurnUTXO(t *harnessTest) { - minerClient := t.lndHarness.Miner().Client + minerClient := t.lndHarness.Miner() ctx := context.Background() // Test 1: Burn the full amount of a simple asset. diff --git a/itest/collectible_split_test.go b/itest/collectible_split_test.go index 7752abe855..3a220e5585 100644 --- a/itest/collectible_split_test.go +++ b/itest/collectible_split_test.go @@ -11,12 +11,12 @@ import ( "testing" "time" - "github.com/btcsuite/btcd/rpcclient" "github.com/lightninglabs/taproot-assets/fn" "github.com/lightninglabs/taproot-assets/proof" "github.com/lightninglabs/taproot-assets/taprpc" "github.com/lightninglabs/taproot-assets/taprpc/mintrpc" unirpc "github.com/lightninglabs/taproot-assets/taprpc/universerpc" + lntestminer "github.com/lightningnetwork/lnd/lntest/miner" "github.com/lightningnetwork/lnd/lntest/wait" "github.com/stretchr/testify/require" "golang.org/x/exp/maps" @@ -27,7 +27,7 @@ import ( func testCollectibleSend(t *harnessTest) { // First, we'll make a collectible with emission enabled. rpcAssets := MintAssetsConfirmBatch( - t.t, t.lndHarness.Miner().Client, t.tapd, + t.t, t.lndHarness.Miner(), t.tapd, []*mintrpc.MintAssetRequest{ issuableAssets[1], // Our "passive" asset. @@ -85,7 +85,7 @@ func testCollectibleSend(t *harnessTest) { t, t.tapd, receiverAddr, ) ConfirmAndAssertOutboundTransfer( - t.t, t.lndHarness.Miner().Client, t.tapd, + t.t, t.lndHarness.Miner(), t.tapd, sendResp, genInfo.AssetId, []uint64{0, fullAmount}, senderTransferIdx, senderTransferIdx+1, @@ -114,7 +114,7 @@ func testCollectibleSend(t *harnessTest) { t, secondTapd, receiverAddr, ) ConfirmAndAssertOutboundTransfer( - t.t, t.lndHarness.Miner().Client, secondTapd, + t.t, t.lndHarness.Miner(), secondTapd, sendResp, genInfo.AssetId, []uint64{0, fullAmount}, receiverTransferIdx, receiverTransferIdx+1, @@ -195,7 +195,7 @@ func testCollectibleSend(t *harnessTest) { AssertAddrCreated(t.t, secondTapd, rpcAssets[1], bobAddr) sendResp, sendEvents := sendAssetsToAddr(t, t.tapd, bobAddr) ConfirmAndAssertOutboundTransfer( - t.t, t.lndHarness.Miner().Client, t.tapd, sendResp, + t.t, t.lndHarness.Miner(), t.tapd, sendResp, passiveGen.AssetId, []uint64{0, rpcAssets[1].Amount}, 2, 3, ) @@ -268,7 +268,7 @@ func testCollectibleGroupSend(t *harnessTest) { batchSize) mintBatch := MintAssetsConfirmBatch( - t.t, t.lndHarness.Miner().Client, t.tapd, batchReqs, + t.t, t.lndHarness.Miner(), t.tapd, batchReqs, WithMintingTimeout(minterTimeout), ) @@ -374,7 +374,7 @@ func testCollectibleGroupSend(t *harnessTest) { sendAssets( t.t, ctxb, numAssets, sendType, send, receive, - t.lndHarness.Miner().Client, + t.lndHarness.Miner(), ) t.Logf("Finished %d of %d send operations", i, numSends) @@ -385,7 +385,7 @@ func testCollectibleGroupSend(t *harnessTest) { // node to the other node. func sendAssets(t *testing.T, ctx context.Context, numAssets uint64, assetType taprpc.AssetType, send, receive *tapdHarness, - bitcoinClient *rpcclient.Client) { + bitcoinClient *lntestminer.HarnessMiner) { // Query the asset we'll be sending, so we can assert some things about // it later. diff --git a/itest/custom_channels/assertions.go b/itest/custom_channels/assertions.go index 78f75afeb1..03af96fe5d 100644 --- a/itest/custom_channels/assertions.go +++ b/itest/custom_channels/assertions.go @@ -8,7 +8,6 @@ import ( "time" "github.com/btcsuite/btcd/chaincfg/chainhash" - "github.com/btcsuite/btcd/rpcclient" "github.com/btcsuite/btcd/wire" "github.com/go-errors/errors" "github.com/lightninglabs/taproot-assets/itest" @@ -16,6 +15,7 @@ import ( "github.com/lightningnetwork/lnd/lnrpc" "github.com/lightningnetwork/lnd/lnrpc/walletrpc" "github.com/lightningnetwork/lnd/lntest" + lntestminer "github.com/lightningnetwork/lnd/lntest/miner" "github.com/lightningnetwork/lnd/lntest/wait" "github.com/stretchr/testify/require" ) @@ -297,7 +297,7 @@ func mineBlocksSlow(t *ccHarnessTest, net *itest.IntegratedNetworkHarness, var err error if numTxs > 0 { txids, err = waitForNTxsInMempool( - net.Miner.Client, numTxs, + net.Miner, numTxs, wait.MinerMempoolTimeout, ) require.NoError(t.t, err, "unable to find txns in mempool") @@ -307,18 +307,14 @@ func mineBlocksSlow(t *ccHarnessTest, net *itest.IntegratedNetworkHarness, blockHashes := make([]*chainhash.Hash, 0, num) for i := uint32(0); i < num; i++ { - generatedHashes, err := net.Miner.Client.Generate(1) - require.NoError(t.t, err, "generate blocks") + generatedHashes := net.Miner.GenerateBlocks(1) blockHashes = append(blockHashes, generatedHashes...) time.Sleep(slowMineDelay) } for i, blockHash := range blockHashes { - block, err := net.Miner.Client.GetBlock(blockHash) - require.NoError(t.t, err, "get blocks") - - blocks[i] = block + blocks[i] = net.Miner.GetBlock(blockHash) } // Assert that all the expected transactions were included in the first @@ -332,28 +328,28 @@ func mineBlocksSlow(t *ccHarnessTest, net *itest.IntegratedNetworkHarness, // waitForNTxsInMempool polls until finding the desired number of transactions // in the miner's mempool. -func waitForNTxsInMempool(minerClient *rpcclient.Client, n int, +func waitForNTxsInMempool(minerClient *lntestminer.HarnessMiner, n int, timeout time.Duration) ([]*chainhash.Hash, error) { breakTimeout := time.After(timeout) ticker := time.NewTicker(50 * time.Millisecond) defer ticker.Stop() - var err error - var mempool []*chainhash.Hash + var mempool []chainhash.Hash for { select { case <-breakTimeout: return nil, fmt.Errorf("wanted %v, found %v txs "+ "in mempool: %v", n, len(mempool), mempool) case <-ticker.C: - mempool, err = minerClient.GetRawMempool() - if err != nil { - return nil, err - } - + mempool = minerClient.GetRawMempool() if len(mempool) == n { - return mempool, nil + hashes := make([]*chainhash.Hash, len(mempool)) + for i := range mempool { + hashes[i] = &mempool[i] + } + + return hashes, nil } } } diff --git a/itest/custom_channels/balance_consistency_test.go b/itest/custom_channels/balance_consistency_test.go index 382ac9e1db..59193ccf11 100644 --- a/itest/custom_channels/balance_consistency_test.go +++ b/itest/custom_channels/balance_consistency_test.go @@ -51,7 +51,7 @@ func testCustomChannelsBalanceConsistency(ctx context.Context, // Mint an asset on Charlie and sync Dave to Charlie as the universe. mintedAssets := itest.MintAssetsConfirmBatch( - t.t, net.Miner.Client, asTapd(charlie), + t.t, net.Miner, asTapd(charlie), []*mintrpc.MintAssetRequest{ { Asset: ccItestAsset, diff --git a/itest/custom_channels/breach_test.go b/itest/custom_channels/breach_test.go index 454c56f776..4c41a63044 100644 --- a/itest/custom_channels/breach_test.go +++ b/itest/custom_channels/breach_test.go @@ -74,7 +74,7 @@ func testCustomChannelsBreach(ctx context.Context, // Now we'll make an asset for Charlie that we'll use in the test to // open a channel. mintedAssets := itest.MintAssetsConfirmBatch( - t.t, net.Miner.Client, asTapd(charlie), + t.t, net.Miner, asTapd(charlie), []*mintrpc.MintAssetRequest{ { Asset: ccItestAsset, @@ -199,7 +199,7 @@ func testCustomChannelsBreach(ctx context.Context, // We use a generous timeout because Charlie needs to process the // block, detect the breach, and construct the justice transaction. charlieJusticeTxid, err := waitForNTxsInMempool( - net.Miner.Client, 1, time.Second*30, + net.Miner, 1, time.Second*30, ) require.NoError(t.t, err) diff --git a/itest/custom_channels/core_test.go b/itest/custom_channels/core_test.go index 297ec404fc..75a3acc6b9 100644 --- a/itest/custom_channels/core_test.go +++ b/itest/custom_channels/core_test.go @@ -97,7 +97,7 @@ func testCustomChannels(ctx context.Context, // Mint an asset on Charlie and sync all nodes to Charlie as the // universe. mintedAssets := itest.MintAssetsConfirmBatch( - t.t, net.Miner.Client, asTapd(charlie), + t.t, net.Miner, asTapd(charlie), []*mintrpc.MintAssetRequest{ { Asset: ccItestAsset, diff --git a/itest/custom_channels/custom_channels_test.go b/itest/custom_channels/custom_channels_test.go index ee8cf93ed0..a4d7816c67 100644 --- a/itest/custom_channels/custom_channels_test.go +++ b/itest/custom_channels/custom_channels_test.go @@ -136,10 +136,12 @@ func TestCustomChannels(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() - // Step 1: Create and start a btcd miner. - m := miner.NewMiner(ctx, t) - require.NoError(t, m.SetUp(true, 50)) - require.NoError(t, m.Client.NotifyNewTransactions(false)) + // Step 1: Create and start a bitcoind miner. + m := miner.NewMinerWithConfig(ctx, t, &miner.MinerConfig{ + Backend: "bitcoind", + }) + require.NoError(t, m.Start(true, 50)) + require.NoError(t, m.NotifyNewTransactions(false)) t.Cleanup(func() { m.Stop() }) // Generate enough blocks so we're past the coinbase maturity window. diff --git a/itest/custom_channels/decode_invoice_test.go b/itest/custom_channels/decode_invoice_test.go index bcf9ebb064..720582f01f 100644 --- a/itest/custom_channels/decode_invoice_test.go +++ b/itest/custom_channels/decode_invoice_test.go @@ -75,7 +75,7 @@ func testCustomChannelsDecodeAssetInvoice(_ context.Context, // Mint an asset on Alice and sync universes. mintedAssets := itest.MintAssetsConfirmBatch( - t.t, net.Miner.Client, asTapd(alice), + t.t, net.Miner, asTapd(alice), []*mintrpc.MintAssetRequest{ { Asset: tcAsset, diff --git a/itest/custom_channels/fee_test.go b/itest/custom_channels/fee_test.go index f72e3be063..97712b8683 100644 --- a/itest/custom_channels/fee_test.go +++ b/itest/custom_channels/fee_test.go @@ -48,7 +48,7 @@ func testCustomChannelsFee(ctx context.Context, // Mint an asset on Charlie and sync Dave to Charlie as the universe. mintedAssets := itest.MintAssetsConfirmBatch( - t.t, net.Miner.Client, asTapd(charlie), + t.t, net.Miner, asTapd(charlie), []*mintrpc.MintAssetRequest{ { Asset: ccItestAsset, diff --git a/itest/custom_channels/force_close_test.go b/itest/custom_channels/force_close_test.go index 8b751618bf..419a41227f 100644 --- a/itest/custom_channels/force_close_test.go +++ b/itest/custom_channels/force_close_test.go @@ -60,7 +60,7 @@ func testCustomChannelsForceClose(ctx context.Context, // Now we'll make an asset for Charlie that we'll use in the test to // open a channel. mintedAssets := itest.MintAssetsConfirmBatch( - t.t, net.Miner.Client, asTapd(charlie), + t.t, net.Miner, asTapd(charlie), []*mintrpc.MintAssetRequest{ { Asset: ccItestAsset, @@ -227,7 +227,7 @@ func testCustomChannelsForceClose(ctx context.Context, // We should also have a new sweep transaction in the mempool. _, err = waitForNTxsInMempool( - net.Miner.Client, 1, ccShortTimeout, + net.Miner, 1, ccShortTimeout, ) require.NoError(t.t, err) @@ -251,7 +251,7 @@ func testCustomChannelsForceClose(ctx context.Context, // We expect that Charlie's sweep transaction has been broadcast. charlieSweepTxid, err := waitForNTxsInMempool( - net.Miner.Client, 1, ccShortTimeout, + net.Miner, 1, ccShortTimeout, ) require.NoError(t.t, err) @@ -295,7 +295,7 @@ func testCustomChannelsForceClose(ctx context.Context, }) require.NoError(t.t, err) itest.ConfirmAndAssertOutboundTransfer( - t.t, net.Miner.Client, asTapd(dave), sendResp, assetID, + t.t, net.Miner, asTapd(dave), sendResp, assetID, []uint64{1, assetSendAmount}, 2, 3, ) itest.AssertNonInteractiveRecvComplete(t.t, asTapd(zane), 1) @@ -322,7 +322,7 @@ func testCustomChannelsForceClose(ctx context.Context, }) require.NoError(t.t, err) itest.ConfirmAndAssertOutboundTransfer( - t.t, net.Miner.Client, asTapd(charlie), sendResp2, assetID, + t.t, net.Miner, asTapd(charlie), sendResp2, assetID, []uint64{1, assetSendAmount}, 3, 4, ) itest.AssertNonInteractiveRecvComplete(t.t, asTapd(zane), 2) diff --git a/itest/custom_channels/forward_bandwidth_test.go b/itest/custom_channels/forward_bandwidth_test.go index 7e87bc0e5c..f0c7b4b344 100644 --- a/itest/custom_channels/forward_bandwidth_test.go +++ b/itest/custom_channels/forward_bandwidth_test.go @@ -85,7 +85,7 @@ func testCustomChannelsForwardBandwidth(ctx context.Context, // Mint an asset on Charlie and sync all nodes to Charlie as the // universe. mintedAssets := itest.MintAssetsConfirmBatch( - t.t, net.Miner.Client, asTapd(charlie), + t.t, net.Miner, asTapd(charlie), []*mintrpc.MintAssetRequest{ { Asset: ccItestAsset, diff --git a/itest/custom_channels/forwarding_history_test.go b/itest/custom_channels/forwarding_history_test.go index 2ffbe1682e..d7e3ba66b4 100644 --- a/itest/custom_channels/forwarding_history_test.go +++ b/itest/custom_channels/forwarding_history_test.go @@ -73,7 +73,7 @@ func testCustomChannelsForwardingHistory(ctx context.Context, // Mint an asset on Charlie and sync universes. mintedAssets := itest.MintAssetsConfirmBatch( - t.t, net.Miner.Client, asTapd(charlie), + t.t, net.Miner, asTapd(charlie), []*mintrpc.MintAssetRequest{ { Asset: ccItestAsset, diff --git a/itest/custom_channels/group_tranches_force_close_test.go b/itest/custom_channels/group_tranches_force_close_test.go index aaf113b381..e088f11320 100644 --- a/itest/custom_channels/group_tranches_force_close_test.go +++ b/itest/custom_channels/group_tranches_force_close_test.go @@ -79,7 +79,7 @@ func testCustomChannelsGroupTranchesForceClose(ctx context.Context, // Mint the asset tranches 1 and 2 on Charlie and sync all nodes to // Charlie as the universe. mintedAssetsT1 := itest.MintAssetsConfirmBatch( - t.t, net.Miner.Client, asTapd(charlie), + t.t, net.Miner, asTapd(charlie), []*mintrpc.MintAssetRequest{groupAssetReq}, ) centsT1 := mintedAssetsT1[0] @@ -94,7 +94,7 @@ func testCustomChannelsGroupTranchesForceClose(ctx context.Context, groupAssetReq.Asset.Name = "itest-asset-cents-tranche-2" mintedAssetsT2 := itest.MintAssetsConfirmBatch( - t.t, net.Miner.Client, asTapd(charlie), + t.t, net.Miner, asTapd(charlie), []*mintrpc.MintAssetRequest{groupAssetReq}, ) centsT2 := mintedAssetsT2[0] @@ -241,7 +241,7 @@ func testCustomChannelsGroupTranchesForceClose(ctx context.Context, // We should also have a new sweep transaction in the mempool. fabiaSweepTxid, err := waitForNTxsInMempool( - net.Miner.Client, 1, ccShortTimeout, + net.Miner, 1, ccShortTimeout, ) require.NoError(t.t, err) @@ -261,7 +261,7 @@ func testCustomChannelsGroupTranchesForceClose(ctx context.Context, // We expect that Erin's sweep transaction has been broadcast. _, err = waitForNTxsInMempool( - net.Miner.Client, 1, ccShortTimeout, + net.Miner, 1, ccShortTimeout, ) require.NoError(t.t, err) diff --git a/itest/custom_channels/group_tranches_htlc_force_close_test.go b/itest/custom_channels/group_tranches_htlc_force_close_test.go index 45427f7aeb..34b826b22c 100644 --- a/itest/custom_channels/group_tranches_htlc_force_close_test.go +++ b/itest/custom_channels/group_tranches_htlc_force_close_test.go @@ -80,7 +80,7 @@ func testCustomChannelsGroupTranchesHtlcForceClose(ctx context.Context, // Mint the asset tranches 1 and 2 on Charlie and sync all nodes to // Charlie as the universe. mintedAssetsT1 := itest.MintAssetsConfirmBatch( - t.t, net.Miner.Client, asTapd(charlie), + t.t, net.Miner, asTapd(charlie), []*mintrpc.MintAssetRequest{groupAssetReq}, ) centsT1 := mintedAssetsT1[0] @@ -95,7 +95,7 @@ func testCustomChannelsGroupTranchesHtlcForceClose(ctx context.Context, groupAssetReq.Asset.Name = "itest-asset-cents-tranche-2" mintedAssetsT2 := itest.MintAssetsConfirmBatch( - t.t, net.Miner.Client, asTapd(charlie), + t.t, net.Miner, asTapd(charlie), []*mintrpc.MintAssetRequest{groupAssetReq}, ) centsT2 := mintedAssetsT2[0] diff --git a/itest/custom_channels/grouped_asset_test.go b/itest/custom_channels/grouped_asset_test.go index 6f337b26b7..0049d28802 100644 --- a/itest/custom_channels/grouped_asset_test.go +++ b/itest/custom_channels/grouped_asset_test.go @@ -90,7 +90,7 @@ func testCustomChannelsGroupedAsset(_ context.Context, // Mint an asset on Charlie and sync all nodes to Charlie as the // universe. mintedAssets := itest.MintAssetsConfirmBatch( - t.t, net.Miner.Client, asTapd(charlie), + t.t, net.Miner, asTapd(charlie), []*mintrpc.MintAssetRequest{groupAssetReq}, ) diff --git a/itest/custom_channels/helpers.go b/itest/custom_channels/helpers.go index cff40b3e9b..861f9d5c6f 100644 --- a/itest/custom_channels/helpers.go +++ b/itest/custom_channels/helpers.go @@ -721,6 +721,33 @@ func assertPaymentHtlcAssets(t *testing.T, node *itest.IntegratedNode, require.InDelta(t, assetAmount, totalAssetAmount, 1) } +// waitForPaymentTerminal waits for the tracked payment to leave the in-flight +// state after a hodl invoice is canceled or settled. +func waitForPaymentTerminal(t *testing.T, node *itest.IntegratedNode, + payHash []byte) *lnrpc.Payment { + + t.Helper() + + ctxb := context.Background() + ctxt, cancel := context.WithTimeout(ctxb, wait.DefaultTimeout) + defer cancel() + + stream, err := node.RouterClient.TrackPaymentV2( + ctxt, &routerrpc.TrackPaymentRequest{ + PaymentHash: payHash, + NoInflightUpdates: true, + }, + ) + require.NoError(t, err) + + payment, err := stream.Recv() + require.NoError(t, err) + require.NotNil(t, payment) + require.NotEqual(t, lnrpc.Payment_IN_FLIGHT, payment.Status) + + return payment +} + // assertAssetChan asserts that the channel between src and dst has the expected // funding amount and assets. func assertAssetChan(t *testing.T, src, dst *itest.IntegratedNode, @@ -1869,7 +1896,7 @@ func createTestAssetNetwork(t *ccHarnessTest, }) require.NoError(t.t, err) itest.ConfirmAndAssertOutboundTransfer( - t.t, net.Miner.Client, asTapd(charlie), sendResp, assetID, + t.t, net.Miner, asTapd(charlie), sendResp, assetID, []uint64{mintedAsset.Amount - assetSendAmount, assetSendAmount}, 0, 1, ) @@ -1894,7 +1921,7 @@ func createTestAssetNetwork(t *ccHarnessTest, }) require.NoError(t.t, err) itest.ConfirmAndAssertOutboundTransfer( - t.t, net.Miner.Client, asTapd(charlie), sendResp, assetID, + t.t, net.Miner, asTapd(charlie), sendResp, assetID, []uint64{ mintedAsset.Amount - 2*assetSendAmount, assetSendAmount, }, 1, 2, @@ -2950,7 +2977,7 @@ func assertForceCloseSweeps(ctx context.Context, ) _, err = waitForNTxsInMempool( - net.Miner.Client, 1, ccShortTimeout, + net.Miner, 1, ccShortTimeout, ) require.NoError(t.t, err) @@ -2964,7 +2991,7 @@ func assertForceCloseSweeps(ctx context.Context, // mempool: Bob's incoming HTLC sweep directly off the commitment // transaction. _, err = waitForNTxsInMempool( - net.Miner.Client, 1, ccShortTimeout, + net.Miner, 1, ccShortTimeout, ) require.NoError(t.t, err) @@ -3000,7 +3027,7 @@ func assertForceCloseSweeps(ctx context.Context, mineBlocks(t, net, 1, 0) _, err = waitForNTxsInMempool( - net.Miner.Client, 1, ccShortTimeout, + net.Miner, 1, ccShortTimeout, ) require.NoError(t.t, err) @@ -3047,7 +3074,7 @@ func assertForceCloseSweeps(ctx context.Context, // one final block which will confirm Alice's sweep transaction. if len(sweepBlocks[0].Transactions) == 1 { _, err := waitForNTxsInMempool( - net.Miner.Client, 1, ccShortTimeout, + net.Miner, 1, ccShortTimeout, ) require.NoError(t.t, err) @@ -3084,7 +3111,7 @@ func assertForceCloseSweeps(ctx context.Context, // one final block which will confirm Alice's sweep transaction. if len(sweepBlocks[0].Transactions) == 1 { _, err := waitForNTxsInMempool( - net.Miner.Client, 1, ccShortTimeout, + net.Miner, 1, ccShortTimeout, ) require.NoError(t.t, err) @@ -3129,7 +3156,7 @@ func assertForceCloseSweeps(ctx context.Context, t.Logf("Confirming initial HTLC timeout txns") timeoutSweeps, err := waitForNTxsInMempool( - net.Miner.Client, 2, ccShortTimeout, + net.Miner, 2, ccShortTimeout, ) require.NoError(t.t, err) @@ -3181,7 +3208,7 @@ func assertForceCloseSweeps(ctx context.Context, t.Logf("Confirming additional HTLC timeout sweep txns") additionalTimeoutSweeps, err := waitForNTxsInMempool( - net.Miner.Client, 1, ccShortTimeout, + net.Miner, 1, ccShortTimeout, ) require.NoError(t.t, err) @@ -3222,7 +3249,7 @@ func assertForceCloseSweeps(ctx context.Context, // one final block which will confirm Alice's sweep transaction. if len(sweepBlocks[0].Transactions) == 1 { _, err := waitForNTxsInMempool( - net.Miner.Client, 1, ccShortTimeout, + net.Miner, 1, ccShortTimeout, ) require.NoError(t.t, err) @@ -3286,7 +3313,7 @@ func sendAssetsAndAssert(ctx context.Context, t *ccHarnessTest, ) require.NoError(t.t, err) itest.ConfirmAndAssertOutboundTransfer( - t.t, t.lndHarness.Miner.Client, asTapd(sender), sendResp, + t.t, t.lndHarness.Miner, asTapd(sender), sendResp, assetID, []uint64{mintedAsset.Amount - totalSent, assetSendAmount}, idx, idx+1, @@ -3594,7 +3621,7 @@ func createTestMultiRFQAssetNetwork(t *ccHarnessTest, ) require.NoError(t.t, err) itest.ConfirmAndAssertOutboundTransfer( - t.t, net.Miner.Client, asTapd(charlie), sendResp, + t.t, net.Miner, asTapd(charlie), sendResp, assetID, []uint64{ mintedAsset.Amount - diff --git a/itest/custom_channels/htlc_force_close_test.go b/itest/custom_channels/htlc_force_close_test.go index 678da6e146..0d24525c71 100644 --- a/itest/custom_channels/htlc_force_close_test.go +++ b/itest/custom_channels/htlc_force_close_test.go @@ -66,7 +66,7 @@ func runCustomChannelsHtlcForceClose(ctx context.Context, t *ccHarnessTest, // Next, we'll mint an asset for Alice, who will be the node that opens // the channel outbound. mintedAssets := itest.MintAssetsConfirmBatch( - t.t, net.Miner.Client, asTapd(alice), + t.t, net.Miner, asTapd(alice), []*mintrpc.MintAssetRequest{ { Asset: ccItestAsset, diff --git a/itest/custom_channels/large_test.go b/itest/custom_channels/large_test.go index 1fa0f0b568..6063ca3270 100644 --- a/itest/custom_channels/large_test.go +++ b/itest/custom_channels/large_test.go @@ -81,7 +81,7 @@ func testCustomChannelsLarge(_ context.Context, // Mint an asset on Charlie and sync all nodes to Charlie as the // universe. mintedAssets := itest.MintAssetsConfirmBatch( - t.t, net.Miner.Client, asTapd(charlie), + t.t, net.Miner, asTapd(charlie), []*mintrpc.MintAssetRequest{ { Asset: ccItestAsset, diff --git a/itest/custom_channels/liquidity_test.go b/itest/custom_channels/liquidity_test.go index 27c1b0b6cb..0eca67087e 100644 --- a/itest/custom_channels/liquidity_test.go +++ b/itest/custom_channels/liquidity_test.go @@ -106,7 +106,7 @@ func testCustomChannelsLiquidityEdgeCasesCore(ctx context.Context, // Mint an asset on Charlie and sync all nodes to Charlie as the // universe. mintedAssets := itest.MintAssetsConfirmBatch( - t.t, net.Miner.Client, asTapd(charlie), + t.t, net.Miner, asTapd(charlie), []*mintrpc.MintAssetRequest{assetReq}, ) cents := mintedAssets[0] @@ -636,7 +636,13 @@ func testCustomChannelsLiquidityEdgeCasesCore(ctx context.Context, ) require.NoError(t.t, err) - // Let's assert that Erin cancelled all his HTLCs. + // Wait for Charlie's canceled hodl payment to finish unwinding before + // sending the follow-up probe payment. + waitForPaymentTerminal(t.t, charlie, payHash[:]) + + // Let's assert that the canceled HTLCs have cleared from the route. + assertNumHtlcs(t.t, charlie, 0) + assertNumHtlcs(t.t, dave, 0) assertNumHtlcs(t.t, erin, 0) logBalance(t.t, nodes, assetID, "after hodl cancel & 0 present HTLCs") diff --git a/itest/custom_channels/multi_channel_pathfinding_test.go b/itest/custom_channels/multi_channel_pathfinding_test.go index 79e36ab5cf..89337b9a5c 100644 --- a/itest/custom_channels/multi_channel_pathfinding_test.go +++ b/itest/custom_channels/multi_channel_pathfinding_test.go @@ -57,7 +57,7 @@ func testCustomChannelsMultiChannelPathfinding(ctx context.Context, // Next, we'll mint an asset for Alice, who will be the node that opens // the channel outbound. mintedAssets1 := itest.MintAssetsConfirmBatch( - t.t, net.Miner.Client, asTapd(alice), + t.t, net.Miner, asTapd(alice), []*mintrpc.MintAssetRequest{ { Asset: ccItestAsset, @@ -69,7 +69,7 @@ func testCustomChannelsMultiChannelPathfinding(ctx context.Context, // We'll mint a second asset, representing british pences. mintedAssets2 := itest.MintAssetsConfirmBatch( - t.t, net.Miner.Client, asTapd(alice), + t.t, net.Miner, asTapd(alice), []*mintrpc.MintAssetRequest{ { Asset: &mintrpc.MintAsset{ diff --git a/itest/custom_channels/multi_rfq_test.go b/itest/custom_channels/multi_rfq_test.go index 1beb84b2a7..e53b4f5266 100644 --- a/itest/custom_channels/multi_rfq_test.go +++ b/itest/custom_channels/multi_rfq_test.go @@ -79,7 +79,7 @@ func testCustomChannelsMultiRFQ(_ context.Context, // Mint an asset on Charlie and sync all nodes to Charlie as the // universe. mintedAssets := itest.MintAssetsConfirmBatch( - t.t, net.Miner.Client, asTapd(charlie), + t.t, net.Miner, asTapd(charlie), []*mintrpc.MintAssetRequest{assetReq}, ) cents := mintedAssets[0] diff --git a/itest/custom_channels/oracle_pricing_test.go b/itest/custom_channels/oracle_pricing_test.go index 2df3fc93c6..57b039473d 100644 --- a/itest/custom_channels/oracle_pricing_test.go +++ b/itest/custom_channels/oracle_pricing_test.go @@ -116,7 +116,7 @@ func testCustomChannelsOraclePricing(_ context.Context, // Mint an asset on Charlie and sync Dave to Charlie as the universe. mintedAssets := itest.MintAssetsConfirmBatch( - t.t, net.Miner.Client, asTapd(charlie), + t.t, net.Miner, asTapd(charlie), []*mintrpc.MintAssetRequest{ { Asset: tcAsset, diff --git a/itest/custom_channels/self_payment_test.go b/itest/custom_channels/self_payment_test.go index d550cc114d..7fbb2ce681 100644 --- a/itest/custom_channels/self_payment_test.go +++ b/itest/custom_channels/self_payment_test.go @@ -59,7 +59,7 @@ func testCustomChannelsSelfPayment(_ context.Context, // Next, we'll mint an asset for Alice, who will be the node that opens // the channel outbound. mintedAssets := itest.MintAssetsConfirmBatch( - t.t, net.Miner.Client, asTapd(alice), + t.t, net.Miner, asTapd(alice), []*mintrpc.MintAssetRequest{ { Asset: ccItestAsset, diff --git a/itest/custom_channels/single_asset_multi_input_test.go b/itest/custom_channels/single_asset_multi_input_test.go index 700b5929c3..333ea7b961 100644 --- a/itest/custom_channels/single_asset_multi_input_test.go +++ b/itest/custom_channels/single_asset_multi_input_test.go @@ -48,7 +48,7 @@ func testCustomChannelsSingleAssetMultiInput(ctx context.Context, // Mint an assets on Charlie and sync Dave to Charlie as the universe. mintedAssets := itest.MintAssetsConfirmBatch( - t.t, net.Miner.Client, asTapd(charlie), + t.t, net.Miner, asTapd(charlie), []*mintrpc.MintAssetRequest{ { Asset: ccItestAsset, @@ -105,7 +105,7 @@ func testCustomChannelsSingleAssetMultiInput(ctx context.Context, ) require.NoError(t.t, err) itest.ConfirmAndAssertOutboundTransferWithOutputs( - t.t, net.Miner.Client, asTapd(charlie), sendResp, assetID, + t.t, net.Miner, asTapd(charlie), sendResp, assetID, []uint64{ cents.Amount - 2*halfCentsAmount, halfCentsAmount, halfCentsAmount, diff --git a/itest/custom_channels/strict_forwarding_test.go b/itest/custom_channels/strict_forwarding_test.go index c0b5b7bcd6..2fd5b8bb2b 100644 --- a/itest/custom_channels/strict_forwarding_test.go +++ b/itest/custom_channels/strict_forwarding_test.go @@ -97,7 +97,7 @@ func testCustomChannelsStrictForwarding(_ context.Context, // Mint an asset on Charlie and sync all nodes to Charlie as the // universe. mintedAssets := itest.MintAssetsConfirmBatch( - t.t, net.Miner.Client, asTapd(charlie), + t.t, net.Miner, asTapd(charlie), []*mintrpc.MintAssetRequest{ { Asset: ccItestAsset, diff --git a/itest/custom_channels/v1_upgrade_test.go b/itest/custom_channels/v1_upgrade_test.go index 2930666372..4e62d50cc8 100644 --- a/itest/custom_channels/v1_upgrade_test.go +++ b/itest/custom_channels/v1_upgrade_test.go @@ -63,7 +63,7 @@ func testCustomChannelsV1Upgrade(ctx context.Context, // Now we'll make an asset for Charlie that we'll use in the test to // open a channel. mintedAssets := itest.MintAssetsConfirmBatch( - t.t, net.Miner.Client, asTapd(charlie), + t.t, net.Miner, asTapd(charlie), []*mintrpc.MintAssetRequest{ { Asset: ccItestAsset, @@ -272,7 +272,7 @@ func testCustomChannelsV1Upgrade(ctx context.Context, // With the breach transaction mined, Dave should now have a // transaction in the mempool sweeping *both* commitment outputs. daveJusticeTxid, err := waitForNTxsInMempool( - net.Miner.Client, 1, time.Second*5, + net.Miner, 1, time.Second*5, ) require.NoError(t.t, err) diff --git a/itest/fee_estimation_test.go b/itest/fee_estimation_test.go index d7c36f170a..e9592d648f 100644 --- a/itest/fee_estimation_test.go +++ b/itest/fee_estimation_test.go @@ -62,7 +62,7 @@ func testFeeEstimation(t *harnessTest) { // Mint some assets with a NP2WPKH input, which will give us an anchor // output to spend for a transfer. rpcAssets := MintAssetsConfirmBatch( - t.t, t.lndHarness.Miner().Client, t.tapd, simpleAssets, + t.t, t.lndHarness.Miner(), t.tapd, simpleAssets, ) normalAsset := rpcAssets[0] normalAssetId := normalAsset.AssetGenesis.AssetId @@ -76,7 +76,7 @@ func testFeeEstimation(t *harnessTest) { // not adjust the fee rate of the TX after it was funded by our backing // wallet. AssertFeeRate( - t.t, t.lndHarness.Miner().Client, anchorAmounts[0], + t.t, t.lndHarness.Miner(), anchorAmounts[0], &mintOutpoint.Hash, defaultFeeRate, ) @@ -94,7 +94,7 @@ func testFeeEstimation(t *harnessTest) { transferIdx := 0 ConfirmAndAssertOutboundTransfer( - t.t, t.lndHarness.Miner().Client, t.tapd, sendResp, + t.t, t.lndHarness.Miner(), t.tapd, sendResp, normalAssetId, []uint64{splitAmount, splitAmount}, transferIdx, transferIdx+1, ) @@ -105,7 +105,7 @@ func testFeeEstimation(t *harnessTest) { sendInputAmt := anchorAmounts[1] + 1000 AssertTransferFeeRate( - t.t, t.lndHarness.Miner().Client, sendResp, sendInputAmt, + t.t, t.lndHarness.Miner(), sendResp, sendInputAmt, defaultFeeRate, ) @@ -124,7 +124,7 @@ func testFeeEstimation(t *harnessTest) { sendResp, sendEvents = sendAssetsToAddr(t, t.tapd, addr2) ConfirmAndAssertOutboundTransfer( - t.t, t.lndHarness.Miner().Client, t.tapd, sendResp, + t.t, t.lndHarness.Miner(), t.tapd, sendResp, normalAssetId, []uint64{secondSplitAmount, secondSplitAmount}, transferIdx, transferIdx+1, ) @@ -135,7 +135,7 @@ func testFeeEstimation(t *harnessTest) { sendInputAmt = anchorAmounts[2] + 1000 AssertTransferFeeRate( - t.t, t.lndHarness.Miner().Client, sendResp, sendInputAmt, + t.t, t.lndHarness.Miner(), sendResp, sendInputAmt, higherFeeRate, ) @@ -179,7 +179,7 @@ func testFeeEstimation(t *harnessTest) { sendResp, sendEvents = sendAssetsToAddr(t, t.tapd, addr3) ConfirmAndAssertOutboundTransfer( - t.t, t.lndHarness.Miner().Client, t.tapd, sendResp, + t.t, t.lndHarness.Miner(), t.tapd, sendResp, normalAssetId, []uint64{ splitAmount - thirdSplitAmount, thirdSplitAmount, }, transferIdx, transferIdx+1, @@ -191,7 +191,7 @@ func testFeeEstimation(t *harnessTest) { sendInputAmt = initialUTXOs[3].Amount + 1000 AssertTransferFeeRate( - t.t, t.lndHarness.Miner().Client, sendResp, sendInputAmt, + t.t, t.lndHarness.Miner(), sendResp, sendInputAmt, lowFeeRate, ) } diff --git a/itest/full_value_split_test.go b/itest/full_value_split_test.go index 14184fecaf..998dd4a835 100644 --- a/itest/full_value_split_test.go +++ b/itest/full_value_split_test.go @@ -15,7 +15,7 @@ func testFullValueSend(t *harnessTest) { // First, we'll make a normal assets with enough units to allow us to // send it around a few times. rpcAssets := MintAssetsConfirmBatch( - t.t, t.lndHarness.Miner().Client, t.tapd, + t.t, t.lndHarness.Miner(), t.tapd, []*mintrpc.MintAssetRequest{ simpleAssets[0], issuableAssets[0], }, @@ -101,7 +101,7 @@ func runFullValueSendTests(t *harnessTest, alice, bob *tapdHarness, t, alice, receiverAddr, ) ConfirmAndAssertOutboundTransfer( - t.t, t.lndHarness.Miner().Client, alice, + t.t, t.lndHarness.Miner(), alice, sendResp, genInfo.AssetId, []uint64{0, fullAmount}, senderTransferIdx, senderTransferIdx+1, @@ -128,7 +128,7 @@ func runFullValueSendTests(t *harnessTest, alice, bob *tapdHarness, t, bob, receiverAddr, ) ConfirmAndAssertOutboundTransfer( - t.t, t.lndHarness.Miner().Client, bob, sendResp, + t.t, t.lndHarness.Miner(), bob, sendResp, genInfo.AssetId, []uint64{0, fullAmount}, receiverTransferIdx, receiverTransferIdx+1, ) diff --git a/itest/integrated_harness.go b/itest/integrated_harness.go index c1e3d1b15a..79f6be2640 100644 --- a/itest/integrated_harness.go +++ b/itest/integrated_harness.go @@ -274,13 +274,13 @@ func (h *IntegratedNetworkHarness) SendCoins(t *testing.T, PkScript: addrScript, Value: int64(amt), } - _, err = h.Miner.SendOutputs([]*wire.TxOut{output}, 7500) + tx := h.Miner.CreateTransaction([]*wire.TxOut{output}, 7500) + _, err = h.Miner.SendRawTransaction(tx, true) require.NoErrorf(t, err, "unable to send coins to %s", target.Cfg.Name) // Mine 6 blocks for confirmation. - _, err = h.Miner.Client.Generate(6) - require.NoError(t, err, "unable to generate blocks") + h.Miner.GenerateBlocks(6) // Wait for confirmed balance to reflect the deposit. expectedBalance := btcutil.Amount( diff --git a/itest/integration_test.go b/itest/integration_test.go index 50820c3a5a..43d2a6a4b7 100644 --- a/itest/integration_test.go +++ b/itest/integration_test.go @@ -10,6 +10,7 @@ import ( "github.com/lightninglabs/taproot-assets/taprpc" "github.com/lightningnetwork/lnd/lntest" + lntestminer "github.com/lightningnetwork/lnd/lntest/miner" "github.com/stretchr/testify/require" "golang.org/x/exp/rand" ) @@ -54,6 +55,12 @@ var ( "runtranche", defaultRunTranche, "run the tranche of the "+ "split test cases with the given (0-based) index", ) + + // minerBackendFlag selects the lntest miner backend to use. If unset, + // lnd's default btcd-backed miner is used. + minerBackendFlag = flag.String( + "minerbackend", "", "set the lntest miner backend to use", + ) ) // TestTaprootAssetsDaemon performs a series of integration tests amongst a @@ -80,8 +87,15 @@ func TestTaprootAssetsDaemon(t *testing.T) { // Now we can set up our test harness (LND instance), with the chain // backend we just created. feeService := lntest.NewFeeService(t) - lndHarness := lntest.SetupHarness( - t, "./lnd-itest", "bbolt", true, feeService, + var minerCfg *lntestminer.MinerConfig + if minerBackendFlag != nil && *minerBackendFlag != "" { + minerCfg = &lntestminer.MinerConfig{ + Backend: *minerBackendFlag, + } + } + + lndHarness := lntest.SetupHarnessWithMinerConfig( + t, "./lnd-itest", "bbolt", true, feeService, minerCfg, ) t.Cleanup(func() { lndHarness.CleanShutDown() diff --git a/itest/mint_batch_stress_test.go b/itest/mint_batch_stress_test.go index 307c96333b..20f32bf4de 100644 --- a/itest/mint_batch_stress_test.go +++ b/itest/mint_batch_stress_test.go @@ -65,7 +65,7 @@ func testMintBatchNStressTest(t *harnessTest, batchSize int, mintBatches := func(reqs []*mintrpc.MintAssetRequest) []*taprpc.Asset { return MintAssetsConfirmBatch( - t.t, t.lndHarness.Miner().Client, t.tapd, reqs, + t.t, t.lndHarness.Miner(), t.tapd, reqs, WithMintingTimeout(timeout), ) } diff --git a/itest/mint_fund_seal_test.go b/itest/mint_fund_seal_test.go index b93a8bc275..0b652af0e0 100644 --- a/itest/mint_fund_seal_test.go +++ b/itest/mint_fund_seal_test.go @@ -314,10 +314,10 @@ func testMintFundSealAssets(t *harnessTest) { } batchTXID, batchKey := FinalizeBatchUnconfirmed( - t.t, t.lndHarness.Miner().Client, aliceTapd, assetReqs, + t.t, t.lndHarness.Miner(), aliceTapd, assetReqs, ) batchAssets := ConfirmBatch( - t.t, t.lndHarness.Miner().Client, aliceTapd, assetReqs, sub, + t.t, t.lndHarness.Miner(), aliceTapd, assetReqs, sub, batchTXID, batchKey, ) assetTweakedScriptKey, err := fn.First( @@ -452,7 +452,7 @@ func testMintFundSealAssets(t *harnessTest) { require.True(t.t, ok) anchorInputWitness := signMultisigAnchorScript( - t.t, aliceLnd.RPC, regtestParams, transferPkt, assetInputIdx, + t.t, aliceLnd.RPC, harnessNetParams, transferPkt, assetInputIdx, firstAnchorInternal, secondAnchorInternal, anchorUTXO, anchorMultisigScript, ) @@ -475,7 +475,7 @@ func testMintFundSealAssets(t *harnessTest) { transferAmount := assetTweakedScriptKey.Amount / 2 numOutputs := 2 ConfirmAndAssertOutboundTransferWithOutputs( - t.t, t.lndHarness.Miner().Client, aliceTapd, logResp, + t.t, t.lndHarness.Miner(), aliceTapd, logResp, assetTweakedScriptKey.AssetGenesis.AssetId, []uint64{transferAmount, transferAmount}, 0, 1, numOutputs, ) diff --git a/itest/multi_asset_group_test.go b/itest/multi_asset_group_test.go index f96e696b0a..df86fa3170 100644 --- a/itest/multi_asset_group_test.go +++ b/itest/multi_asset_group_test.go @@ -40,7 +40,7 @@ func testMintMultiAssetGroups(t *harnessTest) { // now be aware of 3 asset groups. Each group should have a different // number of assets, and a different total balance. mintedBatch := MintAssetsConfirmBatch( - t.t, t.lndHarness.Miner().Client, t.tapd, complexBatch, + t.t, t.lndHarness.Miner(), t.tapd, complexBatch, ) // Once the batch is minted, we can verify that all asset groups were @@ -122,7 +122,7 @@ func testMintMultiAssetGroups(t *harnessTest) { t, t.tapd, bobNormalAddr, ) ConfirmAndAssertOutboundTransfer( - t.t, t.lndHarness.Miner().Client, t.tapd, normalGroupSend, + t.t, t.lndHarness.Miner(), t.tapd, normalGroupSend, normalMember.AssetGenesis.AssetId, []uint64{0, normalMember.Amount}, 0, 1, ) @@ -162,7 +162,7 @@ func testMintMultiAssetGroups(t *harnessTest) { t, t.tapd, bobCollectAddr, ) ConfirmAndAssertOutboundTransfer( - t.t, t.lndHarness.Miner().Client, t.tapd, collectGroupSend, + t.t, t.lndHarness.Miner(), t.tapd, collectGroupSend, collectMember.AssetGenesis.AssetId, []uint64{0, collectMember.Amount}, 1, 2, ) @@ -259,7 +259,7 @@ func testMintMultiAssetGroupErrors(t *harnessTest) { // The assets should be minted into the same group. rpcGroupedAssets := MintAssetsConfirmBatch( - t.t, t.lndHarness.Miner().Client, t.tapd, multiAssetGroup, + t.t, t.lndHarness.Miner(), t.tapd, multiAssetGroup, ) AssertNumGroups(t.t, t.tapd, 1) groupKey := rpcGroupedAssets[0].AssetGroup.TweakedGroupKey @@ -286,7 +286,7 @@ func testMultiAssetGroupSend(t *harnessTest) { // The minted batch should contain 51 assets total, and the daemon // should now be aware of one asset group. mintedBatch := MintAssetsConfirmBatch( - t.t, t.lndHarness.Miner().Client, t.tapd, collectibleGroup, + t.t, t.lndHarness.Miner(), t.tapd, collectibleGroup, ) require.Len(t.t, mintedBatch, collectibleGroupMembers+1) @@ -357,7 +357,7 @@ func testMultiAssetGroupSend(t *harnessTest) { sendResp, sendEvents := sendAssetsToAddr(t, t.tapd, addr) ConfirmAndAssertOutboundTransfer( - t.t, t.lndHarness.Miner().Client, t.tapd, + t.t, t.lndHarness.Miner(), t.tapd, sendResp, genInfo.AssetId, []uint64{0, numUnits}, i, i+1, ) diff --git a/itest/multi_send_test.go b/itest/multi_send_test.go index bce8a903ab..1dc2f95be0 100644 --- a/itest/multi_send_test.go +++ b/itest/multi_send_test.go @@ -92,7 +92,7 @@ func testAnchorMultipleVirtualTransactions(t *harnessTest) { // In our first batch we create multiple units of the grouped asset X // and Y as well as a passive asset P. firstBatch := MintAssetsConfirmBatch( - t.t, t.lndHarness.Miner().Client, t.tapd, + t.t, t.lndHarness.Miner(), t.tapd, []*mintrpc.MintAssetRequest{ { Asset: assetXTranche1Req, @@ -121,7 +121,7 @@ func testAnchorMultipleVirtualTransactions(t *harnessTest) { // In our second batch we create the third tranche of the grouped asset // X and Y as well as a passive asset Q. secondBatch := MintAssetsConfirmBatch( - t.t, t.lndHarness.Miner().Client, t.tapd, + t.t, t.lndHarness.Miner(), t.tapd, []*mintrpc.MintAssetRequest{ { Asset: assetXTranche3Req, @@ -257,7 +257,7 @@ func testAnchorMultipleVirtualTransactions(t *harnessTest) { t.Logf("Send response: %v", toJSON(t.t, sendResp)) ConfirmAndAssertOutboundTransferWithOutputs( - t.t, t.lndHarness.Miner().Client, aliceTapd, sendResp, + t.t, t.lndHarness.Miner(), aliceTapd, sendResp, assetXTranche1ID[:], []uint64{300, 300, 300}, 0, 1, 3, ) @@ -381,7 +381,7 @@ func testAnchorMultipleVirtualTransactions(t *harnessTest) { assetYTranche1.Amount - assetsToSend, assetsToSend, } ConfirmAndAssertOutboundTransferWithOutputs( - t.t, t.lndHarness.Miner().Client, aliceTapd, + t.t, t.lndHarness.Miner(), aliceTapd, sendResp, assetYTranche1.AssetGenesis.AssetId, expectedAmounts, 3, 4, len(expectedAmounts), ) @@ -403,7 +403,7 @@ func testAnchorMultipleVirtualSplitTransactions(t *harnessTest) { // In our first batch we create multiple units of the grouped asset X // and Y. firstBatch := MintAssetsConfirmBatch( - t.t, t.lndHarness.Miner().Client, t.tapd, + t.t, t.lndHarness.Miner(), t.tapd, []*mintrpc.MintAssetRequest{ { Asset: assetXTranche1Req, @@ -417,7 +417,7 @@ func testAnchorMultipleVirtualSplitTransactions(t *harnessTest) { // In our second batch we create the third tranche of the grouped asset // X and Y as well as a passive asset Q. secondBatch := MintAssetsConfirmBatch( - t.t, t.lndHarness.Miner().Client, t.tapd, + t.t, t.lndHarness.Miner(), t.tapd, []*mintrpc.MintAssetRequest{ { Asset: assetXTranche3Req, @@ -524,7 +524,7 @@ func testAnchorMultipleVirtualSplitTransactions(t *harnessTest) { t.Logf("Send response: %v", toJSON(t.t, sendResp)) ConfirmAndAssertOutboundTransferWithOutputs( - t.t, t.lndHarness.Miner().Client, aliceTapd, sendResp, + t.t, t.lndHarness.Miner(), aliceTapd, sendResp, assetXTranche1ID[:], []uint64{1, 299, 1, 299}, 0, 1, 4, ) diff --git a/itest/multisig.go b/itest/multisig.go index 1b2df97ea9..9d825e4105 100644 --- a/itest/multisig.go +++ b/itest/multisig.go @@ -11,7 +11,6 @@ import ( "github.com/btcsuite/btcd/btcec/v2/schnorr/musig2" "github.com/btcsuite/btcd/btcutil/psbt" "github.com/btcsuite/btcd/chaincfg" - "github.com/btcsuite/btcd/rpcclient" "github.com/btcsuite/btcd/txscript" "github.com/btcsuite/btcd/wire" "github.com/davecgh/go-spew/spew" @@ -31,6 +30,7 @@ import ( "github.com/lightningnetwork/lnd/keychain" "github.com/lightningnetwork/lnd/lnrpc/signrpc" "github.com/lightningnetwork/lnd/lnrpc/walletrpc" + lntestminer "github.com/lightningnetwork/lnd/lntest/miner" "github.com/lightningnetwork/lnd/lntest/rpc" "github.com/lightningnetwork/lnd/lnwallet/chainfee" "github.com/stretchr/testify/require" @@ -60,7 +60,8 @@ var ( // group key level. func MultiSigTest(t *testing.T, ctx context.Context, aliceTapd, bobTapd commands.RpcClientsBundle, universeHostPort string, - bitcoinClient *rpcclient.Client, aliceLnd, bobLnd *rpc.HarnessRPC, + bitcoinClient *lntestminer.HarnessMiner, + aliceLnd, bobLnd *rpc.HarnessRPC, params *chaincfg.Params, testTimeout time.Duration) { // We mint some grouped assets to use in the test. These assets are diff --git a/itest/multisig_test.go b/itest/multisig_test.go index 234c8662f6..b8a7ae4a69 100644 --- a/itest/multisig_test.go +++ b/itest/multisig_test.go @@ -25,7 +25,7 @@ func testMultiSignature(t *harnessTest) { MultiSigTest( t.t, context.Background(), aliceTapd, bobTapd, - aliceTapd.rpcHost(), t.lndHarness.Miner().Client, aliceLnd.RPC, - bobLnd.RPC, regtestParams, defaultTimeout, + aliceTapd.rpcHost(), t.lndHarness.Miner(), aliceLnd.RPC, + bobLnd.RPC, harnessNetParams, defaultTimeout, ) } diff --git a/itest/ownership_test.go b/itest/ownership_test.go index e4deee911d..8778eaa458 100644 --- a/itest/ownership_test.go +++ b/itest/ownership_test.go @@ -24,7 +24,7 @@ func testOwnershipVerification(t *harnessTest) { // Mint some assets on alice. rpcAssets := MintAssetsConfirmBatch( - t.t, t.lndHarness.Miner().Client, t.tapd, + t.t, t.lndHarness.Miner(), t.tapd, []*mintrpc.MintAssetRequest{issuableAssets[0]}, ) @@ -47,7 +47,7 @@ func testOwnershipVerification(t *harnessTest) { sendResp, sendEvents := sendAssetsToAddr(t, t.tapd, bobAddr) ConfirmAndAssertOutboundTransfer( - t.t, t.lndHarness.Miner().Client, t.tapd, sendResp, + t.t, t.lndHarness.Miner(), t.tapd, sendResp, genInfo.AssetId, []uint64{currentUnits - numUnits, numUnits}, 0, 1, ) diff --git a/itest/psbt_test.go b/itest/psbt_test.go index 670dd13327..7ca3b8b7b2 100644 --- a/itest/psbt_test.go +++ b/itest/psbt_test.go @@ -47,7 +47,7 @@ func testPsbtScriptHashLockSend(t *harnessTest) { // First, we'll make a normal asset with enough units to allow us to // send it around a few times. rpcAssets := MintAssetsConfirmBatch( - t.t, t.lndHarness.Miner().Client, t.tapd, + t.t, t.lndHarness.Miner(), t.tapd, []*mintrpc.MintAssetRequest{simpleAssets[0]}, ) @@ -143,7 +143,7 @@ func testPsbtScriptHashLockSend(t *harnessTest) { require.NoError(t.t, err) ConfirmAndAssertOutboundTransfer( - t.t, t.lndHarness.Miner().Client, bob, sendResp, + t.t, t.lndHarness.Miner(), bob, sendResp, genInfo.AssetId, []uint64{numUnits / 2, numUnits / 2}, 0, 1, ) @@ -171,7 +171,7 @@ func testPsbtScriptCheckSigSend(t *harnessTest) { // First, we'll make a normal asset with enough units to allow us to // send it around a few times. rpcAssets := MintAssetsConfirmBatch( - t.t, t.lndHarness.Miner().Client, t.tapd, + t.t, t.lndHarness.Miner(), t.tapd, []*mintrpc.MintAssetRequest{issuableAssets[0]}, ) @@ -272,7 +272,7 @@ func testPsbtScriptCheckSigSend(t *harnessTest) { require.NoError(t.t, err) ConfirmAndAssertOutboundTransfer( - t.t, t.lndHarness.Miner().Client, bob, sendResp, + t.t, t.lndHarness.Miner(), bob, sendResp, genInfo.AssetId, []uint64{numUnits / 2, numUnits / 2}, 0, 1, ) @@ -302,7 +302,7 @@ func testPsbtNormalInteractiveFullValueSend(t *harnessTest) { // going to send backand forth. We're also minting a passive asset that // should remain where it is. rpcAssets := MintAssetsConfirmBatch( - t.t, t.lndHarness.Miner().Client, t.tapd, + t.t, t.lndHarness.Miner(), t.tapd, []*mintrpc.MintAssetRequest{ simpleAssets[0], // Our "passive" asset. @@ -345,7 +345,7 @@ func testPsbtMarkerV0MixedVersions(t *harnessTest) { // going to send back and forth. We're also minting a passive asset that // should remain where it is. rpcAssets := MintAssetsConfirmBatch( - t.t, t.lndHarness.Miner().Client, t.tapd, + t.t, t.lndHarness.Miner(), t.tapd, []*mintrpc.MintAssetRequest{ simpleAssets[0], // Our "passive" asset. @@ -387,14 +387,14 @@ func testPsbtMultiVersionSend(t *harnessTest) { // First, we'll mint two assets. firstRpcAsset := MintAssetsConfirmBatch( - t.t, t.lndHarness.Miner().Client, t.tapd, + t.t, t.lndHarness.Miner(), t.tapd, []*mintrpc.MintAssetRequest{ simpleAssets[0], }, ) secondRpcAsset := MintAssetsConfirmBatch( - t.t, t.lndHarness.Miner().Client, t.tapd, + t.t, t.lndHarness.Miner(), t.tapd, []*mintrpc.MintAssetRequest{ simpleAssets[1], }, @@ -542,7 +542,7 @@ func testPsbtMultiVersionSend(t *harnessTest) { require.NoError(t.t, err) ConfirmAndAssertOutboundTransferWithOutputs( - t.t, t.lndHarness.Miner().Client, sender, send1Resp, + t.t, t.lndHarness.Miner(), sender, send1Resp, firstAsset.AssetGenesis.AssetId, []uint64{firstAssetSplitAmt, firstAssetSplitAmt}, 0, 1, 2, @@ -556,7 +556,7 @@ func testPsbtMultiVersionSend(t *harnessTest) { require.NoError(t.t, err) ConfirmAndAssertOutboundTransferWithOutputs( - t.t, t.lndHarness.Miner().Client, sender, send2Resp, + t.t, t.lndHarness.Miner(), sender, send2Resp, secondAsset.AssetGenesis.AssetId, []uint64{secondAsset.Amount}, 1, 2, 1, ) @@ -591,7 +591,7 @@ func testPsbtGroupedInteractiveFullValueSend(t *harnessTest) { // going to send backand forth. We're also minting a passive asset that // should remain where it is. rpcAssets := MintAssetsConfirmBatch( - t.t, t.lndHarness.Miner().Client, t.tapd, + t.t, t.lndHarness.Miner(), t.tapd, []*mintrpc.MintAssetRequest{ issuableAssets[0], // Our "passive" asset. @@ -715,7 +715,7 @@ func runPsbtInteractiveFullValueSendTest(ctxt context.Context, t *harnessTest, numOutputs := 1 amounts := []uint64{fullAmt} ConfirmAndAssertOutboundTransferWithOutputs( - t.t, t.lndHarness.Miner().Client, sender, + t.t, t.lndHarness.Miner(), sender, sendResp, genInfo.AssetId, amounts, i/2, (i/2)+1, numOutputs, ) @@ -855,7 +855,7 @@ func testPsbtNormalInteractiveSplitSend(t *harnessTest) { // going to send backand forth. We're also minting a passive asset that // should remain where it is. rpcAssets := MintAssetsConfirmBatch( - t.t, t.lndHarness.Miner().Client, t.tapd, + t.t, t.lndHarness.Miner(), t.tapd, []*mintrpc.MintAssetRequest{ simpleAssets[0], // Our "passive" asset. @@ -899,7 +899,7 @@ func testPsbtGroupedInteractiveSplitSend(t *harnessTest) { // going to send backand forth. We're also minting a passive asset that // should remain where it is. rpcAssets := MintAssetsConfirmBatch( - t.t, t.lndHarness.Miner().Client, t.tapd, + t.t, t.lndHarness.Miner(), t.tapd, []*mintrpc.MintAssetRequest{ issuableAssets[0], // Our "passive" asset. @@ -1013,7 +1013,7 @@ func runPsbtInteractiveSplitSendTest(ctxt context.Context, t *harnessTest, numOutputs := 2 ConfirmAndAssertOutboundTransferWithOutputs( - t.t, t.lndHarness.Miner().Client, sender, + t.t, t.lndHarness.Miner(), sender, sendResp, genInfo.AssetId, []uint64{changeAmt, sendAmt}, i/2, (i/2)+1, numOutputs, @@ -1082,7 +1082,7 @@ func testPsbtInteractiveAltLeafAnchoring(t *harnessTest) { // First, we'll make a normal asset with a bunch of units. We're also // minting a passive asset that should remain where it is. rpcAssets := MintAssetsConfirmBatch( - t.t, t.lndHarness.Miner().Client, t.tapd, + t.t, t.lndHarness.Miner(), t.tapd, []*mintrpc.MintAssetRequest{ issuableAssets[0], // Our "passive" asset. @@ -1264,7 +1264,7 @@ func testPsbtInteractiveAltLeafAnchoring(t *harnessTest) { partialAmt, partialAmt, partialAmt * 2, } ConfirmAndAssertOutboundTransferWithOutputs( - t.t, t.lndHarness.Miner().Client, sender, publishResp, + t.t, t.lndHarness.Miner(), sender, publishResp, genInfo.AssetId, expectedAmounts, 0, 1, len(expectedAmounts), ) @@ -1303,7 +1303,7 @@ func testPsbtInteractiveTapscriptSibling(t *harnessTest) { // First, we'll make a normal asset with a bunch of units that we are // going to send backand forth. rpcAssets := MintAssetsConfirmBatch( - t.t, t.lndHarness.Miner().Client, t.tapd, + t.t, t.lndHarness.Miner(), t.tapd, []*mintrpc.MintAssetRequest{simpleAssets[0]}, ) @@ -1367,7 +1367,7 @@ func testPsbtInteractiveTapscriptSibling(t *harnessTest) { require.NoError(t.t, err) ConfirmAndAssertOutboundTransferWithOutputs( - t.t, t.lndHarness.Miner().Client, alice, sendResp, + t.t, t.lndHarness.Miner(), alice, sendResp, genInfo.AssetId, []uint64{changeAmt, sendAmt}, 0, 1, 2, ) @@ -1416,7 +1416,7 @@ func testPsbtMultiSend(t *harnessTest) { // going to send backand forth. We're also minting a passive asset that // should remain where it is. rpcAssets := MintAssetsConfirmBatch( - t.t, t.lndHarness.Miner().Client, t.tapd, + t.t, t.lndHarness.Miner(), t.tapd, []*mintrpc.MintAssetRequest{ simpleAssets[0], // Our "passive" asset. @@ -1536,7 +1536,7 @@ func testPsbtMultiSend(t *harnessTest) { // are 4 BTC anchor outputs but 5 asset transfer outputs. numOutputs := 5 ConfirmAndAssertOutboundTransferWithOutputs( - t.t, t.lndHarness.Miner().Client, sender, sendResp, + t.t, t.lndHarness.Miner(), sender, sendResp, genInfo.AssetId, outputAmounts, 0, 1, numOutputs, ) @@ -1608,7 +1608,7 @@ func testMultiInputPsbtSingleAssetID(t *harnessTest) { // Mint a single asset. rpcAssets := MintAssetsConfirmBatch( - t.t, t.lndHarness.Miner().Client, primaryTapd, + t.t, t.lndHarness.Miner(), primaryTapd, []*mintrpc.MintAssetRequest{simpleAssets[0]}, ) rpcAsset := rpcAssets[0] @@ -1646,7 +1646,7 @@ func testMultiInputPsbtSingleAssetID(t *harnessTest) { sendResp, sendEvents := sendAssetsToAddr(t, primaryTapd, addr) ConfirmAndAssertOutboundTransfer( - t.t, t.lndHarness.Miner().Client, primaryTapd, sendResp, + t.t, t.lndHarness.Miner(), primaryTapd, sendResp, genInfo.AssetId, []uint64{changeAmt, sendAmt}, 0, 1, ) @@ -1674,7 +1674,7 @@ func testMultiInputPsbtSingleAssetID(t *harnessTest) { sendResp, sendEvents = sendAssetsToAddr(t, primaryTapd, addr) ConfirmAndAssertOutboundTransfer( - t.t, t.lndHarness.Miner().Client, primaryTapd, sendResp, + t.t, t.lndHarness.Miner(), primaryTapd, sendResp, genInfo.AssetId, []uint64{changeAmt, sendAmt}, 1, 2, ) @@ -1701,7 +1701,7 @@ func testMultiInputPsbtSingleAssetID(t *harnessTest) { sendResp, sendEvents = sendAssetsToAddr(t, primaryTapd, addr) ConfirmAndAssertOutboundTransfer( - t.t, t.lndHarness.Miner().Client, primaryTapd, sendResp, + t.t, t.lndHarness.Miner(), primaryTapd, sendResp, genInfo.AssetId, []uint64{changeAmt, sendAmt}, 2, 3, ) @@ -1787,7 +1787,7 @@ func testMultiInputPsbtSingleAssetID(t *harnessTest) { numOutputs = 2 ) ConfirmAndAssertOutboundTransferWithOutputs( - t.t, t.lndHarness.Miner().Client, secondaryTapd, + t.t, t.lndHarness.Miner(), secondaryTapd, sendResp, genInfo.AssetId, []uint64{changeAmt, sendAmt}, currentTransferIdx, numTransfers, numOutputs, @@ -1863,7 +1863,7 @@ func testMultiInputPsbtSingleAssetID(t *harnessTest) { numTransfers = 2 numOutputs = 1 ConfirmAndAssertOutboundTransferWithOutputs( - t.t, t.lndHarness.Miner().Client, secondaryTapd, sendResp, + t.t, t.lndHarness.Miner(), secondaryTapd, sendResp, genInfo.AssetId, []uint64{sendAmt}, currentTransferIdx, numTransfers, numOutputs, ) @@ -1909,7 +1909,7 @@ func testPsbtSighashNone(t *harnessTest) { // First, we'll make a normal asset with enough units to allow us to // send it around a few times. rpcAssets := MintAssetsConfirmBatch( - t.t, t.lndHarness.Miner().Client, t.tapd, + t.t, t.lndHarness.Miner(), t.tapd, []*mintrpc.MintAssetRequest{issuableAssets[0]}, ) @@ -2043,7 +2043,7 @@ func testPsbtSighashNone(t *harnessTest) { require.NoError(t.t, err) ConfirmAndAssertOutboundTransfer( - t.t, t.lndHarness.Miner().Client, bob, sendResp, + t.t, t.lndHarness.Miner(), bob, sendResp, genInfo.AssetId, []uint64{(4*numUnits)/5 - 1, (numUnits / 5) + 1}, 0, 1, ) @@ -2077,7 +2077,7 @@ func testPsbtSighashNoneInvalid(t *harnessTest) { // First, we'll make a normal asset with enough units to allow us to // send it around a few times. rpcAssets := MintAssetsConfirmBatch( - t.t, t.lndHarness.Miner().Client, t.tapd, + t.t, t.lndHarness.Miner(), t.tapd, []*mintrpc.MintAssetRequest{issuableAssets[0]}, ) @@ -2223,7 +2223,7 @@ func testPsbtSighashNoneInvalid(t *harnessTest) { func testPsbtTrustlessSwap(t *harnessTest) { // First, we'll make a normal asset. rpcAssets := MintAssetsConfirmBatch( - t.t, t.lndHarness.Miner().Client, t.tapd, + t.t, t.lndHarness.Miner(), t.tapd, []*mintrpc.MintAssetRequest{issuableAssets[0]}, ) @@ -2535,7 +2535,7 @@ func testPsbtTrustlessSwap(t *harnessTest) { t.Logf("Logged transaction: %v", toJSON(t.t, logResp)) // Mine a block to confirm the transfer. - MineBlocks(t.t, t.lndHarness.Miner().Client, 1, 1) + MineBlocks(t.t, t.lndHarness.Miner(), 1, 1) // We also need to push the proof for this transfer to the universe // server. @@ -2585,7 +2585,7 @@ func testPsbtSTXOExclusionProofs(t *harnessTest) { // going to send backand forth. We're also minting a passive asset that // should remain where it is. rpcAssets := MintAssetsConfirmBatch( - t.t, t.lndHarness.Miner().Client, t.tapd, + t.t, t.lndHarness.Miner(), t.tapd, []*mintrpc.MintAssetRequest{ simpleAssets[0], // Our "passive" asset. @@ -2653,7 +2653,7 @@ func testPsbtSTXOExclusionProofs(t *harnessTest) { numOutputs := 2 changeAmt := mintedAsset.Amount - sendAmt ConfirmAndAssertOutboundTransferWithOutputs( - t.t, t.lndHarness.Miner().Client, alice, sendResp, + t.t, t.lndHarness.Miner(), alice, sendResp, genInfo.AssetId, []uint64{changeAmt, sendAmt}, 0, 1, numOutputs, ) @@ -2755,7 +2755,7 @@ func testPsbtExternalCommit(t *harnessTest) { // minted on the default tapd instance that is always created in the // integration test (connected to lnd "Alice"). assets := MintAssetsConfirmBatch( - t.t, t.lndHarness.Miner().Client, t.tapd, + t.t, t.lndHarness.Miner(), t.tapd, []*mintrpc.MintAssetRequest{ issuableAssets[0], // Our "passive" asset. @@ -2938,7 +2938,7 @@ func testPsbtExternalCommit(t *harnessTest) { targetAsset.Amount - assetsToSend, assetsToSend, } AssertAssetOutboundTransferWithOutputs( - t.t, t.lndHarness.Miner().Client, aliceTapd, + t.t, t.lndHarness.Miner(), aliceTapd, sendResp.Transfer, [][]byte{targetAssetGenesis.AssetId}, expectedAmounts, 0, 1, len(expectedAmounts), false, ) @@ -2972,7 +2972,7 @@ func testPsbtLockTimeSend(t *harnessTest) { // going to send. We're also minting a passive asset that should remain // where it is. rpcAssets := MintAssetsConfirmBatch( - t.t, t.lndHarness.Miner().Client, t.tapd, + t.t, t.lndHarness.Miner(), t.tapd, []*mintrpc.MintAssetRequest{ simpleAssets[0], // Our "passive" asset. @@ -3071,7 +3071,7 @@ func testPsbtLockTimeSend(t *harnessTest) { numOutputs = len(amounts) ) ConfirmAndAssertOutboundTransferWithOutputs( - t.t, t.lndHarness.Miner().Client, alice, + t.t, t.lndHarness.Miner(), alice, sendResp, genInfo.AssetId, amounts, currentTransferIdx, numTransfers, numOutputs, ) @@ -3088,7 +3088,7 @@ func testPsbtLockTimeSend(t *harnessTest) { // We mine just 4 blocks, two short of being enough for the relative // time lock. - MineBlocks(t.t, t.lndHarness.Miner().Client, 4, 0) + MineBlocks(t.t, t.lndHarness.Miner(), 4, 0) // Now if we spend Bob's asset, we should see a lock time in the anchor // transaction. For that, we need to derive two keys for Alice, one for @@ -3134,7 +3134,7 @@ func testPsbtLockTimeSend(t *harnessTest) { t.lndHarness.Miner().AssertNumTxsInMempool(0) // After mining a single block, the error should go away. - MineBlocks(t.t, t.lndHarness.Miner().Client, 1, 0) + MineBlocks(t.t, t.lndHarness.Miner(), 1, 0) // Now we'll attempt to complete the transfer normally, which should // succeed. @@ -3148,7 +3148,7 @@ func testPsbtLockTimeSend(t *harnessTest) { require.NoError(t.t, err) ConfirmAndAssertOutboundTransferWithOutputs( - t.t, t.lndHarness.Miner().Client, bob, + t.t, t.lndHarness.Miner(), bob, sendRespSpend, genInfo.AssetId, amounts, currentTransferIdx, numTransfers, numOutputs, ) @@ -3186,7 +3186,7 @@ func testPsbtRelativeLockTimeSend(t *harnessTest) { // going to send. We're also minting a passive asset that should remain // where it is. rpcAssets := MintAssetsConfirmBatch( - t.t, t.lndHarness.Miner().Client, t.tapd, + t.t, t.lndHarness.Miner(), t.tapd, []*mintrpc.MintAssetRequest{ simpleAssets[0], // Our "passive" asset. @@ -3284,7 +3284,7 @@ func testPsbtRelativeLockTimeSend(t *harnessTest) { numOutputs = len(amounts) ) ConfirmAndAssertOutboundTransferWithOutputs( - t.t, t.lndHarness.Miner().Client, alice, + t.t, t.lndHarness.Miner(), alice, sendResp, genInfo.AssetId, amounts, currentTransferIdx, numTransfers, numOutputs, ) @@ -3301,7 +3301,7 @@ func testPsbtRelativeLockTimeSend(t *harnessTest) { // We mine just 4 blocks, two short of being enough for the relative // time lock. - MineBlocks(t.t, t.lndHarness.Miner().Client, 4, 0) + MineBlocks(t.t, t.lndHarness.Miner(), 4, 0) // Now if we spend Bob's asset, we should see a lock time in the anchor // transaction. For that, we need to derive two keys for Alice, one for @@ -3347,7 +3347,7 @@ func testPsbtRelativeLockTimeSend(t *harnessTest) { t.lndHarness.Miner().AssertNumTxsInMempool(0) // After mining a single block, the error should go away. - MineBlocks(t.t, t.lndHarness.Miner().Client, 1, 0) + MineBlocks(t.t, t.lndHarness.Miner(), 1, 0) // Now we'll attempt to complete the transfer normally, which should // succeed. @@ -3361,7 +3361,7 @@ func testPsbtRelativeLockTimeSend(t *harnessTest) { require.NoError(t.t, err) ConfirmAndAssertOutboundTransferWithOutputs( - t.t, t.lndHarness.Miner().Client, bob, + t.t, t.lndHarness.Miner(), bob, sendRespSpend, genInfo.AssetId, amounts, currentTransferIdx, numTransfers, numOutputs, ) @@ -3400,7 +3400,7 @@ func testPsbtRelativeLockTimeSendProofFail(t *harnessTest) { // going to send. We're also minting a passive asset that should remain // where it is. rpcAssets := MintAssetsConfirmBatch( - t.t, t.lndHarness.Miner().Client, t.tapd, + t.t, t.lndHarness.Miner(), t.tapd, []*mintrpc.MintAssetRequest{ simpleAssets[0], // Our "passive" asset. @@ -3498,7 +3498,7 @@ func testPsbtRelativeLockTimeSendProofFail(t *harnessTest) { numOutputs = len(amounts) ) ConfirmAndAssertOutboundTransferWithOutputs( - t.t, t.lndHarness.Miner().Client, alice, + t.t, t.lndHarness.Miner(), alice, sendResp, genInfo.AssetId, amounts, currentTransferIdx, numTransfers, numOutputs, ) @@ -3515,7 +3515,7 @@ func testPsbtRelativeLockTimeSendProofFail(t *harnessTest) { // We mine just 4 blocks, two short of being enough for the relative // time lock. - MineBlocks(t.t, t.lndHarness.Miner().Client, 4, 0) + MineBlocks(t.t, t.lndHarness.Miner(), 4, 0) // Now if we spend Bob's asset, we should see a lock time in the anchor // transaction. For that, we need to derive two keys for Alice, one for @@ -3601,7 +3601,7 @@ func testPsbtRelativeLockTimeSendProofFail(t *harnessTest) { PublishAndLogTransfer(t.t, bob, btcPacket, vPackets, nil, commitResp) - MineBlocks(t.t, t.lndHarness.Miner().Client, 1, 1) + MineBlocks(t.t, t.lndHarness.Miner(), 1, 1) AssertSendEvents( t.t, aliceScriptKeyBytes, sendEvents, @@ -3675,7 +3675,7 @@ func sendToTapscriptAddr(ctx context.Context, t *harnessTest, alice, changeUnits := mintedAsset.Amount - numUnits ConfirmAndAssertOutboundTransfer( - t.t, t.lndHarness.Miner().Client, alice, sendResp, + t.t, t.lndHarness.Miner(), alice, sendResp, genInfo.AssetId, []uint64{changeUnits, numUnits}, 0, 1, ) AssertNonInteractiveRecvComplete(t.t, bob, 1) @@ -3708,7 +3708,7 @@ func sendAssetAndAssert(ctx context.Context, t *harnessTest, alice, AssertAddrCreated(t.t, bob, mintedAsset, bobAddr) sendResp, sendEvents := sendAssetsToAddr(t, alice, bobAddr) ConfirmAndAssertOutboundTransfer( - t.t, t.lndHarness.Miner().Client, alice, sendResp, + t.t, t.lndHarness.Miner(), alice, sendResp, genInfo.AssetId, []uint64{change, numUnits}, outTransferIdx, numOutTransfers, ) diff --git a/itest/re-issuance_test.go b/itest/re-issuance_test.go index 8c4b1b037d..20454f7be0 100644 --- a/itest/re-issuance_test.go +++ b/itest/re-issuance_test.go @@ -14,7 +14,7 @@ import ( // testReIssuance tests that we can properly reissue an asset into group, and // that the daemon handles a group with multiple assets correctly. func testReIssuance(t *harnessTest) { - miner := t.lndHarness.Miner().Client + miner := t.lndHarness.Miner() // First, we'll mint a collectible and a normal asset, both with // emission enabled. @@ -71,7 +71,7 @@ func testReIssuance(t *harnessTest) { t, t.tapd, collectGroupAddr, ) ConfirmAndAssertOutboundTransfer( - t.t, t.lndHarness.Miner().Client, t.tapd, firstCollectSend, + t.t, t.lndHarness.Miner(), t.tapd, firstCollectSend, collectGenInfo.AssetId, []uint64{0, 1}, 0, 1, ) AssertNonInteractiveRecvComplete(t.t, secondTapd, 1) @@ -101,7 +101,7 @@ func testReIssuance(t *harnessTest) { t, t.tapd, normalGroupAddr, ) ConfirmAndAssertOutboundTransfer( - t.t, t.lndHarness.Miner().Client, t.tapd, firstNormalSend, + t.t, t.lndHarness.Miner(), t.tapd, firstNormalSend, normalGenInfo.AssetId, []uint64{normalGroupMintHalf, normalGroupMintHalf}, 1, 2, ) @@ -183,7 +183,7 @@ func testReIssuance(t *harnessTest) { t, t.tapd, collectReissueAddr, ) ConfirmAndAssertOutboundTransfer( - t.t, t.lndHarness.Miner().Client, t.tapd, secondCollectSend, + t.t, t.lndHarness.Miner(), t.tapd, secondCollectSend, collectReissueInfo.AssetId, []uint64{0, 1}, 2, 3, ) AssertNonInteractiveRecvComplete(t.t, secondTapd, 3) @@ -219,7 +219,7 @@ func testReIssuance(t *harnessTest) { t, secondTapd, collectGenAddr, ) ConfirmAndAssertOutboundTransfer( - t.t, secondTapd.ht.lndHarness.Miner().Client, secondTapd, + t.t, secondTapd.ht.lndHarness.Miner(), secondTapd, thirdCollectSend, collectGenInfo.AssetId, []uint64{0, 1}, 0, 1, ) AssertNonInteractiveRecvComplete(t.t, t.tapd, 1) @@ -249,7 +249,7 @@ func testReIssuanceAmountOverflow(t *harnessTest) { assetIssueReq.Asset.Amount = math.MaxUint64 assets := MintAssetsConfirmBatch( - t.t, t.lndHarness.Miner().Client, t.tapd, + t.t, t.lndHarness.Miner(), t.tapd, []*mintrpc.MintAssetRequest{assetIssueReq}, ) require.Equal(t.t, 1, len(assets)) @@ -281,7 +281,7 @@ func testReIssuanceAmountOverflow(t *harnessTest) { func testMintWithGroupKeyErrors(t *harnessTest) { // First, mint a collectible with emission enabled to create one group. collectGroupGen := MintAssetsConfirmBatch( - t.t, t.lndHarness.Miner().Client, t.tapd, + t.t, t.lndHarness.Miner(), t.tapd, []*mintrpc.MintAssetRequest{issuableAssets[1]}, ) require.Equal(t.t, 1, len(collectGroupGen)) @@ -380,7 +380,7 @@ func testMintWithGroupKeyErrors(t *harnessTest) { t, t.tapd, collectGroupAddr, ) ConfirmAndAssertOutboundTransfer( - t.t, t.lndHarness.Miner().Client, t.tapd, collectSend, + t.t, t.lndHarness.Miner(), t.tapd, collectSend, collectGenInfo.AssetId, []uint64{0, 1}, 0, 1, ) AssertSendEventsComplete(t.t, collectGroupAddr.ScriptKey, collectEvents) diff --git a/itest/re-org_test.go b/itest/re-org_test.go index c8d2c6ee8b..27a861932f 100644 --- a/itest/re-org_test.go +++ b/itest/re-org_test.go @@ -27,7 +27,7 @@ func testReOrgMint(t *harnessTest) { } lndMiner := t.lndHarness.Miner() mintTXID, batchKey := MintAssetUnconfirmed( - t.t, lndMiner.Client, t.tapd, mintRequests, + t.t, lndMiner, t.tapd, mintRequests, ) ctx := context.Background() @@ -37,7 +37,7 @@ func testReOrgMint(t *harnessTest) { tempMiner := spawnTempMiner(t.t, t, ctx) // And now we mine a block to confirm the assets. - initialBlock := MineBlocks(t.t, lndMiner.Client, 1, 1)[0] + initialBlock := MineBlocks(t.t, lndMiner, 1, 1)[0] initialBlockHash := initialBlock.BlockHash() WaitForBatchState( t.t, ctx, t.tapd, defaultWaitTimeout, batchKey, @@ -65,8 +65,7 @@ func testReOrgMint(t *harnessTest) { // This should have caused a reorg, and Alice should sync to the longer // chain, where the funding transaction is not confirmed. - _, tempMinerHeight, err := tempMiner.Client.GetBestBlock() - require.NoError(t.t, err, "unable to get current block height") + _, tempMinerHeight := tempMiner.GetBestBlock() t.lndHarness.WaitForNodeBlockHeight(t.tapd.cfg.LndNode, tempMinerHeight) // At this point, the asset proofs should be invalid, since the mint TX @@ -126,7 +125,7 @@ func testReOrgSend(t *harnessTest) { } lndMiner := t.lndHarness.Miner() assetList := MintAssetsConfirmBatch( - t.t, lndMiner.Client, t.tapd, mintRequests, + t.t, lndMiner, t.tapd, mintRequests, ) ctx := context.Background() @@ -157,7 +156,7 @@ func testReOrgSend(t *harnessTest) { AssertAddrCreated(t.t, secondTapd, sendAsset, bobAddr) sendResp, _ := sendAssetsToAddr(t, t.tapd, bobAddr) initialBlock := ConfirmAndAssertOutboundTransfer( - t.t, lndMiner.Client, t.tapd, sendResp, sendAssetGen.AssetId, + t.t, lndMiner, t.tapd, sendResp, sendAssetGen.AssetId, []uint64{sendAsset.Amount - sendAmount, sendAmount}, 0, 1, ) AssertNonInteractiveRecvComplete(t.t, secondTapd, 1) @@ -176,8 +175,7 @@ func testReOrgSend(t *harnessTest) { // This should have caused a reorg, and Alice should sync to the longer // chain, where the funding transaction is not confirmed. - _, tempMinerHeight, err := tempMiner.Client.GetBestBlock() - require.NoError(t.t, err, "unable to get current block height") + _, tempMinerHeight := tempMiner.GetBestBlock() t.lndHarness.WaitForNodeBlockHeight(t.tapd.cfg.LndNode, tempMinerHeight) // At this point, the all asset proofs should be invalid, since the send @@ -265,7 +263,7 @@ func testReOrgSendV2Address(t *harnessTest) { } lndMiner := t.lndHarness.Miner() assetList := MintAssetsConfirmBatch( - t.t, lndMiner.Client, t.tapd, mintRequests, + t.t, lndMiner, t.tapd, mintRequests, ) ctx := context.Background() @@ -298,7 +296,7 @@ func testReOrgSendV2Address(t *harnessTest) { sendResp, _ := sendAssetsToAddr(t, t.tapd, bobAddrV2) initialBlock := ConfirmAndAssertOutboundTransfer( - t.t, lndMiner.Client, t.tapd, sendResp, sendAssetGen.AssetId, + t.t, lndMiner, t.tapd, sendResp, sendAssetGen.AssetId, []uint64{sendAsset.Amount - sendAmount, sendAmount}, 0, 1, ) AssertNonInteractiveRecvComplete(t.t, secondTapd, 1) @@ -317,8 +315,7 @@ func testReOrgSendV2Address(t *harnessTest) { // This should have caused a reorg, and Alice should sync to the longer // chain, where the funding transaction is not confirmed. - _, tempMinerHeight, err := tempMiner.Client.GetBestBlock() - require.NoError(t.t, err, "unable to get current block height") + _, tempMinerHeight := tempMiner.GetBestBlock() t.lndHarness.WaitForNodeBlockHeight(t.tapd.cfg.LndNode, tempMinerHeight) // At this point, the all asset proofs should be invalid, since the send @@ -417,7 +414,7 @@ func testReOrgMintAndSend(t *harnessTest) { issuableAssets[0], issuableAssets[1], } assetList := MintAssetsConfirmBatch( - t.t, lndMiner.Client, t.tapd, mintRequests, + t.t, lndMiner, t.tapd, mintRequests, ) // Now that we have the asset created, we'll make a new node that'll @@ -441,7 +438,7 @@ func testReOrgMintAndSend(t *harnessTest) { AssertAddrCreated(t.t, secondTapd, sendAsset, bobAddr) sendResp, _ := sendAssetsToAddr(t, t.tapd, bobAddr) initialBlock := ConfirmAndAssertOutboundTransfer( - t.t, lndMiner.Client, t.tapd, sendResp, sendAssetGen.AssetId, + t.t, lndMiner, t.tapd, sendResp, sendAssetGen.AssetId, []uint64{sendAsset.Amount - sendAmount, sendAmount}, 0, 1, ) AssertNonInteractiveRecvComplete(t.t, secondTapd, 1) @@ -460,8 +457,7 @@ func testReOrgMintAndSend(t *harnessTest) { // This should have caused a reorg, and Alice should sync to the longer // chain, where the funding transaction is not confirmed. - _, tempMinerHeight, err := tempMiner.Client.GetBestBlock() - require.NoError(t.t, err, "unable to get current block height") + _, tempMinerHeight := tempMiner.GetBestBlock() t.lndHarness.WaitForNodeBlockHeight(t.tapd.cfg.LndNode, tempMinerHeight) // At this point, the all asset proofs should be invalid, since the send @@ -528,9 +524,7 @@ func testReOrgMintAndSend(t *harnessTest) { func spawnTempMiner(t *testing.T, ht *harnessTest, ctx context.Context) *miner.HarnessMiner { - tempHarness := miner.NewMiner(ctx, t) - tempHarness.Client = ht.lndHarness.Miner().Client - return tempHarness.SpawnTempMiner() + return ht.lndHarness.Miner().SpawnTempMiner() } // generateReOrg generates a re-org by mining a longer chain with a temporary diff --git a/itest/rfq_test.go b/itest/rfq_test.go index e38f6bc45f..e42c4da061 100644 --- a/itest/rfq_test.go +++ b/itest/rfq_test.go @@ -67,7 +67,7 @@ func testRfqAssetBuyHtlcIntercept(t *harnessTest) { // Mint an asset with Bob's tapd node. rpcAssets := MintAssetsConfirmBatch( - t.t, t.lndHarness.Miner().Client, ts.BobTapd, + t.t, t.lndHarness.Miner(), ts.BobTapd, []*mintrpc.MintAssetRequest{issuableAssets[0]}, ) mintedAssetId := rpcAssets[0].AssetGenesis.AssetId @@ -354,7 +354,7 @@ func testRfqAssetSellHtlcIntercept(t *harnessTest) { // Mint an asset with Alice's tapd node. rpcAssets := MintAssetsConfirmBatch( - t.t, t.lndHarness.Miner().Client, ts.AliceTapd, + t.t, t.lndHarness.Miner(), ts.AliceTapd, []*mintrpc.MintAssetRequest{issuableAssets[0]}, ) mintedAssetIdBytes := rpcAssets[0].AssetGenesis.AssetId @@ -635,7 +635,7 @@ func testRfqNegotiationGroupKey(t *harnessTest) { // Mint an asset with Alice's tapd node. rpcAssets := MintAssetsConfirmBatch( - t.t, t.lndHarness.Miner().Client, ts.AliceTapd, + t.t, t.lndHarness.Miner(), ts.AliceTapd, []*mintrpc.MintAssetRequest{issuableAssets[0]}, ) @@ -777,7 +777,7 @@ func testRfqPortfolioPilotRpc(t *harnessTest) { ) rpcAssets := MintAssetsConfirmBatch( - t.t, t.lndHarness.Miner().Client, ts.BobTapd, + t.t, t.lndHarness.Miner(), ts.BobTapd, []*mintrpc.MintAssetRequest{issuableAssets[0]}, ) mintedAssetId := rpcAssets[0].AssetGenesis.AssetId diff --git a/itest/round_trip_send_test.go b/itest/round_trip_send_test.go index 53bad39dde..eacdbcbbf7 100644 --- a/itest/round_trip_send_test.go +++ b/itest/round_trip_send_test.go @@ -30,7 +30,7 @@ func testRoundTripSend(t *harnessTest) { // First, we'll make a normal assets with enough units to allow us to // send it around a few times. rpcAssets := MintAssetsConfirmBatch( - t.t, t.lndHarness.Miner().Client, t.tapd, + t.t, t.lndHarness.Miner(), t.tapd, []*mintrpc.MintAssetRequest{simpleAssets[0]}, ) @@ -74,7 +74,7 @@ func testRoundTripSend(t *harnessTest) { t.Logf("Got response from sending assets: %v", sendRespJSON) ConfirmAndAssertOutboundTransfer( - t.t, t.lndHarness.Miner().Client, t.tapd, sendResp, + t.t, t.lndHarness.Miner(), t.tapd, sendResp, genInfo.AssetId, []uint64{bobAmt, bobAmt}, 0, 1, ) AssertNonInteractiveRecvComplete(t.t, secondTapd, 1) @@ -94,7 +94,7 @@ func testRoundTripSend(t *harnessTest) { t.Logf("Got response from sending assets: %v", sendRespJSON) ConfirmAndAssertOutboundTransfer( - t.t, t.lndHarness.Miner().Client, secondTapd, + t.t, t.lndHarness.Miner(), secondTapd, sendResp, genInfo.AssetId, []uint64{aliceAmt, aliceAmt}, 0, 1, ) AssertNonInteractiveRecvComplete(t.t, t.tapd, 1) diff --git a/itest/script_key_type_test.go b/itest/script_key_type_test.go index 66536f2747..9fc8e3db7b 100644 --- a/itest/script_key_type_test.go +++ b/itest/script_key_type_test.go @@ -20,7 +20,7 @@ func testScriptKeyTypePedersenUnique(t *harnessTest) { ctx := context.Background() rpcAssets := MintAssetsConfirmBatch( - t.t, t.lndHarness.Miner().Client, t.tapd, + t.t, t.lndHarness.Miner(), t.tapd, []*mintrpc.MintAssetRequest{ simpleAssets[0], // Our "passive" asset. @@ -102,7 +102,7 @@ func testScriptKeyTypePedersenUnique(t *harnessTest) { require.NoError(t.t, err) ConfirmAndAssertOutboundTransferWithOutputs( - t.t, t.lndHarness.Miner().Client, t.tapd, sendResp, activeID[:], + t.t, t.lndHarness.Miner(), t.tapd, sendResp, activeID[:], outputAmounts, 0, 1, 3, ) diff --git a/itest/send_test.go b/itest/send_test.go index 662203512d..69e7597ba1 100644 --- a/itest/send_test.go +++ b/itest/send_test.go @@ -52,7 +52,7 @@ func testBasicSendUnidirectional(t *harnessTest) { // First, we'll make a normal assets with enough units to allow us to // send it around a few times. rpcAssets := MintAssetsConfirmBatch( - t.t, t.lndHarness.Miner().Client, t.tapd, + t.t, t.lndHarness.Miner(), t.tapd, []*mintrpc.MintAssetRequest{issuableAssets[0]}, ) @@ -101,7 +101,7 @@ func testBasicSendUnidirectional(t *harnessTest) { sendResp, sendEvents := sendAssetsToAddr(t, t.tapd, bobAddr) ConfirmAndAssertOutboundTransfer( - t.t, t.lndHarness.Miner().Client, t.tapd, sendResp, + t.t, t.lndHarness.Miner(), t.tapd, sendResp, genInfo.AssetId, []uint64{currentUnits, numUnits}, i, i+1, ) @@ -170,21 +170,21 @@ func testMinRelayFeeBump(t *harnessTest) { // First, we'll make a normal assets with enough units to allow us to // send it around a few times. MintAssetsConfirmBatch( - t.t, t.lndHarness.Miner().Client, t.tapd, + t.t, t.lndHarness.Miner(), t.tapd, []*mintrpc.MintAssetRequest{issuableAssets[0]}, WithFeeRate(uint32(belowFloorFeeRate)), WithError("manual fee rate below floor"), ) MintAssetsConfirmBatch( - t.t, t.lndHarness.Miner().Client, t.tapd, + t.t, t.lndHarness.Miner(), t.tapd, []*mintrpc.MintAssetRequest{issuableAssets[0]}, WithFeeRate(uint32(belowMinRelayFeeRate)), WithError("feerate does not meet minrelayfee"), ) rpcAssets := MintAssetsConfirmBatch( - t.t, t.lndHarness.Miner().Client, t.tapd, + t.t, t.lndHarness.Miner(), t.tapd, []*mintrpc.MintAssetRequest{issuableAssets[0]}, ) @@ -197,7 +197,7 @@ func testMinRelayFeeBump(t *harnessTest) { // We check whether the minting TX is bumped to the min relay fee. AssertFeeRate( - t.t, t.lndHarness.Miner().Client, initialUTXOs[0].Amount, + t.t, t.lndHarness.Miner(), initialUTXOs[0].Amount, &mintOutpoint.Hash, realWorldMinRelayFeeRate.FeePerKWeight(), ) @@ -243,14 +243,14 @@ func testMinRelayFeeBump(t *harnessTest) { sendResp, sendEvents := sendAssetsToAddr(t, t.tapd, bobAddr) ConfirmAndAssertOutboundTransfer( - t.t, t.lndHarness.Miner().Client, t.tapd, sendResp, + t.t, t.lndHarness.Miner(), t.tapd, sendResp, genInfo.AssetId, []uint64{currentUnits, numUnits}, 0, 1, ) sendInputAmt := initialUTXOs[1].Amount + 1000 AssertTransferFeeRate( - t.t, t.lndHarness.Miner().Client, sendResp, sendInputAmt, + t.t, t.lndHarness.Miner(), sendResp, sendInputAmt, realWorldMinRelayFeeRate.FeePerKWeight(), ) @@ -285,7 +285,7 @@ func testRestartReceiverCheckBalance(t *harnessTest) { // First, we'll make a normal assets with enough units to allow us to // send it around a few times. rpcAssets := MintAssetsConfirmBatch( - t.t, t.lndHarness.Miner().Client, t.tapd, + t.t, t.lndHarness.Miner(), t.tapd, []*mintrpc.MintAssetRequest{issuableAssets[0]}, ) @@ -335,7 +335,7 @@ func testRestartReceiverCheckBalance(t *harnessTest) { sendResp, sendEvents := sendAssetsToAddr(t, t.tapd, bobAddr) ConfirmAndAssertOutboundTransfer( - t.t, t.lndHarness.Miner().Client, t.tapd, sendResp, + t.t, t.lndHarness.Miner(), t.tapd, sendResp, genInfo.AssetId, []uint64{currentUnits, numUnits}, 0, 1, ) @@ -445,7 +445,7 @@ func testResumePendingPackageSend(t *harnessTest) { // Mint (and mine) an asset for sending. rpcAssets := MintAssetsConfirmBatch( - t.t, t.lndHarness.Miner().Client, sendTapd, + t.t, t.lndHarness.Miner(), sendTapd, []*mintrpc.MintAssetRequest{simpleAssets[0]}, ) @@ -538,7 +538,7 @@ func testBasicSendPassiveAsset(t *harnessTest) { }, } rpcAssets := MintAssetsConfirmBatch( - t.t, t.lndHarness.Miner().Client, t.tapd, assets, + t.t, t.lndHarness.Miner(), t.tapd, assets, ) firstAsset := rpcAssets[0] genInfo := firstAsset.AssetGenesis @@ -588,7 +588,7 @@ func testBasicSendPassiveAsset(t *harnessTest) { // Assert that the outbound transfer was confirmed. expectedAmtAfterSend := assets[0].Asset.Amount - numUnitsSend ConfirmAndAssertOutboundTransfer( - t.t, t.lndHarness.Miner().Client, t.tapd, sendResp, + t.t, t.lndHarness.Miner(), t.tapd, sendResp, genInfo.AssetId, []uint64{expectedAmtAfterSend, numUnitsSend}, 0, 1, ) @@ -625,7 +625,7 @@ func testBasicSendPassiveAsset(t *harnessTest) { expectedAmtAfterSend = assets[1].Asset.Amount - numUnitsSend ConfirmAndAssertOutboundTransfer( - t.t, t.lndHarness.Miner().Client, t.tapd, sendResp, + t.t, t.lndHarness.Miner(), t.tapd, sendResp, genInfo2.AssetId, []uint64{expectedAmtAfterSend, numUnitsSend}, 1, 2, ) @@ -647,7 +647,7 @@ func testBasicSendPassiveAsset(t *harnessTest) { // Assert that the outbound transfer was confirmed. expectedAmtAfterSend = numUnitsSend - numUnitsSend/2 ConfirmAndAssertOutboundTransfer( - t.t, t.lndHarness.Miner().Client, recvTapd, sendResp, + t.t, t.lndHarness.Miner(), recvTapd, sendResp, genInfo.AssetId, []uint64{expectedAmtAfterSend, numUnitsSend / 2}, 0, 1, ) @@ -709,7 +709,7 @@ func testReattemptFailedSendHashmailCourier(t *harnessTest) { // Mint an asset for sending. rpcAssets := MintAssetsConfirmBatch( - t.t, t.lndHarness.Miner().Client, sendTapd, + t.t, t.lndHarness.Miner(), sendTapd, []*mintrpc.MintAssetRequest{simpleAssets[0]}, ) @@ -739,7 +739,7 @@ func testReattemptFailedSendHashmailCourier(t *harnessTest) { t, sendTapd, withReceiverAddresses(recvAddr), withSkipProofCourierPingCheck(), ) - _ = MineBlocks(t.t, t.lndHarness.Miner().Client, 1, 1) + _ = MineBlocks(t.t, t.lndHarness.Miner(), 1, 1) // Define a target event selector to match the backoff wait // event. This function selects for a specific event type. @@ -797,7 +797,7 @@ func testReattemptProofTransferOnTapdRestart(t *harnessTest) { // Use the sending node to mint an asset for sending. rpcAssets := MintAssetsConfirmBatch( - t.t, t.lndHarness.Miner().Client, sendTapd, + t.t, t.lndHarness.Miner(), sendTapd, []*mintrpc.MintAssetRequest{simpleAssets[0]}, ) @@ -845,7 +845,7 @@ func testReattemptProofTransferOnTapdRestart(t *harnessTest) { t, sendTapd, withReceiverAddresses(recvAddr), withSkipProofCourierPingCheck(), ) - MineBlocks(t.t, t.lndHarness.Miner().Client, 1, 1) + MineBlocks(t.t, t.lndHarness.Miner(), 1, 1) // Define a target event selector to match the backoff wait // event. This function selects for a specific event type. @@ -964,7 +964,7 @@ func testReattemptFailedSendUniCourier(t *harnessTest) { // Use the sending node to mint an asset for sending. rpcAssets := MintAssetsConfirmBatch( - t.t, t.lndHarness.Miner().Client, sendTapd, + t.t, t.lndHarness.Miner(), sendTapd, []*mintrpc.MintAssetRequest{simpleAssets[0]}, ) @@ -1005,7 +1005,7 @@ func testReattemptFailedSendUniCourier(t *harnessTest) { t, sendTapd, withReceiverAddresses(recvAddr), withSkipProofCourierPingCheck(), ) - _ = MineBlocks(t.t, t.lndHarness.Miner().Client, 1, 1) + _ = MineBlocks(t.t, t.lndHarness.Miner(), 1, 1) // Define a target event selector to match the backoff wait // event. This function selects for a specific event type. @@ -1064,7 +1064,7 @@ func testSpendChangeOutputWhenProofTransferFail(t *harnessTest) { // Use the sending node to mint an asset for sending. rpcAssets := MintAssetsConfirmBatch( - t.t, t.lndHarness.Miner().Client, sendTapd, + t.t, t.lndHarness.Miner(), sendTapd, []*mintrpc.MintAssetRequest{simpleAssets[0]}, ) @@ -1114,47 +1114,42 @@ func testSpendChangeOutputWhenProofTransferFail(t *harnessTest) { t, sendTapd, withReceiverAddresses(recvAddr), withSkipProofCourierPingCheck(), ) - MineBlocks(t.t, t.lndHarness.Miner().Client, 1, 1) + MineBlocks(t.t, t.lndHarness.Miner(), 1, 1) // There may be a delay between mining the anchoring transaction and // recognizing its on-chain confirmation. To handle this potential // delay, we use require.Eventually to ensure the transfer details are // correctly listed after confirmation. require.Eventually(t.t, func() bool { - // Ensure that the transaction took place as expected. listTransfersResp, err := sendTapd.ListTransfers( ctxb, &taprpc.ListTransfersRequest{}, ) - require.NoError(t.t, err) - - require.Len(t.t, listTransfersResp.Transfers, 1) + if err != nil || len(listTransfersResp.Transfers) != 1 { + return false + } firstTransfer := listTransfersResp.Transfers[0] - require.NotEqual(t.t, firstTransfer.AnchorTxHeightHint, 0) - require.NotEmpty(t.t, firstTransfer.AnchorTxBlockHash) + if firstTransfer.AnchorTxHeightHint == 0 { + return false + } - // Assert proof transfer status for each transfer output. - require.Len(t.t, firstTransfer.Outputs, 2) + // The block hash can lag behind the height hint in + // ListTransfers, so assert on the confirmation height + // and output proof states here. + if len(firstTransfer.Outputs) != 2 { + return false + } - // First output should have a proof delivery status of not - // applicable. This indicates that a proof will not be delivered - // for this output. firstOutput := firstTransfer.Outputs[0] - require.Equal( - t.t, rpcutils.ProofDeliveryStatusNotApplicable, - firstOutput.ProofDeliveryStatus, - ) + if firstOutput.ProofDeliveryStatus != + rpcutils.ProofDeliveryStatusNotApplicable { - // The second output should have a proof delivery status of - // pending. This indicates that the proof deliver has not yet - // completed successfully. - secondOutput := firstTransfer.Outputs[1] - require.Equal( - t.t, rpcutils.ProofDeliveryStatusPending, - secondOutput.ProofDeliveryStatus, - ) + return false + } - return true + secondOutput := firstTransfer.Outputs[1] + return secondOutput.ProofDeliveryStatus == + rpcutils.ProofDeliveryStatusPending }, defaultWaitTimeout, 200*time.Millisecond) // Define a target event selector to match the backoff wait @@ -1192,74 +1187,62 @@ func testSpendChangeOutputWhenProofTransferFail(t *harnessTest) { t, sendTapd, withReceiverAddresses(recvAddr), withSkipProofCourierPingCheck(), ) - MineBlocks(t.t, t.lndHarness.Miner().Client, 1, 1) + MineBlocks(t.t, t.lndHarness.Miner(), 1, 1) // There may be a delay between mining the anchoring transaction and // recognizing its on-chain confirmation. To handle this potential // delay, we use require.Eventually to ensure the transfer details are // correctly listed after confirmation. require.Eventually(t.t, func() bool { - // Ensure that the transaction took place as expected. listTransfersResp, err := sendTapd.ListTransfers( ctxb, &taprpc.ListTransfersRequest{}, ) - require.NoError(t.t, err) - - require.Len(t.t, listTransfersResp.Transfers, 2) + if err != nil || len(listTransfersResp.Transfers) != 2 { + return false + } - // Inspect the first transfer. firstTransfer := listTransfersResp.Transfers[0] - require.NotEqual(t.t, firstTransfer.AnchorTxHeightHint, 0) - require.NotEmpty(t.t, firstTransfer.AnchorTxBlockHash) + if firstTransfer.AnchorTxHeightHint == 0 { + return false + } - // Assert proof transfer status for each transfer output. - require.Len(t.t, firstTransfer.Outputs, 2) + if len(firstTransfer.Outputs) != 2 { + return false + } - // First output should have a proof delivery status of not - // applicable. This indicates that a proof will not be delivered - // for this output. firstOutput := firstTransfer.Outputs[0] - require.Equal( - t.t, rpcutils.ProofDeliveryStatusNotApplicable, - firstOutput.ProofDeliveryStatus, - ) + if firstOutput.ProofDeliveryStatus != + rpcutils.ProofDeliveryStatusNotApplicable { + + return false + } - // The second output should have a proof delivery status of - // pending. This indicates that the proof deliver has not yet - // completed successfully. secondOutput := firstTransfer.Outputs[1] - require.Equal( - t.t, rpcutils.ProofDeliveryStatusPending, - secondOutput.ProofDeliveryStatus, - ) + if secondOutput.ProofDeliveryStatus != + rpcutils.ProofDeliveryStatusPending { + + return false + } - // Inspect the second transfer. secondTransfer := listTransfersResp.Transfers[1] - require.NotEqual(t.t, secondTransfer.AnchorTxHeightHint, 0) - require.NotEmpty(t.t, secondTransfer.AnchorTxBlockHash) + if secondTransfer.AnchorTxHeightHint == 0 { + return false + } - // Assert proof transfer status for each transfer output. - require.Len(t.t, secondTransfer.Outputs, 2) + if len(secondTransfer.Outputs) != 2 { + return false + } - // First output should have a proof delivery status of not - // applicable. This indicates that a proof will not be delivered - // for this output. firstOutput = secondTransfer.Outputs[0] - require.Equal( - t.t, rpcutils.ProofDeliveryStatusNotApplicable, - firstOutput.ProofDeliveryStatus, - ) + if firstOutput.ProofDeliveryStatus != + rpcutils.ProofDeliveryStatusNotApplicable { - // The second output should have a proof delivery status of - // pending. This indicates that the proof deliver has not yet - // completed successfully. - secondOutput = secondTransfer.Outputs[1] - require.Equal( - t.t, rpcutils.ProofDeliveryStatusPending, - secondOutput.ProofDeliveryStatus, - ) + return false + } - return true + secondOutput = secondTransfer.Outputs[1] + return secondOutput.ProofDeliveryStatus == + rpcutils.ProofDeliveryStatusPending }, defaultWaitTimeout, 200*time.Millisecond) // Restart the proof courier service. @@ -1298,7 +1281,7 @@ func testReattemptFailedReceiveUniCourier(t *harnessTest) { // Mint an asset for sending using the sending tapd node. rpcAssets := MintAssetsConfirmBatch( - t.t, t.lndHarness.Miner().Client, sendTapd, + t.t, t.lndHarness.Miner(), sendTapd, []*mintrpc.MintAssetRequest{simpleAssets[0]}, ) @@ -1322,7 +1305,7 @@ func testReattemptFailedReceiveUniCourier(t *harnessTest) { // Send asset and then mine to confirm the associated on-chain tx. sendAssetsToAddr(t, sendTapd, recvAddr) - _ = MineBlocks(t.t, t.lndHarness.Miner().Client, 1, 1) + _ = MineBlocks(t.t, t.lndHarness.Miner(), 1, 1) // At this point, the proof courier service is running. We will // therefore pause to allow the sender to transfer the proof to the @@ -1452,7 +1435,7 @@ func testOfflineReceiverEventuallyReceives(t *harnessTest) { // Mint an asset for sending. rpcAssets := MintAssetsConfirmBatch( - t.t, t.lndHarness.Miner().Client, sendTapd, + t.t, t.lndHarness.Miner(), sendTapd, []*mintrpc.MintAssetRequest{simpleAssets[0]}, ) @@ -1476,7 +1459,7 @@ func testOfflineReceiverEventuallyReceives(t *harnessTest) { // Send asset and then mine to confirm the associated on-chain tx. sendAssetsToAddr(t, sendTapd, recvAddr) - _ = MineBlocks(t.t, t.lndHarness.Miner().Client, 1, 1) + _ = MineBlocks(t.t, t.lndHarness.Miner(), 1, 1) // Pause before restarting receiving tapd node so that sender node has // an opportunity to attempt to send the proof multiple times. @@ -1617,7 +1600,7 @@ func testMultiInputSendNonInteractiveSingleID(t *harnessTest) { // Mint a single asset. rpcAssets := MintAssetsConfirmBatch( - t.t, t.lndHarness.Miner().Client, t.tapd, + t.t, t.lndHarness.Miner(), t.tapd, []*mintrpc.MintAssetRequest{simpleAssets[0]}, ) rpcAsset := rpcAssets[0] @@ -1645,7 +1628,7 @@ func testMultiInputSendNonInteractiveSingleID(t *harnessTest) { sendResp, sendEvents := sendAssetsToAddr(t, t.tapd, addr) ConfirmAndAssertOutboundTransfer( - t.t, t.lndHarness.Miner().Client, t.tapd, sendResp, + t.t, t.lndHarness.Miner(), t.tapd, sendResp, genInfo.AssetId, []uint64{4000, 1000}, 0, 1, ) @@ -1666,7 +1649,7 @@ func testMultiInputSendNonInteractiveSingleID(t *harnessTest) { sendResp, sendEvents = sendAssetsToAddr(t, t.tapd, addr) ConfirmAndAssertOutboundTransfer( - t.t, t.lndHarness.Miner().Client, t.tapd, sendResp, + t.t, t.lndHarness.Miner(), t.tapd, sendResp, genInfo.AssetId, []uint64{0, 4000}, 1, 2, ) @@ -1690,7 +1673,7 @@ func testMultiInputSendNonInteractiveSingleID(t *harnessTest) { sendResp, sendEvents = sendAssetsToAddr(t, bobTapd, addr) ConfirmAndAssertOutboundTransfer( - t.t, t.lndHarness.Miner().Client, bobTapd, sendResp, + t.t, t.lndHarness.Miner(), bobTapd, sendResp, genInfo.AssetId, []uint64{0, 5000}, 0, 1, ) @@ -1706,7 +1689,7 @@ func testSendMultipleCoins(t *harnessTest) { // First, we'll make a normal assets with enough units to allow us to // send it to different UTXOs rpcAssets := MintAssetsConfirmBatch( - t.t, t.lndHarness.Miner().Client, t.tapd, + t.t, t.lndHarness.Miner(), t.tapd, []*mintrpc.MintAssetRequest{simpleAssets[0]}, ) @@ -1742,7 +1725,7 @@ func testSendMultipleCoins(t *harnessTest) { // transfer to send the coins back to our wallet in 5 pieces now. sendResp, sendEvents := sendAssetsToAddr(t, t.tapd, addrs...) ConfirmAndAssertOutboundTransferWithOutputs( - t.t, t.lndHarness.Miner().Client, t.tapd, sendResp, + t.t, t.lndHarness.Miner(), t.tapd, sendResp, genInfo.AssetId, []uint64{ 0, unitsPerPart, unitsPerPart, unitsPerPart, unitsPerPart, unitsPerPart, @@ -1775,7 +1758,7 @@ func testSendMultipleCoins(t *harnessTest) { t, t.tapd, bobAddrs[i], ) AssertAssetOutboundTransferWithOutputs( - t.t, t.lndHarness.Miner().Client, t.tapd, + t.t, t.lndHarness.Miner(), t.tapd, sendResp.Transfer, [][]byte{genInfo.AssetId}, []uint64{0, unitsPerPart}, i+1, i+2, 2, false, @@ -1801,7 +1784,7 @@ func testSendMultipleCoins(t *harnessTest) { // Now we confirm the 5 transfers and make sure they complete as // expected. - _ = MineBlocks(t.t, t.lndHarness.Miner().Client, 1, 5) + _ = MineBlocks(t.t, t.lndHarness.Miner(), 1, 5) AssertNonInteractiveRecvComplete(t.t, secondTapd, 5) for idx, events := range addrSendEvents { AssertSendEventsComplete(t.t, bobAddrs[idx].ScriptKey, events) @@ -1824,7 +1807,7 @@ func testSendNoCourierUniverseImport(t *harnessTest) { // First, we'll make a normal assets with enough units. rpcAssets := MintAssetsConfirmBatch( - t.t, t.lndHarness.Miner().Client, t.tapd, + t.t, t.lndHarness.Miner(), t.tapd, []*mintrpc.MintAssetRequest{simpleAssets[0]}, ) @@ -1863,7 +1846,7 @@ func testSendNoCourierUniverseImport(t *harnessTest) { // Assert that the outbound transfer was confirmed. expectedAmtAfterSend := firstAsset.Amount - numUnitsSend ConfirmAndAssertOutboundTransfer( - t.t, t.lndHarness.Miner().Client, t.tapd, sendResp, + t.t, t.lndHarness.Miner(), t.tapd, sendResp, genInfo.AssetId, []uint64{expectedAmtAfterSend, numUnitsSend}, 0, 1, ) @@ -1889,7 +1872,7 @@ func testHistoricalSendEventsReplay(t *harnessTest) { // First, mint an asset. rpcAssets := MintAssetsConfirmBatch( - t.t, t.lndHarness.Miner().Client, t.tapd, + t.t, t.lndHarness.Miner(), t.tapd, []*mintrpc.MintAssetRequest{simpleAssets[0]}, ) totalMinted := rpcAssets[0].Amount @@ -1932,7 +1915,7 @@ func testHistoricalSendEventsReplay(t *harnessTest) { // Confirm the transfer. changeUnits -= amount ConfirmAndAssertOutboundTransfer( - t.t, t.lndHarness.Miner().Client, t.tapd, sendResp, + t.t, t.lndHarness.Miner(), t.tapd, sendResp, genInfo.AssetId, []uint64{changeUnits, amount}, i, i+1, ) AssertNonInteractiveRecvComplete(t.t, secondTapd, i+1) @@ -2140,7 +2123,7 @@ func testRestoreLndFromSeed(t *harnessTest) { // We mint a batch of normal assets with enough units to allow us to // send it around a few times. rpcAssets := MintAssetsConfirmBatch( - t.t, t.lndHarness.Miner().Client, bob, + t.t, t.lndHarness.Miner(), bob, []*mintrpc.MintAssetRequest{issuableAssets[0]}, ) @@ -2164,7 +2147,7 @@ func testRestoreLndFromSeed(t *harnessTest) { sendResp, sendEvents := sendAssetsToAddr(t, bob, aliceAddr) ConfirmAndAssertOutboundTransfer( - t.t, t.lndHarness.Miner().Client, bob, sendResp, + t.t, t.lndHarness.Miner(), bob, sendResp, genInfo.AssetId, []uint64{rpcAsset.Amount - sendAmount, sendAmount}, 0, 1, ) @@ -2204,7 +2187,7 @@ func testRestoreLndFromSeed(t *harnessTest) { sendResp, sendEvents = sendAssetsToAddr(t, bob, aliceAddr) ConfirmAndAssertOutboundTransfer( - t.t, t.lndHarness.Miner().Client, bob, sendResp, + t.t, t.lndHarness.Miner(), bob, sendResp, genInfo.AssetId, []uint64{rpcAsset.Amount - sendAmount*2, sendAmount}, 1, 2, ) diff --git a/itest/supply_commit_test.go b/itest/supply_commit_test.go index 638e7965b7..574f01184a 100644 --- a/itest/supply_commit_test.go +++ b/itest/supply_commit_test.go @@ -100,7 +100,7 @@ func testPreCommitOutput(t *harnessTest) { mintReq := CopyRequest(issuableAssets[0]) mintReq.Asset.EnableSupplyCommitments = true rpcAssets := MintAssetsConfirmBatch( - t.t, t.lndHarness.Miner().Client, t.tapd, + t.t, t.lndHarness.Miner(), t.tapd, []*mintrpc.MintAssetRequest{mintReq}, ) require.Len(t.t, rpcAssets, 1, "expected one minted asset") @@ -132,7 +132,7 @@ func testPreCommitOutput(t *harnessTest) { }, } rpcAssets = MintAssetsConfirmBatch( - t.t, t.lndHarness.Miner().Client, t.tapd, + t.t, t.lndHarness.Miner(), t.tapd, []*mintrpc.MintAssetRequest{mintReq}, ) @@ -178,7 +178,7 @@ func testSupplyCommitIgnoreAsset(t *harnessTest) { mintReq := CopyRequest(issuableAssets[0]) mintReq.Asset.EnableSupplyCommitments = true rpcAssets := MintAssetsConfirmBatch( - t.t, t.lndHarness.Miner().Client, t.tapd, + t.t, t.lndHarness.Miner(), t.tapd, []*mintrpc.MintAssetRequest{mintReq}, ) require.Len(t.t, rpcAssets, 1, "expected one minted asset") @@ -290,7 +290,7 @@ func testSupplyCommitIgnoreAsset(t *harnessTest) { require.NotNil(t.t, respUpdate) t.Log("Mining supply commitment tx") - minedBlocks := MineBlocks(t.t, t.lndHarness.Miner().Client, 1, 1) + minedBlocks := MineBlocks(t.t, t.lndHarness.Miner(), 1, 1) t.Log("Fetch updated supply commitment") @@ -765,7 +765,7 @@ func MintAssetWithSupplyCommit(t *harnessTest, // Mint the asset. rpcAssets := MintAssetsConfirmBatch( - t.t, t.lndHarness.Miner().Client, t.tapd, + t.t, t.lndHarness.Miner(), t.tapd, []*mintrpc.MintAssetRequest{mintReq}, ) require.Len(t.t, rpcAssets, 1, "expected one minted asset") @@ -814,7 +814,7 @@ func testSupplyCommitMintBurn(t *harnessTest) { // TODO(roasbeef): still rely on the time based ticker here? t.Log("Create first supply commitment tx for asset group") UpdateAndMineSupplyCommit( - t.t, ctxb, t.tapd, t.lndHarness.Miner().Client, + t.t, ctxb, t.tapd, t.lndHarness.Miner(), groupKeyBytes, 1, ) @@ -872,7 +872,7 @@ func testSupplyCommitMintBurn(t *harnessTest) { t.Log("Updating supply commitment after second mint") UpdateAndMineSupplyCommit( - t.t, ctxb, t.tapd, t.lndHarness.Miner().Client, + t.t, ctxb, t.tapd, t.lndHarness.Miner(), groupKeyBytes, 1, ) @@ -915,7 +915,7 @@ func testSupplyCommitMintBurn(t *harnessTest) { // Confirm the burn transaction, asserting that all the expected records // on disk are in place. AssertAssetOutboundTransferWithOutputs( - t.t, t.lndHarness.Miner().Client, t.tapd, burnResp.BurnTransfer, + t.t, t.lndHarness.Miner(), t.tapd, burnResp.BurnTransfer, [][]byte{rpcFirstAsset.AssetGenesis.AssetId}, []uint64{mintReq.Asset.Amount - burnAmt, burnAmt}, 0, 1, 2, true, @@ -931,7 +931,7 @@ func testSupplyCommitMintBurn(t *harnessTest) { // Update and mine the supply commitment after burn. finalMinedBlocks := UpdateAndMineSupplyCommit( - t.t, ctxb, t.tapd, t.lndHarness.Miner().Client, + t.t, ctxb, t.tapd, t.lndHarness.Miner(), groupKeyBytes, 1, ) @@ -1064,7 +1064,7 @@ func testFetchSupplyLeaves(t *harnessTest) { t.Log("Creating first supply commitment transaction") UpdateAndMineSupplyCommit( - t.t, ctxb, t.tapd, t.lndHarness.Miner().Client, + t.t, ctxb, t.tapd, t.lndHarness.Miner(), groupKeyBytes, 1, ) @@ -1151,7 +1151,7 @@ func testFetchSupplyLeaves(t *harnessTest) { t.Log("Confirming burn transaction") AssertAssetOutboundTransferWithOutputs( - t.t, t.lndHarness.Miner().Client, t.tapd, burnResp.BurnTransfer, + t.t, t.lndHarness.Miner(), t.tapd, burnResp.BurnTransfer, [][]byte{rpcFirstAsset.AssetGenesis.AssetId}, []uint64{mintReq.Asset.Amount - burnAmt, burnAmt}, 0, 1, 2, true, @@ -1159,7 +1159,7 @@ func testFetchSupplyLeaves(t *harnessTest) { t.Log("Updating supply commitment after burn") UpdateAndMineSupplyCommit( - t.t, ctxb, t.tapd, t.lndHarness.Miner().Client, + t.t, ctxb, t.tapd, t.lndHarness.Miner(), groupKeyBytes, 1, ) @@ -1242,7 +1242,7 @@ func testFetchSupplyLeaves(t *harnessTest) { } rpcSecondAsset := MintAssetsConfirmBatch( - t.t, t.lndHarness.Miner().Client, t.tapd, + t.t, t.lndHarness.Miner(), t.tapd, []*mintrpc.MintAssetRequest{secondMintReq}, ) require.Len(t.t, rpcSecondAsset, 1, "expected one minted asset") @@ -1253,7 +1253,7 @@ func testFetchSupplyLeaves(t *harnessTest) { t.Log("Updating supply commitment after second mint") UpdateAndMineSupplyCommit( - t.t, ctxb, t.tapd, t.lndHarness.Miner().Client, + t.t, ctxb, t.tapd, t.lndHarness.Miner(), groupKeyBytes, 1, ) @@ -1326,7 +1326,7 @@ func testFetchSupplyLeaves(t *harnessTest) { t.Log("Updating supply commitment after ignoring asset outpoint") UpdateAndMineSupplyCommit( - t.t, ctxb, t.tapd, t.lndHarness.Miner().Client, + t.t, ctxb, t.tapd, t.lndHarness.Miner(), groupKeyBytes, 1, ) @@ -1560,7 +1560,7 @@ func testSupplyVerifyPeerNode(t *harnessTest) { require.NotNil(t.t, groupKeyBytes) UpdateAndMineSupplyCommit( - t.t, ctxb, t.tapd, t.lndHarness.Miner().Client, + t.t, ctxb, t.tapd, t.lndHarness.Miner(), groupKeyBytes, 1, ) @@ -1653,7 +1653,7 @@ func testSupplyVerifyPeerNode(t *harnessTest) { t.Log("Updating supply commitment after ignoring asset outpoint") UpdateAndMineSupplyCommit( - t.t, ctxb, t.tapd, t.lndHarness.Miner().Client, + t.t, ctxb, t.tapd, t.lndHarness.Miner(), groupKeyBytes, 1, ) @@ -1793,7 +1793,7 @@ func testSupplyVerifyPeerNode(t *harnessTest) { t.Log("Updating supply commitment after second mint (creating third " + "supply commitment)") UpdateAndMineSupplyCommit( - t.t, ctxb, t.tapd, t.lndHarness.Miner().Client, + t.t, ctxb, t.tapd, t.lndHarness.Miner(), groupKeyBytes, 1, ) diff --git a/itest/test_harness.go b/itest/test_harness.go index 6ce18f55c5..f2ba20ee37 100644 --- a/itest/test_harness.go +++ b/itest/test_harness.go @@ -9,7 +9,6 @@ import ( "github.com/btcsuite/btcd/chaincfg" "github.com/btcsuite/btcd/chaincfg/chainhash" - "github.com/btcsuite/btcd/rpcclient" "github.com/go-errors/errors" "github.com/lightninglabs/lndclient" "github.com/lightninglabs/taproot-assets/proof" @@ -17,6 +16,7 @@ import ( unirpc "github.com/lightninglabs/taproot-assets/taprpc/universerpc" "github.com/lightningnetwork/lnd/build" "github.com/lightningnetwork/lnd/lntest" + lntestminer "github.com/lightningnetwork/lnd/lntest/miner" "github.com/lightningnetwork/lnd/lntest/node" "github.com/lightningnetwork/lnd/lntest/port" "github.com/lightningnetwork/lnd/lntest/wait" @@ -491,25 +491,21 @@ func setupTapdHarness(t *testing.T, ht *harnessTest, // isMempoolEmpty checks whether the mempool remains empty for the given // timeout. -func isMempoolEmpty(miner *rpcclient.Client, timeout time.Duration) (bool, - error) { +func isMempoolEmpty(miner *lntestminer.HarnessMiner, + timeout time.Duration) (bool, error) { breakTimeout := time.After(timeout) ticker := time.NewTicker(50 * time.Millisecond) defer ticker.Stop() - var err error - var mempool []*chainhash.Hash + var mempool []chainhash.Hash for { select { case <-breakTimeout: return true, nil case <-ticker.C: - mempool, err = miner.GetRawMempool() - if err != nil { - return false, err - } + mempool = miner.GetRawMempool() if len(mempool) > 0 { return false, nil } @@ -520,26 +516,21 @@ func isMempoolEmpty(miner *rpcclient.Client, timeout time.Duration) (bool, // WaitForNTxsInMempool polls until finding the desired number of transactions // in the provided miner's mempool. An error is returned if this number is not // met after the given timeout. -func WaitForNTxsInMempool(miner *rpcclient.Client, n int, - timeout time.Duration) ([]*chainhash.Hash, error) { +func WaitForNTxsInMempool(miner *lntestminer.HarnessMiner, n int, + timeout time.Duration) ([]chainhash.Hash, error) { breakTimeout := time.After(timeout) ticker := time.NewTicker(50 * time.Millisecond) defer ticker.Stop() - var err error - var mempool []*chainhash.Hash + var mempool []chainhash.Hash for { select { case <-breakTimeout: return nil, fmt.Errorf("wanted %v, found %v txs "+ "in mempool: %v", n, len(mempool), mempool) case <-ticker.C: - mempool, err = miner.GetRawMempool() - if err != nil { - return nil, err - } - + mempool = miner.GetRawMempool() if len(mempool) == n { return mempool, nil } diff --git a/itest/test_list_on_test.go b/itest/test_list_on_test.go index 177701e288..cc30557983 100644 --- a/itest/test_list_on_test.go +++ b/itest/test_list_on_test.go @@ -21,6 +21,10 @@ var allTestCases = []*testCase{ name: "mint batch and transfer", test: testMintBatchAndTransfer, }, + { + name: "anchor tx version v3", + test: testAnchorTxVersionV3, + }, { name: "list assets", test: testListAssets, diff --git a/itest/universe_federation_test.go b/itest/universe_federation_test.go index 160fe1c975..98875f2ae4 100644 --- a/itest/universe_federation_test.go +++ b/itest/universe_federation_test.go @@ -66,7 +66,7 @@ func testMintProofRepeatFedSyncAttempt(t *harnessTest) { // Now that federation peer node is inactive, we'll mint some assets. t.Logf("Minting assets on minting node") rpcAssets := MintAssetsConfirmBatch( - t.t, t.lndHarness.Miner().Client, mintingNode, + t.t, t.lndHarness.Miner(), mintingNode, []*mintrpc.MintAssetRequest{ simpleAssets[0], issuableAssets[0], }, @@ -102,7 +102,7 @@ func testMintProofRepeatFedSyncAttempt(t *harnessTest) { // fix this would fail with an FK violation. func testDeleteUniverseAfterFedSync(t *harnessTest) { ctx := context.Background() - miner := t.lndHarness.Miner().Client + miner := t.lndHarness.Miner() // Mint a simple asset on Alice (the main harness node). rpcAssets := MintAssetsConfirmBatch( diff --git a/itest/universe_pagination_test.go b/itest/universe_pagination_test.go index 29630c1bd6..40a40b3f15 100644 --- a/itest/universe_pagination_test.go +++ b/itest/universe_pagination_test.go @@ -44,7 +44,7 @@ func testUniversePaginationSimple(t *harnessTest) { mintBatches := func(reqs []*mintrpc.MintAssetRequest) []*taprpc.Asset { return MintAssetsConfirmBatch( - t.t, t.lndHarness.Miner().Client, t.tapd, reqs, + t.t, t.lndHarness.Miner(), t.tapd, reqs, WithMintingTimeout(timeout), ) } diff --git a/itest/universe_test.go b/itest/universe_test.go index d7f294c697..d2d16f5010 100644 --- a/itest/universe_test.go +++ b/itest/universe_test.go @@ -31,7 +31,7 @@ import ( // testUniverseSync tests that we're able to properly sync the universe state // between two nodes. func testUniverseSync(t *harnessTest) { - miner := t.lndHarness.Miner().Client + miner := t.lndHarness.Miner() // First, we'll create out usual set of simple and also issuable // assets. rpcSimpleAssets := MintAssetsConfirmBatch( @@ -295,7 +295,7 @@ func testUniverseSync(t *harnessTest) { // testUniverseDeleteLeaf tests that we can delete a single leaf from // a universe via the RPC endpoint and verify it's gone. func testUniverseDeleteLeaf(t *harnessTest) { - miner := t.lndHarness.Miner().Client + miner := t.lndHarness.Miner() // Mint assets on the primary node. rpcSimpleAssets := MintAssetsConfirmBatch( @@ -390,7 +390,7 @@ func testUniverseDeleteLeaf(t *harnessTest) { // testUniverseManualSync tests that we're able to insert proofs manually into // a universe instead of using a full sync. func testUniverseManualSync(t *harnessTest) { - miner := t.lndHarness.Miner().Client + miner := t.lndHarness.Miner() // First, we'll create out usual set of issuable assets. rpcIssuableAssets := MintAssetsConfirmBatch( @@ -480,7 +480,7 @@ func unmarshalMerkleSumNode(root *unirpc.MerkleSumNode) mssmt.Node { // testUniverseREST tests that we're able to properly query the universe state // via the REST interface. func testUniverseREST(t *harnessTest) { - miner := t.lndHarness.Miner().Client + miner := t.lndHarness.Miner() // Mint a few assets that we then want to inspect in the universe. rpcSimpleAssets := MintAssetsConfirmBatch( t.t, miner, t.tapd, simpleAssets, @@ -605,7 +605,7 @@ func testUniverseFederation(t *harnessTest) { ctx := context.Background() - miner := t.lndHarness.Miner().Client + miner := t.lndHarness.Miner() // Now that Bob is active, we'll make a set of assets with the main node. firstAsset := MintAssetsConfirmBatch(t.t, miner, t.tapd, simpleAssets[:1]) diff --git a/itest/utils.go b/itest/utils.go index 6498532789..1d1dc6ee24 100644 --- a/itest/utils.go +++ b/itest/utils.go @@ -10,9 +10,7 @@ import ( "github.com/btcsuite/btcd/btcec/v2" "github.com/btcsuite/btcd/btcutil" "github.com/btcsuite/btcd/btcutil/psbt" - "github.com/btcsuite/btcd/chaincfg" "github.com/btcsuite/btcd/chaincfg/chainhash" - "github.com/btcsuite/btcd/rpcclient" "github.com/btcsuite/btcd/txscript" "github.com/btcsuite/btcd/wire" "github.com/lightninglabs/lndclient" @@ -34,6 +32,7 @@ import ( "github.com/lightninglabs/taproot-assets/universe" "github.com/lightningnetwork/lnd/chainntnfs" "github.com/lightningnetwork/lnd/lnrpc" + lntestminer "github.com/lightningnetwork/lnd/lntest/miner" "github.com/lightningnetwork/lnd/lntest/node" "github.com/lightningnetwork/lnd/lntest/wait" "github.com/lightningnetwork/lnd/lnwallet/chainfee" @@ -42,11 +41,7 @@ import ( "google.golang.org/protobuf/proto" ) -var ( - zeroHash chainhash.Hash - regtestMiningAddr = "n1VgRjYDzJT2TV72PnungWgWu18SWorXZS" - regtestParams = &chaincfg.RegressionNetParams -) +var zeroHash chainhash.Hash const ( SyncModeIssuance = universerpc.UniverseSyncMode_SYNC_ISSUANCE_ONLY @@ -190,65 +185,75 @@ func AssertSendEventProofTransferBackoffWaitTypeSend(t *harnessTest, // MineBlocks mine 'num' of blocks and check that blocks are present in // node blockchain. numTxs should be set to the number of transactions // (excluding the coinbase) we expect to be included in the first mined block. -func MineBlocks(t *testing.T, client *rpcclient.Client, +func MineBlocks(t *testing.T, miner *lntestminer.HarnessMiner, num uint32, numTxs int) []*wire.MsgBlock { // If we expect transactions to be included in the blocks we'll mine, // we wait here until they are seen in the miner's mempool. - var txids []*chainhash.Hash + var txids []chainhash.Hash var err error if numTxs > 0 { txids, err = WaitForNTxsInMempool( - client, numTxs, minerMempoolTimeout, + miner, numTxs, minerMempoolTimeout, ) if err != nil { t.Fatalf("unable to find txns in mempool: %v", err) } } - blocks := make([]*wire.MsgBlock, num) + blocks := miner.MineBlocks(num) - backend, err := client.BackendVersion() - require.NoError(t, err) + // Finally, assert that all the transactions were included in the first + // block. + for _, txid := range txids { + AssertTxInBlock(t, blocks[0], &txid) + } - var blockHashes []*chainhash.Hash + return blocks +} - switch backend.(type) { - case *rpcclient.BitcoindVersion: - addr, err := btcutil.DecodeAddress( - regtestMiningAddr, regtestParams, - ) - require.NoError(t, err) +// SendOutputs creates and broadcasts a transaction that pays the given outputs +// using the miner wallet and returns the broadcast transaction ID. +func SendOutputs(miner *lntestminer.HarnessMiner, outputs []*wire.TxOut, + feeRate btcutil.Amount) (*chainhash.Hash, error) { - blockHashes, err = client.GenerateToAddress( - int64(num), addr, nil, - ) - require.NoError(t, err) + tx := miner.CreateTransaction(outputs, feeRate) + return miner.SendRawTransaction(tx, true) +} - case rpcclient.BtcdVersion: - blockHashes, err = client.Generate(num) - require.NoError(t, err) +// AssertAnchorTxVersion verifies that the given Bitcoin transaction was mined +// with the expected transaction version. +func AssertAnchorTxVersion(t *testing.T, miner *lntestminer.HarnessMiner, + txHash chainhash.Hash, expectedVersion int32) { - default: - require.Fail(t, "unknown chain backend: %v", backend) - } + tx := miner.GetRawTransaction(txHash) + require.Equal(t, expectedVersion, tx.MsgTx().Version) +} - for i, blockHash := range blockHashes { - block, err := client.GetBlock(blockHash) - if err != nil { - t.Fatalf("unable to get block: %v", err) - } +// AssertAssetAnchorTxVersion verifies the on-chain anchor transaction version +// of the given asset. +func AssertAssetAnchorTxVersion(t *testing.T, + miner *lntestminer.HarnessMiner, rpcAsset *taprpc.Asset, + expectedVersion int32) { - blocks[i] = block - } + outpoint, err := wire.NewOutPointFromString( + rpcAsset.ChainAnchor.AnchorOutpoint, + ) + require.NoError(t, err) - // Finally, assert that all the transactions were included in the first - // block. - for _, txid := range txids { - AssertTxInBlock(t, blocks[0], txid) - } + AssertAnchorTxVersion(t, miner, outpoint.Hash, expectedVersion) +} - return blocks +// AssertTransferAnchorTxVersion verifies the on-chain anchor transaction +// version of the given transfer. +func AssertTransferAnchorTxVersion(t *testing.T, + miner *lntestminer.HarnessMiner, transfer *taprpc.AssetTransfer, + expectedVersion int32) { + + txHash, err := chainhash.NewHash(transfer.AnchorTxHash) + require.NoError(t, err) + + AssertAnchorTxVersion(t, miner, *txHash, expectedVersion) } type UTXORequest struct { @@ -323,6 +328,7 @@ type MintOptions struct { mintingTimeout time.Duration siblingBranch *mintrpc.FinalizeBatchRequest_Branch siblingFullTree *mintrpc.FinalizeBatchRequest_FullTree + anchorTxVersion taprpc.AnchorTxVersion feeRate uint32 errText string } @@ -357,6 +363,14 @@ func WithFeeRate(feeRate uint32) MintOption { } } +// WithMintAnchorTxVersion is an option to specify the anchor transaction +// version for batch finalization. +func WithMintAnchorTxVersion(version taprpc.AnchorTxVersion) MintOption { + return func(options *MintOptions) { + options.anchorTxVersion = version + } +} + // WithError is an option to specify the string that is expected in the error // returned by the FinalizeBatch call. func WithError(errorText string) MintOption { @@ -389,7 +403,8 @@ func BuildMintingBatch(t *testing.T, tapClient commands.RpcClientsBundle, } } -func FinalizeBatchUnconfirmed(t *testing.T, minerClient *rpcclient.Client, +func FinalizeBatchUnconfirmed(t *testing.T, + minerClient *lntestminer.HarnessMiner, tapClient commands.RpcClientsBundle, assetRequests []*mintrpc.MintAssetRequest, opts ...MintOption) (chainhash.Hash, []byte) { @@ -414,6 +429,11 @@ func FinalizeBatchUnconfirmed(t *testing.T, minerClient *rpcclient.Client, if options.feeRate > 0 { finalizeReq.FeeRate = options.feeRate } + if options.anchorTxVersion != + taprpc.AnchorTxVersion_ANCHOR_TX_VERSION_UNSPECIFIED { + + finalizeReq.AnchorTxVersion = options.anchorTxVersion + } // Instruct the daemon to finalize the batch. batchResp, err := tapClient.FinalizeBatch(ctxt, finalizeReq) @@ -497,7 +517,7 @@ func FinalizeBatchUnconfirmed(t *testing.T, minerClient *rpcclient.Client, metaHash[:], AssetAmountCheck(assetRequest.Asset.Amount), AssetTypeCheck(assetRequest.Asset.AssetType), - AssetAnchorCheck(*hashes[0], zeroHash), + AssetAnchorCheck(hashes[0], zeroHash), AssetScriptKeyIsLocalCheck(true), AssetVersionCheck(assetRequest.Asset.AssetVersion), AssetScriptKeyCheck(assetRequest.Asset.ScriptKey), @@ -514,13 +534,13 @@ func FinalizeBatchUnconfirmed(t *testing.T, minerClient *rpcclient.Client, ) } - return *hashes[0], batchResp.Batch.BatchKey + return hashes[0], batchResp.Batch.BatchKey } // MintAssetUnconfirmed is a helper function that mints a batch of assets and // waits until the minting transaction is in the mempool but does not mine a // block. -func MintAssetUnconfirmed(t *testing.T, minerClient *rpcclient.Client, +func MintAssetUnconfirmed(t *testing.T, minerClient *lntestminer.HarnessMiner, tapClient commands.RpcClientsBundle, assetRequests []*mintrpc.MintAssetRequest, opts ...MintOption) (chainhash.Hash, []byte) { @@ -535,7 +555,7 @@ func MintAssetUnconfirmed(t *testing.T, minerClient *rpcclient.Client, // MintAssetsConfirmBatch mints all given assets in the same batch, confirms the // batch and verifies all asset proofs of the minted assets. -func MintAssetsConfirmBatch(t *testing.T, minerClient *rpcclient.Client, +func MintAssetsConfirmBatch(t *testing.T, minerClient *lntestminer.HarnessMiner, tapClient commands.RpcClientsBundle, assetRequests []*mintrpc.MintAssetRequest, opts ...MintOption) []*taprpc.Asset { @@ -575,7 +595,7 @@ func MintAssetsConfirmBatch(t *testing.T, minerClient *rpcclient.Client, ) } -func ConfirmBatch(t *testing.T, minerClient *rpcclient.Client, +func ConfirmBatch(t *testing.T, minerClient *lntestminer.HarnessMiner, tapClient commands.RpcClientsBundle, assetRequests []*mintrpc.MintAssetRequest, sub *EventSubscription[*mintrpc.MintEvent], mintTXID chainhash.Hash, @@ -877,10 +897,10 @@ func MintAssetExternalSigner(t *harnessTest, tapNode *tapdHarness, } batchTXID, batchKey := FinalizeBatchUnconfirmed( - t.t, t.lndHarness.Miner().Client, tapNode, assetReqs, + t.t, t.lndHarness.Miner(), tapNode, assetReqs, ) batchAssets := ConfirmBatch( - t.t, t.lndHarness.Miner().Client, tapNode, assetReqs, sub, + t.t, t.lndHarness.Miner(), tapNode, assetReqs, sub, batchTXID, batchKey, ) diff --git a/itest/zero_value_anchor_test.go b/itest/zero_value_anchor_test.go index af2e7d8dea..a22a46452e 100644 --- a/itest/zero_value_anchor_test.go +++ b/itest/zero_value_anchor_test.go @@ -27,7 +27,7 @@ func testZeroValueAnchorSweep(t *harnessTest) { // First, mint some simple asset. rpcAssets := MintAssetsConfirmBatch( - t.t, t.lndHarness.Miner().Client, t.tapd, + t.t, t.lndHarness.Miner(), t.tapd, []*mintrpc.MintAssetRequest{simpleAssets[0]}, ) genInfo := rpcAssets[0].AssetGenesis @@ -51,7 +51,7 @@ func testZeroValueAnchorSweep(t *harnessTest) { sendResp, _ := sendAssetsToAddr(t, t.tapd, bobAddr) ConfirmAndAssertOutboundTransfer( - t.t, t.lndHarness.Miner().Client, t.tapd, sendResp, + t.t, t.lndHarness.Miner(), t.tapd, sendResp, genInfo.AssetId, []uint64{0, assetAmount}, 0, 1, ) @@ -65,7 +65,7 @@ func testZeroValueAnchorSweep(t *harnessTest) { // Test 1: Send transaction sweeps tombstones. rpcAssets2 := MintAssetsConfirmBatch( - t.t, t.lndHarness.Miner().Client, t.tapd, + t.t, t.lndHarness.Miner(), t.tapd, []*mintrpc.MintAssetRequest{simpleAssets[0]}, ) genInfo2 := rpcAssets2[0].AssetGenesis @@ -97,7 +97,7 @@ func testZeroValueAnchorSweep(t *harnessTest) { require.GreaterOrEqual(t.t, len(anchorTx.TxIn), 2) ConfirmAndAssertOutboundTransfer( - t.t, t.lndHarness.Miner().Client, t.tapd, sendResp2, + t.t, t.lndHarness.Miner(), t.tapd, sendResp2, genInfo2.AssetId, []uint64{0, assetAmount}, 1, 2, ) @@ -125,7 +125,7 @@ func testZeroValueAnchorSweep(t *harnessTest) { // Test 2: Burning transaction sweeps tombstones. rpcAssets3 := MintAssetsConfirmBatch( - t.t, t.lndHarness.Miner().Client, t.tapd, + t.t, t.lndHarness.Miner(), t.tapd, []*mintrpc.MintAssetRequest{simpleAssets[0]}, ) genInfo3 := rpcAssets3[0].AssetGenesis @@ -142,7 +142,7 @@ func testZeroValueAnchorSweep(t *harnessTest) { require.NoError(t.t, err) AssertAssetOutboundTransferWithOutputs( - t.t, t.lndHarness.Miner().Client, t.tapd, burnResp.BurnTransfer, + t.t, t.lndHarness.Miner(), t.tapd, burnResp.BurnTransfer, [][]byte{genInfo3.AssetId}, []uint64{assetAmount}, 2, 3, 1, true, ) @@ -172,7 +172,7 @@ func testZeroValueAnchorSweep(t *harnessTest) { // Test 3: Send transactions sweeps zero-value burns. rpcAssets4 := MintAssetsConfirmBatch( - t.t, t.lndHarness.Miner().Client, t.tapd, + t.t, t.lndHarness.Miner(), t.tapd, []*mintrpc.MintAssetRequest{simpleAssets[0]}, ) genInfo4 := rpcAssets4[0].AssetGenesis @@ -190,7 +190,7 @@ func testZeroValueAnchorSweep(t *harnessTest) { sendResp3, _ := sendAssetsToAddr(t, t.tapd, bobAddr3) ConfirmAndAssertOutboundTransfer( - t.t, t.lndHarness.Miner().Client, t.tapd, sendResp3, + t.t, t.lndHarness.Miner(), t.tapd, sendResp3, genInfo4.AssetId, []uint64{partialAmount, partialAmount}, 3, 4, ) @@ -218,7 +218,7 @@ func testZeroValueAnchorAccumulation(t *harnessTest) { // First, mint some assets to create zero-value UTXOs with. rpcAssets1 := MintAssetsConfirmBatch( - t.t, t.lndHarness.Miner().Client, t.tapd, + t.t, t.lndHarness.Miner(), t.tapd, []*mintrpc.MintAssetRequest{simpleAssets[0]}, ) genInfo1 := rpcAssets1[0].AssetGenesis @@ -234,7 +234,7 @@ func testZeroValueAnchorAccumulation(t *harnessTest) { sendResp1, _ := sendAssetsToAddr(t, t.tapd, bobAddr1) ConfirmAndAssertOutboundTransfer( - t.t, t.lndHarness.Miner().Client, t.tapd, sendResp1, + t.t, t.lndHarness.Miner(), t.tapd, sendResp1, genInfo1.AssetId, []uint64{0, assetAmount}, 0, 1, ) @@ -248,7 +248,7 @@ func testZeroValueAnchorAccumulation(t *harnessTest) { // Test 2: Create a burn UTXO by burning another asset fully. rpcAssets2 := MintAssetsConfirmBatch( - t.t, t.lndHarness.Miner().Client, t.tapd, + t.t, t.lndHarness.Miner(), t.tapd, []*mintrpc.MintAssetRequest{simpleAssets[0]}, ) genInfo2 := rpcAssets2[0].AssetGenesis @@ -264,7 +264,7 @@ func testZeroValueAnchorAccumulation(t *harnessTest) { require.NoError(t.t, err) AssertAssetOutboundTransferWithOutputs( - t.t, t.lndHarness.Miner().Client, t.tapd, burnResp.BurnTransfer, + t.t, t.lndHarness.Miner(), t.tapd, burnResp.BurnTransfer, [][]byte{genInfo2.AssetId}, []uint64{assetAmount}, 1, 2, 1, true, ) @@ -282,7 +282,7 @@ func testZeroValueAnchorAccumulation(t *harnessTest) { // Test 3: Create another tombstone with a different asset. rpcAssets3 := MintAssetsConfirmBatch( - t.t, t.lndHarness.Miner().Client, t.tapd, + t.t, t.lndHarness.Miner(), t.tapd, []*mintrpc.MintAssetRequest{simpleAssets[0]}, ) genInfo3 := rpcAssets3[0].AssetGenesis @@ -296,7 +296,7 @@ func testZeroValueAnchorAccumulation(t *harnessTest) { sendResp2, _ := sendAssetsToAddr(t, t.tapd, bobAddr2) ConfirmAndAssertOutboundTransfer( - t.t, t.lndHarness.Miner().Client, t.tapd, sendResp2, + t.t, t.lndHarness.Miner(), t.tapd, sendResp2, genInfo3.AssetId, []uint64{0, assetAmount}, 2, 3, ) AssertNonInteractiveRecvComplete(t.t, bobTapd, 2) @@ -360,7 +360,7 @@ func testZeroValueAnchorAccumulation(t *harnessTest) { // Test 4: Mint and send a new asset. This should sweep all accumulated // zero-value UTXOs (2 tombstones + 1 burn). rpcAssets4 := MintAssetsConfirmBatch( - t.t, t.lndHarness.Miner().Client, t.tapd, + t.t, t.lndHarness.Miner(), t.tapd, []*mintrpc.MintAssetRequest{simpleAssets[0]}, ) genInfo4 := rpcAssets4[0].AssetGenesis @@ -381,7 +381,7 @@ func testZeroValueAnchorAccumulation(t *harnessTest) { // The expected number of inputs is: // 1 (new asset) + 3 (swept zero-value). ConfirmAndAssertOutboundTransfer( - t.t, t.lndHarness.Miner().Client, t.tapd, sendResp3, + t.t, t.lndHarness.Miner(), t.tapd, sendResp3, genInfo4.AssetId, []uint64{partialAmount, partialAmount}, 3, 4, ) diff --git a/make/testing_flags.mk b/make/testing_flags.mk index b34a50f982..9cdbd654be 100644 --- a/make/testing_flags.mk +++ b/make/testing_flags.mk @@ -169,5 +169,7 @@ ifeq ($(backend),) backend = btcd endif +ITEST_FLAGS += -minerbackend=$(backend) + # Construct the integration test command with the added build flags. ITEST_TAGS := $(DEV_TAGS) $(RPC_TAGS) integration itest $(backend) diff --git a/proof/courier.go b/proof/courier.go index 28fe2882a9..fee49a09c1 100644 --- a/proof/courier.go +++ b/proof/courier.go @@ -19,6 +19,7 @@ import ( "github.com/lightninglabs/taproot-assets/rpcutils" mboxrpc "github.com/lightninglabs/taproot-assets/taprpc/authmailboxrpc" unirpc "github.com/lightninglabs/taproot-assets/taprpc/universerpc" + "golang.org/x/net/http2" "google.golang.org/grpc" "google.golang.org/grpc/codes" grpcconn "google.golang.org/grpc/connectivity" @@ -314,6 +315,7 @@ func serverDialOpts() ([]grpc.DialOption, error) { // Skip TLS certificate verification. tlsConfig := tls.Config{InsecureSkipVerify: true} + tlsConfig.NextProtos = []string{http2.NextProtoTLS} transportCredentials := credentials.NewTLS(&tlsConfig) opts = append(opts, grpc.WithTransportCredentials(transportCredentials)) diff --git a/proof/proof_test.go b/proof/proof_test.go index 1ef4dc77c0..4db644de56 100644 --- a/proof/proof_test.go +++ b/proof/proof_test.go @@ -213,7 +213,7 @@ func TestProofTaprootOutputScript(t *testing.T) { // Build a minimal block with a single transaction so RandProof can // anchor the proof. - tx := wire.NewMsgTx(2) + tx := wire.NewMsgTx(3) tx.AddTxOut(&wire.TxOut{Value: 1}) block := wire.MsgBlock{ Transactions: []*wire.MsgTx{tx}, diff --git a/proof/verifier_test.go b/proof/verifier_test.go index 51ff2e1772..500ff47502 100644 --- a/proof/verifier_test.go +++ b/proof/verifier_test.go @@ -1,7 +1,11 @@ package proof import ( + "bytes" + "encoding/hex" + "os" "slices" + "strings" "testing" "github.com/btcsuite/btcd/btcec/v2" @@ -1157,3 +1161,53 @@ func TestVerifyV1ExclusionProof(t *testing.T) { }) } } + +// TestTransactionVersionInProofSystem verifies that the current default +// codebase still creates v2 anchor transactions. +func TestTransactionVersionInProofSystem(t *testing.T) { + t.Parallel() + + proofs, _ := makeV0InclusionProof(t) + require.Len(t, proofs, 1) + proof := proofs[0] + + require.Equal(t, int32(2), proof.AnchorTx.Version, + "default anchor transactions should remain v2") +} + +// TestBackwardsCompatibilityWithExistingProofs tests that existing proof files +// (which contain v2 transactions) can still be loaded and verified by the +// current codebase. +func TestBackwardsCompatibilityWithExistingProofs(t *testing.T) { + t.Parallel() + + const fileName = "testdata/proof-file.hex" + + // Load the existing proof file (created pre-v3). + proofHex, err := os.ReadFile(fileName) + require.NoError(t, err, "Failed to load %s", fileName) + + proofBytes, err := hex.DecodeString( + strings.TrimSpace(string(proofHex)), + ) + require.NoError(t, err) + + // Decode the proof file. + var proofFile File + err = proofFile.Decode(bytes.NewReader(proofBytes)) + require.NoError(t, err, "current code must decode existing proofs") + + // Get the last proof from the file. + lastProof, err := proofFile.LastProof() + require.NoError(t, err) + + t.Logf("Proof file %s uses tx version: %d", + fileName, lastProof.AnchorTx.Version) + + require.Equal(t, int32(2), lastProof.AnchorTx.Version) + + _, err = lastProof.verifyExclusionProofs() + require.NoError( + t, err, "current code must verify existing v2 proofs", + ) +} diff --git a/rpcserver/rpcserver.go b/rpcserver/rpcserver.go index 77e688a048..668f798d2a 100644 --- a/rpcserver/rpcserver.go +++ b/rpcserver/rpcserver.go @@ -850,9 +850,15 @@ func (r *RPCServer) FundBatch(ctx context.Context, return nil, err } + txVersion, err := rpcutils.UnmarshalAnchorTxVersion(req.AnchorTxVersion) + if err != nil { + return nil, err + } + fundBatchResp, err := r.cfg.AssetMinter.FundBatch(tapgarden.FundParams{ - FeeRate: feeRateOpt, - SiblingTapTree: tapTreeOpt, + FeeRate: feeRateOpt, + SiblingTapTree: tapTreeOpt, + AnchorTxVersion: txVersion, }) if err != nil { return nil, fmt.Errorf("unable to fund batch: %w", err) @@ -976,10 +982,16 @@ func (r *RPCServer) FinalizeBatch(ctx context.Context, return nil, err } + txVersion, err := rpcutils.UnmarshalAnchorTxVersion(req.AnchorTxVersion) + if err != nil { + return nil, err + } + batch, err := r.cfg.AssetMinter.FinalizeBatch( tapgarden.FinalizeParams{ - FeeRate: feeRateOpt, - SiblingTapTree: tapTreeOpt, + FeeRate: feeRateOpt, + SiblingTapTree: tapTreeOpt, + AnchorTxVersion: txVersion, }, ) if err != nil { @@ -2873,9 +2885,15 @@ func (r *RPCServer) AnchorVirtualPsbts(ctx context.Context, } } + txVersion, err := rpcutils.UnmarshalAnchorTxVersion(req.AnchorTxVersion) + if err != nil { + return nil, err + } + resp, err := r.cfg.ChainPorter.RequestShipment( tapfreighter.NewPreSignedParcel( vPackets, inputCommitments, zeroValueInputs, "", + txVersion, ), ) if err != nil { @@ -3804,9 +3822,15 @@ func (r *RPCServer) SendAsset(ctx context.Context, label = fmt.Sprintf("rpcsendasset-%s", tapAddrs[0].String()) } + txVersion, err := rpcutils.UnmarshalAnchorTxVersion(req.AnchorTxVersion) + if err != nil { + return nil, err + } + resp, err := r.cfg.ChainPorter.RequestShipment( tapfreighter.NewAddressParcel( feeRate, label, req.SkipProofCourierPingCheck, + txVersion, tapAddrs..., ), ) @@ -4004,6 +4028,7 @@ func (r *RPCServer) BurnAsset(ctx context.Context, tapfreighter.NewPreSignedParcel( fundResp.VPackets, fundResp.InputCommitments, fundResp.ZeroValueInputs, in.Note, + tapsend.DefaultAnchorTxVersion, ), ) if err != nil { diff --git a/rpcutils/marshal.go b/rpcutils/marshal.go index e9041fe2f6..b9ef8cf907 100644 --- a/rpcutils/marshal.go +++ b/rpcutils/marshal.go @@ -228,6 +228,24 @@ func MarshalAssetVersion(version asset.Version) (taprpc.AssetVersion, error) { } } +// UnmarshalAnchorTxVersion parses an anchor transaction version from the RPC +// variant, applying the default when unspecified. +func UnmarshalAnchorTxVersion(version taprpc.AnchorTxVersion) (int32, error) { + switch version { + case taprpc.AnchorTxVersion_ANCHOR_TX_VERSION_UNSPECIFIED: + return 2, nil + + case taprpc.AnchorTxVersion_ANCHOR_TX_VERSION_V2: + return 2, nil + + case taprpc.AnchorTxVersion_ANCHOR_TX_VERSION_V3: + return 3, nil + + default: + return 0, fmt.Errorf("unknown anchor tx version: %v", version) + } +} + // MarshalGenesisInfo marshals the native asset genesis into the RPC // counterpart. func MarshalGenesisInfo(gen *asset.Genesis, diff --git a/tapcfg/server.go b/tapcfg/server.go index 8b63eae92c..772f769b05 100644 --- a/tapcfg/server.go +++ b/tapcfg/server.go @@ -29,6 +29,7 @@ import ( "github.com/lightninglabs/taproot-assets/tapfreighter" "github.com/lightninglabs/taproot-assets/tapgarden" "github.com/lightninglabs/taproot-assets/tapscript" + "github.com/lightninglabs/taproot-assets/tapsend" "github.com/lightninglabs/taproot-assets/universe" "github.com/lightninglabs/taproot-assets/universe/supplycommit" "github.com/lightninglabs/taproot-assets/universe/supplyverifier" @@ -643,6 +644,7 @@ func genServerConfig(cfg *Config, cfgLogger btclog.Logger, SupplySyncer: &supplySyncer, DaemonAdapters: lndFsmDaemonAdapters, StateLog: supplyCommitStore, + AnchorTxVersion: tapsend.DefaultAnchorTxVersion, ChainParams: *tapChainParams.Params, IgnoreCheckerCache: ignoreChecker, }, diff --git a/tapdb/addrs_test.go b/tapdb/addrs_test.go index ecbda6d7bc..a920231d9b 100644 --- a/tapdb/addrs_test.go +++ b/tapdb/addrs_test.go @@ -47,7 +47,7 @@ func confirmTx(tx *lndclient.Transaction) { func randWalletTx() *lndclient.Transaction { tx := &lndclient.Transaction{ - Tx: wire.NewMsgTx(2), + Tx: wire.NewMsgTx(3), Timestamp: time.Now(), BlockHeight: rand.Int31n(700_000), BlockHash: test.RandHash().String(), diff --git a/tapdb/asset_minting_test.go b/tapdb/asset_minting_test.go index 54a0211c81..7aecec5211 100644 --- a/tapdb/asset_minting_test.go +++ b/tapdb/asset_minting_test.go @@ -201,7 +201,7 @@ func addRandomManagedUTXO(t *testing.T, ctx context.Context, _, err = rand.Read(blockHash[:]) require.NoError(t, err) - anchorTx := wire.NewMsgTx(2) + anchorTx := wire.NewMsgTx(3) anchorTx.AddTxIn(&wire.TxIn{}) anchorTx.AddTxOut(&wire.TxOut{ PkScript: bytes.Repeat([]byte{0x01}, 34), diff --git a/tapdb/assets_store_test.go b/tapdb/assets_store_test.go index 1051ee22b8..71a6bad415 100644 --- a/tapdb/assets_store_test.go +++ b/tapdb/assets_store_test.go @@ -384,7 +384,7 @@ func TestImportAssetProof(t *testing.T) { // We now add a second proof for the same script key but a different // outpoint and expect that to be stored and retrieved correctly. oldOutpoint := testProof.AssetSnapshot.OutPoint - newChainTx := wire.NewMsgTx(2) + newChainTx := wire.NewMsgTx(3) newChainTx.TxIn = []*wire.TxIn{{ PreviousOutPoint: test.RandOp(t), }} @@ -1745,7 +1745,7 @@ func TestAssetExportLog(t *testing.T) { require.Len(t, utxos, 1) require.Equal(t, assetGen.anchorPoints[0], utxos[0].OutPoint) - newAnchorTx := wire.NewMsgTx(2) + newAnchorTx := wire.NewMsgTx(3) newAnchorTx.AddTxIn(&wire.TxIn{}) newAnchorTx.TxIn[0].SignatureScript = []byte{} newAnchorTx.AddTxOut(&wire.TxOut{ @@ -2545,7 +2545,7 @@ func TestTransferOutputProofDeliveryStatus(t *testing.T) { // of the first transfer output. // // First, we'll generate a new anchor transaction for use in the parcel. - newAnchorTx := wire.NewMsgTx(2) + newAnchorTx := wire.NewMsgTx(3) newAnchorTx.AddTxIn(&wire.TxIn{}) newAnchorTx.TxIn[0].SignatureScript = []byte{} newAnchorTx.AddTxOut(&wire.TxOut{ @@ -2838,7 +2838,7 @@ func TestQueryAssetBurns(t *testing.T) { // of the first transfer output. // // First, we'll generate a new anchor transaction for use in the parcel. - newAnchorTx := wire.NewMsgTx(2) + newAnchorTx := wire.NewMsgTx(3) newAnchorTx.AddTxIn(&wire.TxIn{}) newAnchorTx.TxIn[0].SignatureScript = []byte{} newAnchorTx.AddTxOut(&wire.TxOut{ @@ -3425,7 +3425,7 @@ func createTestProofWithAnchor(t *testing.T, testAsset *asset.Asset, _, err := rand.Read(blockHash[:]) require.NoError(t, err) - anchorTx := wire.NewMsgTx(2) + anchorTx := wire.NewMsgTx(3) anchorTx.AddTxIn(&wire.TxIn{}) // Add enough outputs to cover the requested index diff --git a/tapdb/sqlutils_test.go b/tapdb/sqlutils_test.go index 7df17f8fd2..5fcc326717 100644 --- a/tapdb/sqlutils_test.go +++ b/tapdb/sqlutils_test.go @@ -76,7 +76,7 @@ func (d *DbHandler) AddRandomAssetProof(t *testing.T, _, err = rand.Read(blockHash[:]) require.NoError(t, err) - anchorTx := wire.NewMsgTx(2) + anchorTx := wire.NewMsgTx(3) anchorTx.AddTxIn(&wire.TxIn{}) anchorTx.AddTxOut(&wire.TxOut{ PkScript: bytes.Repeat([]byte{0x01}, 34), diff --git a/tapdb/supply_commit_test.go b/tapdb/supply_commit_test.go index 11bae6264e..fa056dfe18 100644 --- a/tapdb/supply_commit_test.go +++ b/tapdb/supply_commit_test.go @@ -114,7 +114,7 @@ func (h *supplyCommitTestHarness) addTestMintingBatch() ([]byte, int64, genesisPointID, err := upsertGenesisPoint(ctx, db, genesisPoint) require.NoError(h.t, err) - mintingTx := wire.NewMsgTx(2) + mintingTx := wire.NewMsgTx(3) mintingTx.AddTxIn(&wire.TxIn{ PreviousOutPoint: genesisPoint, }) @@ -2238,7 +2238,7 @@ func TestSupplyCommitFetchLatestCommitment(t *testing.T) { func randTx(t *testing.T, numOutputs int) *wire.MsgTx { t.Helper() - tx := wire.NewMsgTx(2) + tx := wire.NewMsgTx(3) tx.AddTxIn(&wire.TxIn{ PreviousOutPoint: test.RandOp(t), }) @@ -2265,7 +2265,7 @@ func TestSupplyCommitMultipleSupplyCommitments(t *testing.T) { // Helper to generate unique transaction data for each commitment genTxData := func() (int64, []byte, []byte) { genesisPoint := test.RandOp(h.t) - tx := wire.NewMsgTx(2) + tx := wire.NewMsgTx(3) tx.AddTxIn(&wire.TxIn{ PreviousOutPoint: genesisPoint, }) @@ -2323,7 +2323,7 @@ func TestSupplySyncerPushLog(t *testing.T) { // TestSupplyCommitMultipleSupplyCommitments. genTxData := func() (int64, []byte, []byte) { genesisPoint := test.RandOp(h.t) - tx := wire.NewMsgTx(2) + tx := wire.NewMsgTx(3) tx.AddTxIn(&wire.TxIn{ PreviousOutPoint: genesisPoint, }) diff --git a/tapdb/universe_test.go b/tapdb/universe_test.go index 01ab97207a..55bc3b33ad 100644 --- a/tapdb/universe_test.go +++ b/tapdb/universe_test.go @@ -1463,7 +1463,7 @@ func TestUpsertSupplyPreCommit(t *testing.T) { // Create test data. groupKey := test.RandPubKey(t) internalKey, _ := test.RandKeyDesc(t) - mintingTx := wire.NewMsgTx(2) + mintingTx := wire.NewMsgTx(3) mintingTx.AddTxOut(&wire.TxOut{Value: 1000}) blockHeight := uint32(100) diff --git a/tapfreighter/chain_porter.go b/tapfreighter/chain_porter.go index c59c5a2e98..d0f77ee4d1 100644 --- a/tapfreighter/chain_porter.go +++ b/tapfreighter/chain_porter.go @@ -1856,6 +1856,7 @@ func (p *ChainPorter) stateStep(currentPkg sendPackage) (*sendPackage, error) { ActivePackets: currentPkg.VirtualPackets, PassivePackets: currentPkg.PassiveAssets, ZeroValueInputs: currentPkg.ZeroValueInputs, + AnchorTxVersion: currentPkg.AnchorTxVersion, }, ) if err != nil { diff --git a/tapfreighter/parcel.go b/tapfreighter/parcel.go index e7d335e241..b0ca5f9e05 100644 --- a/tapfreighter/parcel.go +++ b/tapfreighter/parcel.go @@ -160,6 +160,10 @@ type AddressParcel struct { // label is an optional user provided transfer label. label string + // anchorTxVersion is the version to use for a newly created anchor + // transaction. If unset, the default version is used. + anchorTxVersion int32 + // skipProofCourierPingCheck bool is a flag that indicates whether the // proof courier ping check should be skipped. This is useful for // testing purposes or to force transfer attempts even if the @@ -173,7 +177,7 @@ var _ Parcel = (*AddressParcel)(nil) // NewAddressParcel creates a new AddressParcel. func NewAddressParcel(feeRate *chainfee.SatPerKWeight, label string, - skipProofCourierPingCheck bool, + skipProofCourierPingCheck bool, anchorTxVersion int32, destAddrs ...*address.Tap) *AddressParcel { return &AddressParcel{ @@ -184,6 +188,7 @@ func NewAddressParcel(feeRate *chainfee.SatPerKWeight, label string, destAddrs: destAddrs, transferFeeRate: feeRate, label: label, + anchorTxVersion: anchorTxVersion, skipProofCourierPingCheck: skipProofCourierPingCheck, } } @@ -200,6 +205,7 @@ func (p *AddressParcel) pkg() *sendPackage { return &sendPackage{ Parcel: p, Label: p.label, + AnchorTxVersion: p.anchorTxVersion, SkipProofCourierPingCheck: p.skipProofCourierPingCheck, } } @@ -318,6 +324,10 @@ type PreSignedParcel struct { // note is a string that provides any user defined description for this // transfer. note string + + // anchorTxVersion is the version to use for a newly created anchor + // transaction. If unset, the default version is used. + anchorTxVersion int32 } // A compile-time assertion to ensure PreSignedParcel implements the parcel @@ -327,7 +337,8 @@ var _ Parcel = (*PreSignedParcel)(nil) // NewPreSignedParcel creates a new PreSignedParcel. func NewPreSignedParcel(vPackets []*tappsbt.VPacket, inputCommitments tappsbt.InputCommitments, - zeroValueInputs []*ZeroValueInput, note string) *PreSignedParcel { + zeroValueInputs []*ZeroValueInput, note string, + anchorTxVersion int32) *PreSignedParcel { return &PreSignedParcel{ parcelKit: &parcelKit{ @@ -338,6 +349,7 @@ func NewPreSignedParcel(vPackets []*tappsbt.VPacket, inputCommitments: inputCommitments, zeroValueInputs: zeroValueInputs, note: note, + anchorTxVersion: anchorTxVersion, } } @@ -355,6 +367,7 @@ func (p *PreSignedParcel) pkg() *sendPackage { InputCommitments: p.inputCommitments, ZeroValueInputs: p.zeroValueInputs, Note: p.note, + AnchorTxVersion: p.anchorTxVersion, } } @@ -575,6 +588,10 @@ type sendPackage struct { // Label is a user provided short label for this transfer. Label string + // AnchorTxVersion is the version to use for a newly created anchor + // transaction. If unset, the default version is used. + AnchorTxVersion int32 + // Note is a user provided description for this transfer. This is // currently only used by asset burn transfers. Note string diff --git a/tapfreighter/wallet.go b/tapfreighter/wallet.go index 0fc7f7192a..6c486c8770 100644 --- a/tapfreighter/wallet.go +++ b/tapfreighter/wallet.go @@ -176,6 +176,11 @@ type AnchorVTxnsParams struct { // ZeroValueInputs is a list of zero-value UTXOs that should be swept // as additional inputs to the transaction. ZeroValueInputs []*ZeroValueInput + + // AnchorTxVersion is the version to use when creating a new BTC anchor + // transaction template. If unset, the default anchor transaction + // version is used. + AnchorTxVersion int32 } // WalletConfig holds the configuration for a new Wallet. @@ -1220,7 +1225,9 @@ func (f *AssetWallet) AnchorVirtualTransactions(ctx context.Context, // Construct our template PSBT to commits to the set of dummy locators // we use to make fee estimation work. - sendPacket, err := tapsend.CreateAnchorTx(allPackets) + sendPacket, err := tapsend.CreateAnchorTx( + allPackets, tapsend.WithAnchorTxVersion(params.AnchorTxVersion), + ) if err != nil { return nil, fmt.Errorf("error creating anchor TX: %w", err) } diff --git a/tapgarden/caretaker.go b/tapgarden/caretaker.go index 512af2245c..7763e40a08 100644 --- a/tapgarden/caretaker.go +++ b/tapgarden/caretaker.go @@ -1550,7 +1550,7 @@ func (b *BatchCaretaker) sendSupplyCommitEvents(ctx context.Context, // Finally we send all of the above to the supply commiter. err = b.cfg.MintSupplyCommitter.SendMintEvent( ctx, assetSpec, uniqueLeafKey, universeLeaf, - leafProof.BlockHeight, + leafProof.BlockHeight, leafProof.AnchorTx.Version, ) if err != nil { return fmt.Errorf("unable to send mint event for "+ diff --git a/tapgarden/custodian_test.go b/tapgarden/custodian_test.go index 47c6f8f9a8..c4a53fcc74 100644 --- a/tapgarden/custodian_test.go +++ b/tapgarden/custodian_test.go @@ -451,7 +451,7 @@ func randAddrV2(h *custodianHarness, proofCourier url.URL, func randWalletTx(addr *address.AddrWithKeyInfo) (int, *lndclient.Transaction) { tx := &lndclient.Transaction{ - Tx: wire.NewMsgTx(2), + Tx: wire.NewMsgTx(3), Timestamp: time.Now(), } numInputs := rand.Intn(10) + 1 diff --git a/tapgarden/mock.go b/tapgarden/mock.go index f651b5b45f..809491eced 100644 --- a/tapgarden/mock.go +++ b/tapgarden/mock.go @@ -291,7 +291,8 @@ func RandMintingBatch(t testing.TB, opts ...MintBatchOption) *MintingBatch { // Fund genesis packet. ctx := context.Background() fundedPsbt, err := fundGenesisPsbt( - ctx, address.TestNet3Tap, batch, walletFundPsbt, + ctx, address.TestNet3Tap, batch, + tapsend.DefaultAnchorTxVersion, walletFundPsbt, ) require.NoError(t, err) batch.GenesisPacket = &fundedPsbt @@ -350,7 +351,7 @@ func NewMockWalletAnchor() *MockWalletAnchor { // NewGenesisTx creates a funded genesis PSBT with the given fee rate. func NewGenesisTx(t testing.TB, feeRate chainfee.SatPerKWeight) psbt.Packet { - txTemplate := wire.NewMsgTx(2) + txTemplate := wire.NewMsgTx(3) txTemplate.AddTxOut(tapsend.CreateDummyOutput()) genesisPkt, err := psbt.NewFromUnsignedTx(txTemplate) require.NoError(t, err) diff --git a/tapgarden/planter.go b/tapgarden/planter.go index b465f1d9e4..89b8c10759 100644 --- a/tapgarden/planter.go +++ b/tapgarden/planter.go @@ -38,7 +38,7 @@ type MintSupplyCommitter interface { // machine. SendMintEvent(ctx context.Context, assetSpec asset.Specifier, leafKey universe.UniqueLeafKey, issuanceProof universe.Leaf, - mintBlockHeight uint32) error + mintBlockHeight uint32, anchorTxVersion int32) error } // GardenKit holds the set of shared fundamental interfaces all sub-systems of @@ -311,15 +311,17 @@ type UnsealedSeedling struct { // FinalizeParams are the options available to change how a batch is finalized, // and how the genesis TX is constructed. type FinalizeParams struct { - FeeRate fn.Option[chainfee.SatPerKWeight] - SiblingTapTree fn.Option[asset.TapscriptTreeNodes] + FeeRate fn.Option[chainfee.SatPerKWeight] + SiblingTapTree fn.Option[asset.TapscriptTreeNodes] + AnchorTxVersion int32 } // FundParams are the options available to change how a batch is funded, and how // the genesis TX is constructed. type FundParams struct { - FeeRate fn.Option[chainfee.SatPerKWeight] - SiblingTapTree fn.Option[asset.TapscriptTreeNodes] + FeeRate fn.Option[chainfee.SatPerKWeight] + SiblingTapTree fn.Option[asset.TapscriptTreeNodes] + AnchorTxVersion int32 } // PendingGroupWitness specifies the asset group witness for an asset seedling @@ -703,13 +705,18 @@ func (c *ChainPlanter) newBatch() (*MintingBatch, error) { // unfundedAnchorPsbt creates an unfunded PSBT packet for the minting anchor // transaction. -func unfundedAnchorPsbt(preCommitmentTxOut fn.Option[wire.TxOut]) (psbt.Packet, - error) { +func unfundedAnchorPsbt(preCommitmentTxOut fn.Option[wire.TxOut], + txVersion int32) (psbt.Packet, error) { var zero psbt.Packet + resolvedTxVersion, err := tapsend.ResolveAnchorTxVersion(txVersion) + if err != nil { + return zero, err + } + // Construct a template transaction for our minting anchor transaction. - txTemplate := wire.NewMsgTx(2) + txTemplate := wire.NewMsgTx(resolvedTxVersion) // Add one output to anchor all assets which are being minted. txTemplate.AddTxOut(tapsend.CreateDummyOutput()) @@ -1006,7 +1013,7 @@ type WalletFundPsbt = func(ctx context.Context, // We need to use a dummy script as we can't know the actual script key since // that's dependent on the genesis outpoint. func fundGenesisPsbt(ctx context.Context, chainParams address.ChainParams, - pendingBatch *MintingBatch, + pendingBatch *MintingBatch, txVersion int32, walletFundPsbt WalletFundPsbt) (FundedMintAnchorPsbt, error) { var zero FundedMintAnchorPsbt @@ -1045,7 +1052,7 @@ func fundGenesisPsbt(ctx context.Context, chainParams address.ChainParams, // Construct an unfunded anchor PSBT which will eventually become a // funded minting anchor transaction. - genesisPkt, err := unfundedAnchorPsbt(preCommitmentTxOut) + genesisPkt, err := unfundedAnchorPsbt(preCommitmentTxOut, txVersion) if err != nil { return zero, fmt.Errorf("unable to create anchor template tx: "+ "%w", err) @@ -2199,6 +2206,7 @@ func (c *ChainPlanter) fundBatch(ctx context.Context, params FundParams, log.Infof("Attempting to fund batch: %x", batchKey) mintAnchorTx, err := fundGenesisPsbt( ctx, c.cfg.ChainParams, c.pendingBatch, + params.AnchorTxVersion, walletFundPsbt, ) if err != nil { diff --git a/tapgarden/re-org_watcher_test.go b/tapgarden/re-org_watcher_test.go index 29150acbd7..189d1aeae7 100644 --- a/tapgarden/re-org_watcher_test.go +++ b/tapgarden/re-org_watcher_test.go @@ -69,7 +69,7 @@ func newReOrgWatcherHarness(t *testing.T) *reOrgWatcherHarness { } func makeTx() *wire.MsgTx { - anchorTx := wire.NewMsgTx(2) + anchorTx := wire.NewMsgTx(3) anchorTx.TxOut = []*wire.TxOut{{ PkScript: test.RandBytes(32), Value: 100, diff --git a/tapgarden/supply_commit_test.go b/tapgarden/supply_commit_test.go index 893bbbebe4..65bb73f0a9 100644 --- a/tapgarden/supply_commit_test.go +++ b/tapgarden/supply_commit_test.go @@ -44,10 +44,12 @@ func (m *MockSupplyCommitManager) SendEvent(ctx context.Context, // SendMintEvent implements the SupplyCommitManager interface. func (m *MockSupplyCommitManager) SendMintEvent(ctx context.Context, assetSpec asset.Specifier, leafKey universe.UniqueLeafKey, - issuanceProof universe.Leaf, mintBlockHeight uint32) error { + issuanceProof universe.Leaf, mintBlockHeight uint32, + anchorTxVersion int32) error { args := m.Called( ctx, assetSpec, leafKey, issuanceProof, mintBlockHeight, + anchorTxVersion, ) return args.Error(0) } @@ -135,7 +137,8 @@ func TestSupplyCommitDelegationKeyFiltering(t *testing.T) { "universe.AssetLeafKey", ), mock.AnythingOfType("universe.Leaf"), - mock.AnythingOfType("uint32")). + mock.AnythingOfType("uint32"), + mock.AnythingOfType("int32")). Return(nil). Times(tc.expectedCallCount) } diff --git a/taprpc/assetwalletrpc/assetwallet.pb.go b/taprpc/assetwalletrpc/assetwallet.pb.go index 1dbfb02c75..4bb735acb5 100644 --- a/taprpc/assetwalletrpc/assetwallet.pb.go +++ b/taprpc/assetwalletrpc/assetwallet.pb.go @@ -564,6 +564,8 @@ type AnchorVirtualPsbtsRequest struct { // The list of virtual transactions that should be merged and committed to in // the BTC level anchor transaction. VirtualPsbts [][]byte `protobuf:"bytes,1,rep,name=virtual_psbts,json=virtualPsbts,proto3" json:"virtual_psbts,omitempty"` + // The version to use when creating a new BTC anchor transaction. + AnchorTxVersion taprpc.AnchorTxVersion `protobuf:"varint,2,opt,name=anchor_tx_version,json=anchorTxVersion,proto3,enum=taprpc.AnchorTxVersion" json:"anchor_tx_version,omitempty"` } func (x *AnchorVirtualPsbtsRequest) Reset() { @@ -605,6 +607,13 @@ func (x *AnchorVirtualPsbtsRequest) GetVirtualPsbts() [][]byte { return nil } +func (x *AnchorVirtualPsbtsRequest) GetAnchorTxVersion() taprpc.AnchorTxVersion { + if x != nil { + return x.AnchorTxVersion + } + return taprpc.AnchorTxVersion(0) +} + type CommitVirtualPsbtsRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -2133,295 +2142,299 @@ var file_assetwalletrpc_assetwallet_proto_rawDesc = []byte{ 0x73, 0x62, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0a, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x50, 0x73, 0x62, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x5f, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x0c, 0x73, 0x69, - 0x67, 0x6e, 0x65, 0x64, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x22, 0x40, 0x0a, 0x19, 0x41, 0x6e, - 0x63, 0x68, 0x6f, 0x72, 0x56, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x50, 0x73, 0x62, 0x74, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x76, 0x69, 0x72, 0x74, 0x75, - 0x61, 0x6c, 0x5f, 0x70, 0x73, 0x62, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x0c, - 0x76, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x50, 0x73, 0x62, 0x74, 0x73, 0x22, 0xc5, 0x03, 0x0a, - 0x19, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x56, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x50, 0x73, - 0x62, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x76, 0x69, - 0x72, 0x74, 0x75, 0x61, 0x6c, 0x5f, 0x70, 0x73, 0x62, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x67, 0x6e, 0x65, 0x64, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x22, 0x85, 0x01, 0x0a, 0x19, 0x41, + 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x56, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x50, 0x73, 0x62, 0x74, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x76, 0x69, 0x72, 0x74, + 0x75, 0x61, 0x6c, 0x5f, 0x70, 0x73, 0x62, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0c, 0x52, + 0x0c, 0x76, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x50, 0x73, 0x62, 0x74, 0x73, 0x12, 0x43, 0x0a, + 0x11, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x5f, 0x74, 0x78, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, + 0x63, 0x2e, 0x41, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x54, 0x78, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x52, 0x0f, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x54, 0x78, 0x56, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x22, 0xc5, 0x03, 0x0a, 0x19, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x56, 0x69, 0x72, + 0x74, 0x75, 0x61, 0x6c, 0x50, 0x73, 0x62, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x23, 0x0a, 0x0d, 0x76, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x5f, 0x70, 0x73, 0x62, 0x74, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x0c, 0x76, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, + 0x50, 0x73, 0x62, 0x74, 0x73, 0x12, 0x2e, 0x0a, 0x13, 0x70, 0x61, 0x73, 0x73, 0x69, 0x76, 0x65, + 0x5f, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x70, 0x73, 0x62, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, + 0x28, 0x0c, 0x52, 0x11, 0x70, 0x61, 0x73, 0x73, 0x69, 0x76, 0x65, 0x41, 0x73, 0x73, 0x65, 0x74, + 0x50, 0x73, 0x62, 0x74, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x5f, + 0x70, 0x73, 0x62, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0a, 0x61, 0x6e, 0x63, 0x68, + 0x6f, 0x72, 0x50, 0x73, 0x62, 0x74, 0x12, 0x34, 0x0a, 0x15, 0x65, 0x78, 0x69, 0x73, 0x74, 0x69, + 0x6e, 0x67, 0x5f, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x05, 0x48, 0x00, 0x52, 0x13, 0x65, 0x78, 0x69, 0x73, 0x74, 0x69, 0x6e, + 0x67, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x12, 0x0a, 0x03, + 0x61, 0x64, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x03, 0x61, 0x64, 0x64, + 0x12, 0x21, 0x0a, 0x0b, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x0d, 0x48, 0x01, 0x52, 0x0a, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x43, + 0x6f, 0x6e, 0x66, 0x12, 0x24, 0x0a, 0x0d, 0x73, 0x61, 0x74, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x76, + 0x62, 0x79, 0x74, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x04, 0x48, 0x01, 0x52, 0x0b, 0x73, 0x61, + 0x74, 0x50, 0x65, 0x72, 0x56, 0x62, 0x79, 0x74, 0x65, 0x12, 0x24, 0x0a, 0x0e, 0x63, 0x75, 0x73, + 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x69, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, + 0x0c, 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x6f, 0x63, 0x6b, 0x49, 0x64, 0x12, + 0x36, 0x0a, 0x17, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x65, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x04, + 0x52, 0x15, 0x6c, 0x6f, 0x63, 0x6b, 0x45, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x6b, 0x69, 0x70, 0x5f, + 0x66, 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x73, + 0x6b, 0x69, 0x70, 0x46, 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x42, 0x16, 0x0a, 0x14, 0x61, 0x6e, + 0x63, 0x68, 0x6f, 0x72, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x6f, 0x75, 0x74, 0x70, + 0x75, 0x74, 0x42, 0x06, 0x0a, 0x04, 0x66, 0x65, 0x65, 0x73, 0x22, 0xfe, 0x01, 0x0a, 0x1a, 0x43, + 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x56, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x50, 0x73, 0x62, 0x74, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x6e, 0x63, + 0x68, 0x6f, 0x72, 0x5f, 0x70, 0x73, 0x62, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0a, + 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x50, 0x73, 0x62, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x76, 0x69, + 0x72, 0x74, 0x75, 0x61, 0x6c, 0x5f, 0x70, 0x73, 0x62, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x0c, 0x76, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x50, 0x73, 0x62, 0x74, 0x73, 0x12, 0x2e, 0x0a, 0x13, 0x70, 0x61, 0x73, 0x73, 0x69, 0x76, 0x65, 0x5f, 0x61, 0x73, 0x73, 0x65, 0x74, - 0x5f, 0x70, 0x73, 0x62, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x11, 0x70, 0x61, + 0x5f, 0x70, 0x73, 0x62, 0x74, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x11, 0x70, 0x61, 0x73, 0x73, 0x69, 0x76, 0x65, 0x41, 0x73, 0x73, 0x65, 0x74, 0x50, 0x73, 0x62, 0x74, 0x73, 0x12, - 0x1f, 0x0a, 0x0b, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x5f, 0x70, 0x73, 0x62, 0x74, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0a, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x50, 0x73, 0x62, 0x74, - 0x12, 0x34, 0x0a, 0x15, 0x65, 0x78, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x6f, 0x75, 0x74, - 0x70, 0x75, 0x74, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x48, - 0x00, 0x52, 0x13, 0x65, 0x78, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x4f, 0x75, 0x74, 0x70, 0x75, - 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x12, 0x0a, 0x03, 0x61, 0x64, 0x64, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x03, 0x61, 0x64, 0x64, 0x12, 0x21, 0x0a, 0x0b, 0x74, 0x61, - 0x72, 0x67, 0x65, 0x74, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x48, - 0x01, 0x52, 0x0a, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x12, 0x24, 0x0a, - 0x0d, 0x73, 0x61, 0x74, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x76, 0x62, 0x79, 0x74, 0x65, 0x18, 0x07, - 0x20, 0x01, 0x28, 0x04, 0x48, 0x01, 0x52, 0x0b, 0x73, 0x61, 0x74, 0x50, 0x65, 0x72, 0x56, 0x62, - 0x79, 0x74, 0x65, 0x12, 0x24, 0x0a, 0x0e, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x6f, - 0x63, 0x6b, 0x5f, 0x69, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0c, 0x63, 0x75, 0x73, - 0x74, 0x6f, 0x6d, 0x4c, 0x6f, 0x63, 0x6b, 0x49, 0x64, 0x12, 0x36, 0x0a, 0x17, 0x6c, 0x6f, 0x63, - 0x6b, 0x5f, 0x65, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x63, - 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x04, 0x52, 0x15, 0x6c, 0x6f, 0x63, 0x6b, - 0x45, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, - 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x66, 0x75, 0x6e, 0x64, 0x69, 0x6e, - 0x67, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x73, 0x6b, 0x69, 0x70, 0x46, 0x75, 0x6e, - 0x64, 0x69, 0x6e, 0x67, 0x42, 0x16, 0x0a, 0x14, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x5f, 0x63, - 0x68, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x42, 0x06, 0x0a, 0x04, - 0x66, 0x65, 0x65, 0x73, 0x22, 0xfe, 0x01, 0x0a, 0x1a, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x56, - 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x50, 0x73, 0x62, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x5f, 0x70, 0x73, - 0x62, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0a, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, - 0x50, 0x73, 0x62, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x76, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x5f, - 0x70, 0x73, 0x62, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x0c, 0x76, 0x69, 0x72, - 0x74, 0x75, 0x61, 0x6c, 0x50, 0x73, 0x62, 0x74, 0x73, 0x12, 0x2e, 0x0a, 0x13, 0x70, 0x61, 0x73, - 0x73, 0x69, 0x76, 0x65, 0x5f, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x70, 0x73, 0x62, 0x74, 0x73, - 0x18, 0x04, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x11, 0x70, 0x61, 0x73, 0x73, 0x69, 0x76, 0x65, 0x41, - 0x73, 0x73, 0x65, 0x74, 0x50, 0x73, 0x62, 0x74, 0x73, 0x12, 0x2e, 0x0a, 0x13, 0x63, 0x68, 0x61, - 0x6e, 0x67, 0x65, 0x5f, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x11, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x4f, 0x75, - 0x74, 0x70, 0x75, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x3a, 0x0a, 0x10, 0x6c, 0x6e, 0x64, - 0x5f, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x5f, 0x75, 0x74, 0x78, 0x6f, 0x73, 0x18, 0x06, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4f, 0x75, 0x74, - 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x0e, 0x6c, 0x6e, 0x64, 0x4c, 0x6f, 0x63, 0x6b, 0x65, 0x64, - 0x55, 0x74, 0x78, 0x6f, 0x73, 0x22, 0xc7, 0x02, 0x0a, 0x14, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, - 0x68, 0x41, 0x6e, 0x64, 0x4c, 0x6f, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, - 0x0a, 0x0b, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x5f, 0x70, 0x73, 0x62, 0x74, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0c, 0x52, 0x0a, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x50, 0x73, 0x62, 0x74, 0x12, - 0x23, 0x0a, 0x0d, 0x76, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x5f, 0x70, 0x73, 0x62, 0x74, 0x73, - 0x18, 0x02, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x0c, 0x76, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x50, - 0x73, 0x62, 0x74, 0x73, 0x12, 0x2e, 0x0a, 0x13, 0x70, 0x61, 0x73, 0x73, 0x69, 0x76, 0x65, 0x5f, - 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x70, 0x73, 0x62, 0x74, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, - 0x0c, 0x52, 0x11, 0x70, 0x61, 0x73, 0x73, 0x69, 0x76, 0x65, 0x41, 0x73, 0x73, 0x65, 0x74, 0x50, - 0x73, 0x62, 0x74, 0x73, 0x12, 0x2e, 0x0a, 0x13, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x6f, - 0x75, 0x74, 0x70, 0x75, 0x74, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x11, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x49, - 0x6e, 0x64, 0x65, 0x78, 0x12, 0x3a, 0x0a, 0x10, 0x6c, 0x6e, 0x64, 0x5f, 0x6c, 0x6f, 0x63, 0x6b, - 0x65, 0x64, 0x5f, 0x75, 0x74, 0x78, 0x6f, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, - 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4f, 0x75, 0x74, 0x50, 0x6f, 0x69, 0x6e, 0x74, - 0x52, 0x0e, 0x6c, 0x6e, 0x64, 0x4c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x55, 0x74, 0x78, 0x6f, 0x73, - 0x12, 0x37, 0x0a, 0x18, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x5f, - 0x74, 0x78, 0x5f, 0x62, 0x72, 0x6f, 0x61, 0x64, 0x63, 0x61, 0x73, 0x74, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x15, 0x73, 0x6b, 0x69, 0x70, 0x41, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x54, 0x78, - 0x42, 0x72, 0x6f, 0x61, 0x64, 0x63, 0x61, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x61, 0x62, - 0x65, 0x6c, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x22, - 0x37, 0x0a, 0x16, 0x4e, 0x65, 0x78, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x4b, - 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x6b, 0x65, 0x79, - 0x5f, 0x66, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x6b, - 0x65, 0x79, 0x46, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x22, 0x53, 0x0a, 0x17, 0x4e, 0x65, 0x78, 0x74, - 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x38, 0x0a, 0x0c, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, - 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x61, 0x70, 0x72, - 0x70, 0x63, 0x2e, 0x4b, 0x65, 0x79, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, - 0x52, 0x0b, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x4b, 0x65, 0x79, 0x22, 0x35, 0x0a, - 0x14, 0x4e, 0x65, 0x78, 0x74, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x4b, 0x65, 0x79, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x6b, 0x65, 0x79, 0x5f, 0x66, 0x61, 0x6d, - 0x69, 0x6c, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x6b, 0x65, 0x79, 0x46, 0x61, - 0x6d, 0x69, 0x6c, 0x79, 0x22, 0x49, 0x0a, 0x15, 0x4e, 0x65, 0x78, 0x74, 0x53, 0x63, 0x72, 0x69, - 0x70, 0x74, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x30, 0x0a, - 0x0a, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x11, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x63, 0x72, 0x69, 0x70, - 0x74, 0x4b, 0x65, 0x79, 0x52, 0x09, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x4b, 0x65, 0x79, 0x22, - 0x3c, 0x0a, 0x17, 0x51, 0x75, 0x65, 0x72, 0x79, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, - 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x69, 0x6e, - 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, - 0x52, 0x0b, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x4b, 0x65, 0x79, 0x22, 0x54, 0x0a, - 0x18, 0x51, 0x75, 0x65, 0x72, 0x79, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x4b, 0x65, + 0x2e, 0x0a, 0x13, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, + 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x11, 0x63, 0x68, + 0x61, 0x6e, 0x67, 0x65, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, + 0x3a, 0x0a, 0x10, 0x6c, 0x6e, 0x64, 0x5f, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x5f, 0x75, 0x74, + 0x78, 0x6f, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x74, 0x61, 0x70, 0x72, + 0x70, 0x63, 0x2e, 0x4f, 0x75, 0x74, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x0e, 0x6c, 0x6e, 0x64, + 0x4c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x55, 0x74, 0x78, 0x6f, 0x73, 0x22, 0xc7, 0x02, 0x0a, 0x14, + 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x41, 0x6e, 0x64, 0x4c, 0x6f, 0x67, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x5f, 0x70, + 0x73, 0x62, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0a, 0x61, 0x6e, 0x63, 0x68, 0x6f, + 0x72, 0x50, 0x73, 0x62, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x76, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, + 0x5f, 0x70, 0x73, 0x62, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x0c, 0x76, 0x69, + 0x72, 0x74, 0x75, 0x61, 0x6c, 0x50, 0x73, 0x62, 0x74, 0x73, 0x12, 0x2e, 0x0a, 0x13, 0x70, 0x61, + 0x73, 0x73, 0x69, 0x76, 0x65, 0x5f, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x70, 0x73, 0x62, 0x74, + 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x11, 0x70, 0x61, 0x73, 0x73, 0x69, 0x76, 0x65, + 0x41, 0x73, 0x73, 0x65, 0x74, 0x50, 0x73, 0x62, 0x74, 0x73, 0x12, 0x2e, 0x0a, 0x13, 0x63, 0x68, + 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x5f, 0x69, 0x6e, 0x64, 0x65, + 0x78, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x11, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x4f, + 0x75, 0x74, 0x70, 0x75, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x3a, 0x0a, 0x10, 0x6c, 0x6e, + 0x64, 0x5f, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x5f, 0x75, 0x74, 0x78, 0x6f, 0x73, 0x18, 0x05, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4f, 0x75, + 0x74, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x0e, 0x6c, 0x6e, 0x64, 0x4c, 0x6f, 0x63, 0x6b, 0x65, + 0x64, 0x55, 0x74, 0x78, 0x6f, 0x73, 0x12, 0x37, 0x0a, 0x18, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x61, + 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x5f, 0x74, 0x78, 0x5f, 0x62, 0x72, 0x6f, 0x61, 0x64, 0x63, 0x61, + 0x73, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x15, 0x73, 0x6b, 0x69, 0x70, 0x41, 0x6e, + 0x63, 0x68, 0x6f, 0x72, 0x54, 0x78, 0x42, 0x72, 0x6f, 0x61, 0x64, 0x63, 0x61, 0x73, 0x74, 0x12, + 0x14, 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x22, 0x37, 0x0a, 0x16, 0x4e, 0x65, 0x78, 0x74, 0x49, 0x6e, 0x74, + 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x1d, 0x0a, 0x0a, 0x6b, 0x65, 0x79, 0x5f, 0x66, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x09, 0x6b, 0x65, 0x79, 0x46, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x22, 0x53, + 0x0a, 0x17, 0x4e, 0x65, 0x78, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x38, 0x0a, 0x0c, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4b, 0x65, 0x79, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x52, 0x0b, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, - 0x4b, 0x65, 0x79, 0x22, 0x45, 0x0a, 0x15, 0x51, 0x75, 0x65, 0x72, 0x79, 0x53, 0x63, 0x72, 0x69, - 0x70, 0x74, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2c, 0x0a, 0x12, - 0x74, 0x77, 0x65, 0x61, 0x6b, 0x65, 0x64, 0x5f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x5f, 0x6b, - 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x10, 0x74, 0x77, 0x65, 0x61, 0x6b, 0x65, - 0x64, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x4b, 0x65, 0x79, 0x22, 0x4a, 0x0a, 0x16, 0x51, 0x75, - 0x65, 0x72, 0x79, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x30, 0x0a, 0x0a, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x5f, 0x6b, - 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, - 0x63, 0x2e, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x4b, 0x65, 0x79, 0x52, 0x09, 0x73, 0x63, 0x72, - 0x69, 0x70, 0x74, 0x4b, 0x65, 0x79, 0x22, 0xa2, 0x01, 0x0a, 0x1a, 0x50, 0x72, 0x6f, 0x76, 0x65, - 0x41, 0x73, 0x73, 0x65, 0x74, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x61, 0x73, 0x73, 0x65, 0x74, 0x49, 0x64, - 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x4b, 0x65, 0x79, 0x12, - 0x2c, 0x0a, 0x08, 0x6f, 0x75, 0x74, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x10, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4f, 0x75, 0x74, 0x50, 0x6f, - 0x69, 0x6e, 0x74, 0x52, 0x08, 0x6f, 0x75, 0x74, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x1c, 0x0a, - 0x09, 0x63, 0x68, 0x61, 0x6c, 0x6c, 0x65, 0x6e, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, - 0x52, 0x09, 0x63, 0x68, 0x61, 0x6c, 0x6c, 0x65, 0x6e, 0x67, 0x65, 0x22, 0x4b, 0x0a, 0x1b, 0x50, - 0x72, 0x6f, 0x76, 0x65, 0x41, 0x73, 0x73, 0x65, 0x74, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x73, 0x68, - 0x69, 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2c, 0x0a, 0x12, 0x70, 0x72, - 0x6f, 0x6f, 0x66, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x77, 0x69, 0x74, 0x6e, 0x65, 0x73, 0x73, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x10, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x57, 0x69, 0x74, - 0x68, 0x57, 0x69, 0x74, 0x6e, 0x65, 0x73, 0x73, 0x22, 0x69, 0x0a, 0x1b, 0x56, 0x65, 0x72, 0x69, - 0x66, 0x79, 0x41, 0x73, 0x73, 0x65, 0x74, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2c, 0x0a, 0x12, 0x70, 0x72, 0x6f, 0x6f, 0x66, - 0x5f, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x77, 0x69, 0x74, 0x6e, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0c, 0x52, 0x10, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x57, 0x69, 0x74, 0x68, 0x57, 0x69, - 0x74, 0x6e, 0x65, 0x73, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x68, 0x61, 0x6c, 0x6c, 0x65, 0x6e, - 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x63, 0x68, 0x61, 0x6c, 0x6c, 0x65, - 0x6e, 0x67, 0x65, 0x22, 0xf8, 0x01, 0x0a, 0x1c, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x41, 0x73, - 0x73, 0x65, 0x74, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x5f, 0x70, 0x72, - 0x6f, 0x6f, 0x66, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x76, 0x61, 0x6c, 0x69, 0x64, - 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x2c, 0x0a, 0x08, 0x6f, 0x75, 0x74, 0x70, 0x6f, 0x69, 0x6e, - 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, - 0x2e, 0x4f, 0x75, 0x74, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x08, 0x6f, 0x75, 0x74, 0x70, 0x6f, - 0x69, 0x6e, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x6f, 0x75, 0x74, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x5f, - 0x73, 0x74, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6f, 0x75, 0x74, 0x70, 0x6f, - 0x69, 0x6e, 0x74, 0x53, 0x74, 0x72, 0x12, 0x1d, 0x0a, 0x0a, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, - 0x68, 0x61, 0x73, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x62, 0x6c, 0x6f, 0x63, - 0x6b, 0x48, 0x61, 0x73, 0x68, 0x12, 0x24, 0x0a, 0x0e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x68, - 0x61, 0x73, 0x68, 0x5f, 0x73, 0x74, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x62, - 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x61, 0x73, 0x68, 0x53, 0x74, 0x72, 0x12, 0x21, 0x0a, 0x0c, 0x62, - 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x0d, 0x52, 0x0b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x22, 0x46, - 0x0a, 0x16, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x55, 0x54, 0x58, 0x4f, 0x4c, 0x65, 0x61, 0x73, - 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2c, 0x0a, 0x08, 0x6f, 0x75, 0x74, 0x70, - 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x74, 0x61, 0x70, - 0x72, 0x70, 0x63, 0x2e, 0x4f, 0x75, 0x74, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x08, 0x6f, 0x75, - 0x74, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x22, 0x19, 0x0a, 0x17, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, - 0x55, 0x54, 0x58, 0x4f, 0x4c, 0x65, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x4b, 0x0a, 0x17, 0x44, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x65, 0x53, 0x63, 0x72, 0x69, - 0x70, 0x74, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x30, 0x0a, 0x0a, - 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x11, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, - 0x4b, 0x65, 0x79, 0x52, 0x09, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x4b, 0x65, 0x79, 0x22, 0x4c, - 0x0a, 0x18, 0x44, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x65, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x4b, + 0x4b, 0x65, 0x79, 0x22, 0x35, 0x0a, 0x14, 0x4e, 0x65, 0x78, 0x74, 0x53, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x6b, + 0x65, 0x79, 0x5f, 0x66, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x09, 0x6b, 0x65, 0x79, 0x46, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x22, 0x49, 0x0a, 0x15, 0x4e, 0x65, + 0x78, 0x74, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x30, 0x0a, 0x0a, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x5f, 0x6b, 0x65, + 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, + 0x2e, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x4b, 0x65, 0x79, 0x52, 0x09, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x4b, 0x65, 0x79, 0x22, 0x3c, 0x0a, 0x17, 0x51, 0x75, 0x65, 0x72, 0x79, 0x49, 0x6e, + 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x21, 0x0a, 0x0c, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x6b, 0x65, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0b, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, + 0x4b, 0x65, 0x79, 0x22, 0x54, 0x0a, 0x18, 0x51, 0x75, 0x65, 0x72, 0x79, 0x49, 0x6e, 0x74, 0x65, + 0x72, 0x6e, 0x61, 0x6c, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x38, 0x0a, 0x0c, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x6b, 0x65, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4b, + 0x65, 0x79, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x52, 0x0b, 0x69, 0x6e, + 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x4b, 0x65, 0x79, 0x22, 0x45, 0x0a, 0x15, 0x51, 0x75, 0x65, + 0x72, 0x79, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x2c, 0x0a, 0x12, 0x74, 0x77, 0x65, 0x61, 0x6b, 0x65, 0x64, 0x5f, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x10, + 0x74, 0x77, 0x65, 0x61, 0x6b, 0x65, 0x64, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x4b, 0x65, 0x79, + 0x22, 0x4a, 0x0a, 0x16, 0x51, 0x75, 0x65, 0x72, 0x79, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x30, 0x0a, 0x0a, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x4b, 0x65, - 0x79, 0x52, 0x09, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x4b, 0x65, 0x79, 0x22, 0x50, 0x0a, 0x1e, - 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x41, 0x73, 0x73, 0x65, 0x74, 0x57, 0x61, 0x6c, 0x6c, 0x65, - 0x74, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2e, - 0x0a, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x61, - 0x73, 0x73, 0x65, 0x74, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x72, 0x70, 0x63, 0x2e, 0x42, 0x61, - 0x63, 0x6b, 0x75, 0x70, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x22, 0x39, - 0x0a, 0x1f, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x41, 0x73, 0x73, 0x65, 0x74, 0x57, 0x61, 0x6c, - 0x6c, 0x65, 0x74, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x16, 0x0a, 0x06, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0c, 0x52, 0x06, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x22, 0x37, 0x0a, 0x1d, 0x49, 0x6d, 0x70, - 0x6f, 0x72, 0x74, 0x41, 0x73, 0x73, 0x65, 0x74, 0x73, 0x46, 0x72, 0x6f, 0x6d, 0x42, 0x61, 0x63, - 0x6b, 0x75, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x62, 0x61, - 0x63, 0x6b, 0x75, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x62, 0x61, 0x63, 0x6b, - 0x75, 0x70, 0x22, 0x43, 0x0a, 0x1e, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x41, 0x73, 0x73, 0x65, - 0x74, 0x73, 0x46, 0x72, 0x6f, 0x6d, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x6e, 0x75, 0x6d, 0x5f, 0x69, 0x6d, 0x70, 0x6f, - 0x72, 0x74, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x6e, 0x75, 0x6d, 0x49, - 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x2a, 0x6b, 0x0a, 0x0e, 0x43, 0x6f, 0x69, 0x6e, 0x53, - 0x65, 0x6c, 0x65, 0x63, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x17, 0x0a, 0x13, 0x43, 0x4f, 0x49, - 0x4e, 0x5f, 0x53, 0x45, 0x4c, 0x45, 0x43, 0x54, 0x5f, 0x44, 0x45, 0x46, 0x41, 0x55, 0x4c, 0x54, - 0x10, 0x00, 0x12, 0x1a, 0x0a, 0x16, 0x43, 0x4f, 0x49, 0x4e, 0x5f, 0x53, 0x45, 0x4c, 0x45, 0x43, - 0x54, 0x5f, 0x42, 0x49, 0x50, 0x38, 0x36, 0x5f, 0x4f, 0x4e, 0x4c, 0x59, 0x10, 0x01, 0x12, 0x24, - 0x0a, 0x20, 0x43, 0x4f, 0x49, 0x4e, 0x5f, 0x53, 0x45, 0x4c, 0x45, 0x43, 0x54, 0x5f, 0x53, 0x43, - 0x52, 0x49, 0x50, 0x54, 0x5f, 0x54, 0x52, 0x45, 0x45, 0x53, 0x5f, 0x41, 0x4c, 0x4c, 0x4f, 0x57, - 0x45, 0x44, 0x10, 0x02, 0x2a, 0x32, 0x0a, 0x0a, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x4d, 0x6f, - 0x64, 0x65, 0x12, 0x07, 0x0a, 0x03, 0x52, 0x41, 0x57, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x43, - 0x4f, 0x4d, 0x50, 0x41, 0x43, 0x54, 0x10, 0x01, 0x12, 0x0e, 0x0a, 0x0a, 0x4f, 0x50, 0x54, 0x49, - 0x4d, 0x49, 0x53, 0x54, 0x49, 0x43, 0x10, 0x02, 0x32, 0xa5, 0x0c, 0x0a, 0x0b, 0x41, 0x73, 0x73, - 0x65, 0x74, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x12, 0x62, 0x0a, 0x0f, 0x46, 0x75, 0x6e, 0x64, - 0x56, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x50, 0x73, 0x62, 0x74, 0x12, 0x26, 0x2e, 0x61, 0x73, - 0x73, 0x65, 0x74, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x72, 0x70, 0x63, 0x2e, 0x46, 0x75, 0x6e, - 0x64, 0x56, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x50, 0x73, 0x62, 0x74, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x74, 0x77, 0x61, 0x6c, 0x6c, 0x65, - 0x74, 0x72, 0x70, 0x63, 0x2e, 0x46, 0x75, 0x6e, 0x64, 0x56, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, - 0x50, 0x73, 0x62, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x62, 0x0a, 0x0f, - 0x53, 0x69, 0x67, 0x6e, 0x56, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x50, 0x73, 0x62, 0x74, 0x12, - 0x26, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x74, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x72, 0x70, 0x63, - 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x56, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x50, 0x73, 0x62, 0x74, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x74, 0x77, - 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x56, 0x69, 0x72, - 0x74, 0x75, 0x61, 0x6c, 0x50, 0x73, 0x62, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x5a, 0x0a, 0x12, 0x41, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x56, 0x69, 0x72, 0x74, 0x75, 0x61, - 0x6c, 0x50, 0x73, 0x62, 0x74, 0x73, 0x12, 0x29, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x74, 0x77, 0x61, - 0x6c, 0x6c, 0x65, 0x74, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x56, 0x69, - 0x72, 0x74, 0x75, 0x61, 0x6c, 0x50, 0x73, 0x62, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x19, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x65, 0x6e, 0x64, 0x41, - 0x73, 0x73, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6b, 0x0a, 0x12, - 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x56, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x50, 0x73, 0x62, - 0x74, 0x73, 0x12, 0x29, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x74, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, - 0x72, 0x70, 0x63, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x56, 0x69, 0x72, 0x74, 0x75, 0x61, - 0x6c, 0x50, 0x73, 0x62, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, - 0x61, 0x73, 0x73, 0x65, 0x74, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x72, 0x70, 0x63, 0x2e, 0x43, - 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x56, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x50, 0x73, 0x62, 0x74, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x58, 0x0a, 0x15, 0x50, 0x75, 0x62, - 0x6c, 0x69, 0x73, 0x68, 0x41, 0x6e, 0x64, 0x4c, 0x6f, 0x67, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, - 0x65, 0x72, 0x12, 0x24, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x74, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, - 0x72, 0x70, 0x63, 0x2e, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x41, 0x6e, 0x64, 0x4c, 0x6f, - 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, - 0x63, 0x2e, 0x53, 0x65, 0x6e, 0x64, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x62, 0x0a, 0x0f, 0x4e, 0x65, 0x78, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x72, - 0x6e, 0x61, 0x6c, 0x4b, 0x65, 0x79, 0x12, 0x26, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x74, 0x77, 0x61, - 0x6c, 0x6c, 0x65, 0x74, 0x72, 0x70, 0x63, 0x2e, 0x4e, 0x65, 0x78, 0x74, 0x49, 0x6e, 0x74, 0x65, - 0x72, 0x6e, 0x61, 0x6c, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, - 0x2e, 0x61, 0x73, 0x73, 0x65, 0x74, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x72, 0x70, 0x63, 0x2e, - 0x4e, 0x65, 0x78, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x4b, 0x65, 0x79, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5c, 0x0a, 0x0d, 0x4e, 0x65, 0x78, 0x74, 0x53, - 0x63, 0x72, 0x69, 0x70, 0x74, 0x4b, 0x65, 0x79, 0x12, 0x24, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x74, - 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x72, 0x70, 0x63, 0x2e, 0x4e, 0x65, 0x78, 0x74, 0x53, 0x63, - 0x72, 0x69, 0x70, 0x74, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, - 0x2e, 0x61, 0x73, 0x73, 0x65, 0x74, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x72, 0x70, 0x63, 0x2e, - 0x4e, 0x65, 0x78, 0x74, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x65, 0x0a, 0x10, 0x51, 0x75, 0x65, 0x72, 0x79, 0x49, 0x6e, - 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x4b, 0x65, 0x79, 0x12, 0x27, 0x2e, 0x61, 0x73, 0x73, 0x65, - 0x74, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x72, 0x70, 0x63, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, - 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x74, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, - 0x72, 0x70, 0x63, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, - 0x6c, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5f, 0x0a, 0x0e, - 0x51, 0x75, 0x65, 0x72, 0x79, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x4b, 0x65, 0x79, 0x12, 0x25, - 0x2e, 0x61, 0x73, 0x73, 0x65, 0x74, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x72, 0x70, 0x63, 0x2e, - 0x51, 0x75, 0x65, 0x72, 0x79, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x4b, 0x65, 0x79, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x74, 0x77, 0x61, 0x6c, - 0x6c, 0x65, 0x74, 0x72, 0x70, 0x63, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x53, 0x63, 0x72, 0x69, - 0x70, 0x74, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6e, 0x0a, - 0x13, 0x50, 0x72, 0x6f, 0x76, 0x65, 0x41, 0x73, 0x73, 0x65, 0x74, 0x4f, 0x77, 0x6e, 0x65, 0x72, - 0x73, 0x68, 0x69, 0x70, 0x12, 0x2a, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x74, 0x77, 0x61, 0x6c, 0x6c, - 0x65, 0x74, 0x72, 0x70, 0x63, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x65, 0x41, 0x73, 0x73, 0x65, 0x74, - 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x2b, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x74, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x72, 0x70, - 0x63, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x65, 0x41, 0x73, 0x73, 0x65, 0x74, 0x4f, 0x77, 0x6e, 0x65, - 0x72, 0x73, 0x68, 0x69, 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x71, 0x0a, - 0x14, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x41, 0x73, 0x73, 0x65, 0x74, 0x4f, 0x77, 0x6e, 0x65, - 0x72, 0x73, 0x68, 0x69, 0x70, 0x12, 0x2b, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x74, 0x77, 0x61, 0x6c, - 0x6c, 0x65, 0x74, 0x72, 0x70, 0x63, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x41, 0x73, 0x73, - 0x65, 0x74, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x74, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, - 0x72, 0x70, 0x63, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x41, 0x73, 0x73, 0x65, 0x74, 0x4f, + 0x79, 0x52, 0x09, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x4b, 0x65, 0x79, 0x22, 0xa2, 0x01, 0x0a, + 0x1a, 0x50, 0x72, 0x6f, 0x76, 0x65, 0x41, 0x73, 0x73, 0x65, 0x74, 0x4f, 0x77, 0x6e, 0x65, 0x72, + 0x73, 0x68, 0x69, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x61, + 0x73, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x61, + 0x73, 0x73, 0x65, 0x74, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x4b, 0x65, 0x79, 0x12, 0x2c, 0x0a, 0x08, 0x6f, 0x75, 0x74, 0x70, 0x6f, 0x69, 0x6e, + 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, + 0x2e, 0x4f, 0x75, 0x74, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x08, 0x6f, 0x75, 0x74, 0x70, 0x6f, + 0x69, 0x6e, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x68, 0x61, 0x6c, 0x6c, 0x65, 0x6e, 0x67, 0x65, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x63, 0x68, 0x61, 0x6c, 0x6c, 0x65, 0x6e, 0x67, + 0x65, 0x22, 0x4b, 0x0a, 0x1b, 0x50, 0x72, 0x6f, 0x76, 0x65, 0x41, 0x73, 0x73, 0x65, 0x74, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x62, 0x0a, 0x0f, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x55, 0x54, 0x58, 0x4f, 0x4c, 0x65, - 0x61, 0x73, 0x65, 0x12, 0x26, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x74, 0x77, 0x61, 0x6c, 0x6c, 0x65, - 0x74, 0x72, 0x70, 0x63, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x55, 0x54, 0x58, 0x4f, 0x4c, - 0x65, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x61, 0x73, - 0x73, 0x65, 0x74, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x72, 0x70, 0x63, 0x2e, 0x52, 0x65, 0x6d, - 0x6f, 0x76, 0x65, 0x55, 0x54, 0x58, 0x4f, 0x4c, 0x65, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x65, 0x0a, 0x10, 0x44, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x65, 0x53, - 0x63, 0x72, 0x69, 0x70, 0x74, 0x4b, 0x65, 0x79, 0x12, 0x27, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x74, - 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x72, 0x70, 0x63, 0x2e, 0x44, 0x65, 0x63, 0x6c, 0x61, 0x72, - 0x65, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x28, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x74, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x72, - 0x70, 0x63, 0x2e, 0x44, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x65, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, - 0x4b, 0x65, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x7a, 0x0a, 0x17, 0x45, - 0x78, 0x70, 0x6f, 0x72, 0x74, 0x41, 0x73, 0x73, 0x65, 0x74, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, - 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x12, 0x2e, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x74, 0x77, 0x61, - 0x6c, 0x6c, 0x65, 0x74, 0x72, 0x70, 0x63, 0x2e, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x41, 0x73, - 0x73, 0x65, 0x74, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x74, 0x77, 0x61, - 0x6c, 0x6c, 0x65, 0x74, 0x72, 0x70, 0x63, 0x2e, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x41, 0x73, + 0x12, 0x2c, 0x0a, 0x12, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x77, + 0x69, 0x74, 0x6e, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x10, 0x70, 0x72, + 0x6f, 0x6f, 0x66, 0x57, 0x69, 0x74, 0x68, 0x57, 0x69, 0x74, 0x6e, 0x65, 0x73, 0x73, 0x22, 0x69, + 0x0a, 0x1b, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x41, 0x73, 0x73, 0x65, 0x74, 0x4f, 0x77, 0x6e, + 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2c, 0x0a, + 0x12, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x77, 0x69, 0x74, 0x6e, + 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x10, 0x70, 0x72, 0x6f, 0x6f, 0x66, + 0x57, 0x69, 0x74, 0x68, 0x57, 0x69, 0x74, 0x6e, 0x65, 0x73, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x63, + 0x68, 0x61, 0x6c, 0x6c, 0x65, 0x6e, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, + 0x63, 0x68, 0x61, 0x6c, 0x6c, 0x65, 0x6e, 0x67, 0x65, 0x22, 0xf8, 0x01, 0x0a, 0x1c, 0x56, 0x65, + 0x72, 0x69, 0x66, 0x79, 0x41, 0x73, 0x73, 0x65, 0x74, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x73, 0x68, + 0x69, 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x76, 0x61, + 0x6c, 0x69, 0x64, 0x5f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x0a, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x2c, 0x0a, 0x08, 0x6f, + 0x75, 0x74, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, + 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4f, 0x75, 0x74, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x52, + 0x08, 0x6f, 0x75, 0x74, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x6f, 0x75, 0x74, + 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x5f, 0x73, 0x74, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0b, 0x6f, 0x75, 0x74, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x53, 0x74, 0x72, 0x12, 0x1d, 0x0a, 0x0a, + 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, + 0x52, 0x09, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x61, 0x73, 0x68, 0x12, 0x24, 0x0a, 0x0e, 0x62, + 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x5f, 0x73, 0x74, 0x72, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x61, 0x73, 0x68, 0x53, 0x74, + 0x72, 0x12, 0x21, 0x0a, 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, + 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, + 0x69, 0x67, 0x68, 0x74, 0x22, 0x46, 0x0a, 0x16, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x55, 0x54, + 0x58, 0x4f, 0x4c, 0x65, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2c, + 0x0a, 0x08, 0x6f, 0x75, 0x74, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x10, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4f, 0x75, 0x74, 0x50, 0x6f, 0x69, + 0x6e, 0x74, 0x52, 0x08, 0x6f, 0x75, 0x74, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x22, 0x19, 0x0a, 0x17, + 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x55, 0x54, 0x58, 0x4f, 0x4c, 0x65, 0x61, 0x73, 0x65, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x4b, 0x0a, 0x17, 0x44, 0x65, 0x63, 0x6c, 0x61, + 0x72, 0x65, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x30, 0x0a, 0x0a, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x5f, 0x6b, 0x65, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, + 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x4b, 0x65, 0x79, 0x52, 0x09, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x4b, 0x65, 0x79, 0x22, 0x4c, 0x0a, 0x18, 0x44, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x65, 0x53, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x30, 0x0a, 0x0a, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x4b, 0x65, 0x79, 0x52, 0x09, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x4b, + 0x65, 0x79, 0x22, 0x50, 0x0a, 0x1e, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x41, 0x73, 0x73, 0x65, + 0x74, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x2e, 0x0a, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x74, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, + 0x72, 0x70, 0x63, 0x2e, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x04, + 0x6d, 0x6f, 0x64, 0x65, 0x22, 0x39, 0x0a, 0x1f, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x41, 0x73, 0x73, 0x65, 0x74, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x77, 0x0a, 0x16, 0x49, 0x6d, 0x70, 0x6f, 0x72, - 0x74, 0x41, 0x73, 0x73, 0x65, 0x74, 0x73, 0x46, 0x72, 0x6f, 0x6d, 0x42, 0x61, 0x63, 0x6b, 0x75, - 0x70, 0x12, 0x2d, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x74, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x72, - 0x70, 0x63, 0x2e, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x41, 0x73, 0x73, 0x65, 0x74, 0x73, 0x46, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x62, 0x61, 0x63, 0x6b, 0x75, + 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x22, + 0x37, 0x0a, 0x1d, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x41, 0x73, 0x73, 0x65, 0x74, 0x73, 0x46, 0x72, 0x6f, 0x6d, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x2e, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x74, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x72, 0x70, - 0x63, 0x2e, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x41, 0x73, 0x73, 0x65, 0x74, 0x73, 0x46, 0x72, - 0x6f, 0x6d, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x42, 0x3f, 0x5a, 0x3d, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6c, - 0x69, 0x67, 0x68, 0x74, 0x6e, 0x69, 0x6e, 0x67, 0x6c, 0x61, 0x62, 0x73, 0x2f, 0x74, 0x61, 0x70, - 0x72, 0x6f, 0x6f, 0x74, 0x2d, 0x61, 0x73, 0x73, 0x65, 0x74, 0x73, 0x2f, 0x74, 0x61, 0x70, 0x72, - 0x70, 0x63, 0x2f, 0x61, 0x73, 0x73, 0x65, 0x74, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x72, 0x70, - 0x63, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x12, 0x16, 0x0a, 0x06, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, + 0x52, 0x06, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x22, 0x43, 0x0a, 0x1e, 0x49, 0x6d, 0x70, 0x6f, + 0x72, 0x74, 0x41, 0x73, 0x73, 0x65, 0x74, 0x73, 0x46, 0x72, 0x6f, 0x6d, 0x42, 0x61, 0x63, 0x6b, + 0x75, 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x6e, 0x75, + 0x6d, 0x5f, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x0b, 0x6e, 0x75, 0x6d, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x2a, 0x6b, 0x0a, + 0x0e, 0x43, 0x6f, 0x69, 0x6e, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, + 0x17, 0x0a, 0x13, 0x43, 0x4f, 0x49, 0x4e, 0x5f, 0x53, 0x45, 0x4c, 0x45, 0x43, 0x54, 0x5f, 0x44, + 0x45, 0x46, 0x41, 0x55, 0x4c, 0x54, 0x10, 0x00, 0x12, 0x1a, 0x0a, 0x16, 0x43, 0x4f, 0x49, 0x4e, + 0x5f, 0x53, 0x45, 0x4c, 0x45, 0x43, 0x54, 0x5f, 0x42, 0x49, 0x50, 0x38, 0x36, 0x5f, 0x4f, 0x4e, + 0x4c, 0x59, 0x10, 0x01, 0x12, 0x24, 0x0a, 0x20, 0x43, 0x4f, 0x49, 0x4e, 0x5f, 0x53, 0x45, 0x4c, + 0x45, 0x43, 0x54, 0x5f, 0x53, 0x43, 0x52, 0x49, 0x50, 0x54, 0x5f, 0x54, 0x52, 0x45, 0x45, 0x53, + 0x5f, 0x41, 0x4c, 0x4c, 0x4f, 0x57, 0x45, 0x44, 0x10, 0x02, 0x2a, 0x32, 0x0a, 0x0a, 0x42, 0x61, + 0x63, 0x6b, 0x75, 0x70, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x07, 0x0a, 0x03, 0x52, 0x41, 0x57, 0x10, + 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x43, 0x4f, 0x4d, 0x50, 0x41, 0x43, 0x54, 0x10, 0x01, 0x12, 0x0e, + 0x0a, 0x0a, 0x4f, 0x50, 0x54, 0x49, 0x4d, 0x49, 0x53, 0x54, 0x49, 0x43, 0x10, 0x02, 0x32, 0xa5, + 0x0c, 0x0a, 0x0b, 0x41, 0x73, 0x73, 0x65, 0x74, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x12, 0x62, + 0x0a, 0x0f, 0x46, 0x75, 0x6e, 0x64, 0x56, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x50, 0x73, 0x62, + 0x74, 0x12, 0x26, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x74, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x72, + 0x70, 0x63, 0x2e, 0x46, 0x75, 0x6e, 0x64, 0x56, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x50, 0x73, + 0x62, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x61, 0x73, 0x73, 0x65, + 0x74, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x72, 0x70, 0x63, 0x2e, 0x46, 0x75, 0x6e, 0x64, 0x56, + 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x50, 0x73, 0x62, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x62, 0x0a, 0x0f, 0x53, 0x69, 0x67, 0x6e, 0x56, 0x69, 0x72, 0x74, 0x75, 0x61, + 0x6c, 0x50, 0x73, 0x62, 0x74, 0x12, 0x26, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x74, 0x77, 0x61, 0x6c, + 0x6c, 0x65, 0x74, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x56, 0x69, 0x72, 0x74, 0x75, + 0x61, 0x6c, 0x50, 0x73, 0x62, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, + 0x61, 0x73, 0x73, 0x65, 0x74, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x72, 0x70, 0x63, 0x2e, 0x53, + 0x69, 0x67, 0x6e, 0x56, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x50, 0x73, 0x62, 0x74, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5a, 0x0a, 0x12, 0x41, 0x6e, 0x63, 0x68, 0x6f, 0x72, + 0x56, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x50, 0x73, 0x62, 0x74, 0x73, 0x12, 0x29, 0x2e, 0x61, + 0x73, 0x73, 0x65, 0x74, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x6e, + 0x63, 0x68, 0x6f, 0x72, 0x56, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x50, 0x73, 0x62, 0x74, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, + 0x2e, 0x53, 0x65, 0x6e, 0x64, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x6b, 0x0a, 0x12, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x56, 0x69, 0x72, 0x74, + 0x75, 0x61, 0x6c, 0x50, 0x73, 0x62, 0x74, 0x73, 0x12, 0x29, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x74, + 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x72, 0x70, 0x63, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, + 0x56, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x50, 0x73, 0x62, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x74, 0x77, 0x61, 0x6c, 0x6c, 0x65, + 0x74, 0x72, 0x70, 0x63, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x56, 0x69, 0x72, 0x74, 0x75, + 0x61, 0x6c, 0x50, 0x73, 0x62, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x58, 0x0a, 0x15, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x41, 0x6e, 0x64, 0x4c, 0x6f, 0x67, + 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x12, 0x24, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x74, + 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x72, 0x70, 0x63, 0x2e, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, + 0x68, 0x41, 0x6e, 0x64, 0x4c, 0x6f, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, + 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x65, 0x6e, 0x64, 0x41, 0x73, 0x73, 0x65, + 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x62, 0x0a, 0x0f, 0x4e, 0x65, 0x78, + 0x74, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x4b, 0x65, 0x79, 0x12, 0x26, 0x2e, 0x61, + 0x73, 0x73, 0x65, 0x74, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x72, 0x70, 0x63, 0x2e, 0x4e, 0x65, + 0x78, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x74, 0x77, 0x61, 0x6c, 0x6c, + 0x65, 0x74, 0x72, 0x70, 0x63, 0x2e, 0x4e, 0x65, 0x78, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, + 0x61, 0x6c, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5c, 0x0a, + 0x0d, 0x4e, 0x65, 0x78, 0x74, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x4b, 0x65, 0x79, 0x12, 0x24, + 0x2e, 0x61, 0x73, 0x73, 0x65, 0x74, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x72, 0x70, 0x63, 0x2e, + 0x4e, 0x65, 0x78, 0x74, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x74, 0x77, 0x61, 0x6c, 0x6c, + 0x65, 0x74, 0x72, 0x70, 0x63, 0x2e, 0x4e, 0x65, 0x78, 0x74, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x4b, 0x65, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x65, 0x0a, 0x10, 0x51, + 0x75, 0x65, 0x72, 0x79, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x4b, 0x65, 0x79, 0x12, + 0x27, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x74, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x72, 0x70, 0x63, + 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x4b, 0x65, + 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x74, + 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x72, 0x70, 0x63, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x49, + 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x5f, 0x0a, 0x0e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x53, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x4b, 0x65, 0x79, 0x12, 0x25, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x74, 0x77, 0x61, 0x6c, 0x6c, + 0x65, 0x74, 0x72, 0x70, 0x63, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x53, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x61, 0x73, + 0x73, 0x65, 0x74, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x72, 0x70, 0x63, 0x2e, 0x51, 0x75, 0x65, + 0x72, 0x79, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x6e, 0x0a, 0x13, 0x50, 0x72, 0x6f, 0x76, 0x65, 0x41, 0x73, 0x73, 0x65, + 0x74, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, 0x12, 0x2a, 0x2e, 0x61, 0x73, 0x73, + 0x65, 0x74, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x72, 0x70, 0x63, 0x2e, 0x50, 0x72, 0x6f, 0x76, + 0x65, 0x41, 0x73, 0x73, 0x65, 0x74, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x74, 0x77, 0x61, + 0x6c, 0x6c, 0x65, 0x74, 0x72, 0x70, 0x63, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x65, 0x41, 0x73, 0x73, + 0x65, 0x74, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x71, 0x0a, 0x14, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x41, 0x73, 0x73, + 0x65, 0x74, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, 0x12, 0x2b, 0x2e, 0x61, 0x73, + 0x73, 0x65, 0x74, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x72, 0x70, 0x63, 0x2e, 0x56, 0x65, 0x72, + 0x69, 0x66, 0x79, 0x41, 0x73, 0x73, 0x65, 0x74, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x73, 0x68, 0x69, + 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x74, + 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x72, 0x70, 0x63, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, + 0x41, 0x73, 0x73, 0x65, 0x74, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x62, 0x0a, 0x0f, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, + 0x55, 0x54, 0x58, 0x4f, 0x4c, 0x65, 0x61, 0x73, 0x65, 0x12, 0x26, 0x2e, 0x61, 0x73, 0x73, 0x65, + 0x74, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x72, 0x70, 0x63, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, + 0x65, 0x55, 0x54, 0x58, 0x4f, 0x4c, 0x65, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x27, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x74, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x72, + 0x70, 0x63, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x55, 0x54, 0x58, 0x4f, 0x4c, 0x65, 0x61, + 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x65, 0x0a, 0x10, 0x44, 0x65, + 0x63, 0x6c, 0x61, 0x72, 0x65, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x4b, 0x65, 0x79, 0x12, 0x27, + 0x2e, 0x61, 0x73, 0x73, 0x65, 0x74, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x72, 0x70, 0x63, 0x2e, + 0x44, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x65, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x4b, 0x65, 0x79, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x74, 0x77, + 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x72, 0x70, 0x63, 0x2e, 0x44, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x65, + 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x7a, 0x0a, 0x17, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x41, 0x73, 0x73, 0x65, 0x74, + 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x12, 0x2e, 0x2e, 0x61, + 0x73, 0x73, 0x65, 0x74, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x72, 0x70, 0x63, 0x2e, 0x45, 0x78, + 0x70, 0x6f, 0x72, 0x74, 0x41, 0x73, 0x73, 0x65, 0x74, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x42, + 0x61, 0x63, 0x6b, 0x75, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x61, + 0x73, 0x73, 0x65, 0x74, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x72, 0x70, 0x63, 0x2e, 0x45, 0x78, + 0x70, 0x6f, 0x72, 0x74, 0x41, 0x73, 0x73, 0x65, 0x74, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x42, + 0x61, 0x63, 0x6b, 0x75, 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x77, 0x0a, + 0x16, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x41, 0x73, 0x73, 0x65, 0x74, 0x73, 0x46, 0x72, 0x6f, + 0x6d, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x12, 0x2d, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x74, 0x77, + 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x72, 0x70, 0x63, 0x2e, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x41, + 0x73, 0x73, 0x65, 0x74, 0x73, 0x46, 0x72, 0x6f, 0x6d, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x74, 0x77, 0x61, + 0x6c, 0x6c, 0x65, 0x74, 0x72, 0x70, 0x63, 0x2e, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x41, 0x73, + 0x73, 0x65, 0x74, 0x73, 0x46, 0x72, 0x6f, 0x6d, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x3f, 0x5a, 0x3d, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, + 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x6e, 0x69, 0x6e, 0x67, 0x6c, 0x61, + 0x62, 0x73, 0x2f, 0x74, 0x61, 0x70, 0x72, 0x6f, 0x6f, 0x74, 0x2d, 0x61, 0x73, 0x73, 0x65, 0x74, + 0x73, 0x2f, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2f, 0x61, 0x73, 0x73, 0x65, 0x74, 0x77, 0x61, + 0x6c, 0x6c, 0x65, 0x74, 0x72, 0x70, 0x63, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -2474,9 +2487,10 @@ var file_assetwalletrpc_assetwallet_proto_goTypes = []any{ nil, // 32: assetwalletrpc.TxTemplate.RecipientsEntry (*taprpc.AddressWithAmount)(nil), // 33: taprpc.AddressWithAmount (*taprpc.OutPoint)(nil), // 34: taprpc.OutPoint - (*taprpc.KeyDescriptor)(nil), // 35: taprpc.KeyDescriptor - (*taprpc.ScriptKey)(nil), // 36: taprpc.ScriptKey - (*taprpc.SendAssetResponse)(nil), // 37: taprpc.SendAssetResponse + (taprpc.AnchorTxVersion)(0), // 35: taprpc.AnchorTxVersion + (*taprpc.KeyDescriptor)(nil), // 36: taprpc.KeyDescriptor + (*taprpc.ScriptKey)(nil), // 37: taprpc.ScriptKey + (*taprpc.SendAssetResponse)(nil), // 38: taprpc.SendAssetResponse } var file_assetwalletrpc_assetwallet_proto_depIdxs = []int32{ 4, // 0: assetwalletrpc.FundVirtualPsbtRequest.raw:type_name -> assetwalletrpc.TxTemplate @@ -2485,53 +2499,54 @@ var file_assetwalletrpc_assetwallet_proto_depIdxs = []int32{ 32, // 3: assetwalletrpc.TxTemplate.recipients:type_name -> assetwalletrpc.TxTemplate.RecipientsEntry 33, // 4: assetwalletrpc.TxTemplate.addresses_with_amounts:type_name -> taprpc.AddressWithAmount 34, // 5: assetwalletrpc.PrevId.outpoint:type_name -> taprpc.OutPoint - 34, // 6: assetwalletrpc.CommitVirtualPsbtsResponse.lnd_locked_utxos:type_name -> taprpc.OutPoint - 34, // 7: assetwalletrpc.PublishAndLogRequest.lnd_locked_utxos:type_name -> taprpc.OutPoint - 35, // 8: assetwalletrpc.NextInternalKeyResponse.internal_key:type_name -> taprpc.KeyDescriptor - 36, // 9: assetwalletrpc.NextScriptKeyResponse.script_key:type_name -> taprpc.ScriptKey - 35, // 10: assetwalletrpc.QueryInternalKeyResponse.internal_key:type_name -> taprpc.KeyDescriptor - 36, // 11: assetwalletrpc.QueryScriptKeyResponse.script_key:type_name -> taprpc.ScriptKey - 34, // 12: assetwalletrpc.ProveAssetOwnershipRequest.outpoint:type_name -> taprpc.OutPoint - 34, // 13: assetwalletrpc.VerifyAssetOwnershipResponse.outpoint:type_name -> taprpc.OutPoint - 34, // 14: assetwalletrpc.RemoveUTXOLeaseRequest.outpoint:type_name -> taprpc.OutPoint - 36, // 15: assetwalletrpc.DeclareScriptKeyRequest.script_key:type_name -> taprpc.ScriptKey - 36, // 16: assetwalletrpc.DeclareScriptKeyResponse.script_key:type_name -> taprpc.ScriptKey - 1, // 17: assetwalletrpc.ExportAssetWalletBackupRequest.mode:type_name -> assetwalletrpc.BackupMode - 2, // 18: assetwalletrpc.AssetWallet.FundVirtualPsbt:input_type -> assetwalletrpc.FundVirtualPsbtRequest - 6, // 19: assetwalletrpc.AssetWallet.SignVirtualPsbt:input_type -> assetwalletrpc.SignVirtualPsbtRequest - 8, // 20: assetwalletrpc.AssetWallet.AnchorVirtualPsbts:input_type -> assetwalletrpc.AnchorVirtualPsbtsRequest - 9, // 21: assetwalletrpc.AssetWallet.CommitVirtualPsbts:input_type -> assetwalletrpc.CommitVirtualPsbtsRequest - 11, // 22: assetwalletrpc.AssetWallet.PublishAndLogTransfer:input_type -> assetwalletrpc.PublishAndLogRequest - 12, // 23: assetwalletrpc.AssetWallet.NextInternalKey:input_type -> assetwalletrpc.NextInternalKeyRequest - 14, // 24: assetwalletrpc.AssetWallet.NextScriptKey:input_type -> assetwalletrpc.NextScriptKeyRequest - 16, // 25: assetwalletrpc.AssetWallet.QueryInternalKey:input_type -> assetwalletrpc.QueryInternalKeyRequest - 18, // 26: assetwalletrpc.AssetWallet.QueryScriptKey:input_type -> assetwalletrpc.QueryScriptKeyRequest - 20, // 27: assetwalletrpc.AssetWallet.ProveAssetOwnership:input_type -> assetwalletrpc.ProveAssetOwnershipRequest - 22, // 28: assetwalletrpc.AssetWallet.VerifyAssetOwnership:input_type -> assetwalletrpc.VerifyAssetOwnershipRequest - 24, // 29: assetwalletrpc.AssetWallet.RemoveUTXOLease:input_type -> assetwalletrpc.RemoveUTXOLeaseRequest - 26, // 30: assetwalletrpc.AssetWallet.DeclareScriptKey:input_type -> assetwalletrpc.DeclareScriptKeyRequest - 28, // 31: assetwalletrpc.AssetWallet.ExportAssetWalletBackup:input_type -> assetwalletrpc.ExportAssetWalletBackupRequest - 30, // 32: assetwalletrpc.AssetWallet.ImportAssetsFromBackup:input_type -> assetwalletrpc.ImportAssetsFromBackupRequest - 3, // 33: assetwalletrpc.AssetWallet.FundVirtualPsbt:output_type -> assetwalletrpc.FundVirtualPsbtResponse - 7, // 34: assetwalletrpc.AssetWallet.SignVirtualPsbt:output_type -> assetwalletrpc.SignVirtualPsbtResponse - 37, // 35: assetwalletrpc.AssetWallet.AnchorVirtualPsbts:output_type -> taprpc.SendAssetResponse - 10, // 36: assetwalletrpc.AssetWallet.CommitVirtualPsbts:output_type -> assetwalletrpc.CommitVirtualPsbtsResponse - 37, // 37: assetwalletrpc.AssetWallet.PublishAndLogTransfer:output_type -> taprpc.SendAssetResponse - 13, // 38: assetwalletrpc.AssetWallet.NextInternalKey:output_type -> assetwalletrpc.NextInternalKeyResponse - 15, // 39: assetwalletrpc.AssetWallet.NextScriptKey:output_type -> assetwalletrpc.NextScriptKeyResponse - 17, // 40: assetwalletrpc.AssetWallet.QueryInternalKey:output_type -> assetwalletrpc.QueryInternalKeyResponse - 19, // 41: assetwalletrpc.AssetWallet.QueryScriptKey:output_type -> assetwalletrpc.QueryScriptKeyResponse - 21, // 42: assetwalletrpc.AssetWallet.ProveAssetOwnership:output_type -> assetwalletrpc.ProveAssetOwnershipResponse - 23, // 43: assetwalletrpc.AssetWallet.VerifyAssetOwnership:output_type -> assetwalletrpc.VerifyAssetOwnershipResponse - 25, // 44: assetwalletrpc.AssetWallet.RemoveUTXOLease:output_type -> assetwalletrpc.RemoveUTXOLeaseResponse - 27, // 45: assetwalletrpc.AssetWallet.DeclareScriptKey:output_type -> assetwalletrpc.DeclareScriptKeyResponse - 29, // 46: assetwalletrpc.AssetWallet.ExportAssetWalletBackup:output_type -> assetwalletrpc.ExportAssetWalletBackupResponse - 31, // 47: assetwalletrpc.AssetWallet.ImportAssetsFromBackup:output_type -> assetwalletrpc.ImportAssetsFromBackupResponse - 33, // [33:48] is the sub-list for method output_type - 18, // [18:33] is the sub-list for method input_type - 18, // [18:18] is the sub-list for extension type_name - 18, // [18:18] is the sub-list for extension extendee - 0, // [0:18] is the sub-list for field type_name + 35, // 6: assetwalletrpc.AnchorVirtualPsbtsRequest.anchor_tx_version:type_name -> taprpc.AnchorTxVersion + 34, // 7: assetwalletrpc.CommitVirtualPsbtsResponse.lnd_locked_utxos:type_name -> taprpc.OutPoint + 34, // 8: assetwalletrpc.PublishAndLogRequest.lnd_locked_utxos:type_name -> taprpc.OutPoint + 36, // 9: assetwalletrpc.NextInternalKeyResponse.internal_key:type_name -> taprpc.KeyDescriptor + 37, // 10: assetwalletrpc.NextScriptKeyResponse.script_key:type_name -> taprpc.ScriptKey + 36, // 11: assetwalletrpc.QueryInternalKeyResponse.internal_key:type_name -> taprpc.KeyDescriptor + 37, // 12: assetwalletrpc.QueryScriptKeyResponse.script_key:type_name -> taprpc.ScriptKey + 34, // 13: assetwalletrpc.ProveAssetOwnershipRequest.outpoint:type_name -> taprpc.OutPoint + 34, // 14: assetwalletrpc.VerifyAssetOwnershipResponse.outpoint:type_name -> taprpc.OutPoint + 34, // 15: assetwalletrpc.RemoveUTXOLeaseRequest.outpoint:type_name -> taprpc.OutPoint + 37, // 16: assetwalletrpc.DeclareScriptKeyRequest.script_key:type_name -> taprpc.ScriptKey + 37, // 17: assetwalletrpc.DeclareScriptKeyResponse.script_key:type_name -> taprpc.ScriptKey + 1, // 18: assetwalletrpc.ExportAssetWalletBackupRequest.mode:type_name -> assetwalletrpc.BackupMode + 2, // 19: assetwalletrpc.AssetWallet.FundVirtualPsbt:input_type -> assetwalletrpc.FundVirtualPsbtRequest + 6, // 20: assetwalletrpc.AssetWallet.SignVirtualPsbt:input_type -> assetwalletrpc.SignVirtualPsbtRequest + 8, // 21: assetwalletrpc.AssetWallet.AnchorVirtualPsbts:input_type -> assetwalletrpc.AnchorVirtualPsbtsRequest + 9, // 22: assetwalletrpc.AssetWallet.CommitVirtualPsbts:input_type -> assetwalletrpc.CommitVirtualPsbtsRequest + 11, // 23: assetwalletrpc.AssetWallet.PublishAndLogTransfer:input_type -> assetwalletrpc.PublishAndLogRequest + 12, // 24: assetwalletrpc.AssetWallet.NextInternalKey:input_type -> assetwalletrpc.NextInternalKeyRequest + 14, // 25: assetwalletrpc.AssetWallet.NextScriptKey:input_type -> assetwalletrpc.NextScriptKeyRequest + 16, // 26: assetwalletrpc.AssetWallet.QueryInternalKey:input_type -> assetwalletrpc.QueryInternalKeyRequest + 18, // 27: assetwalletrpc.AssetWallet.QueryScriptKey:input_type -> assetwalletrpc.QueryScriptKeyRequest + 20, // 28: assetwalletrpc.AssetWallet.ProveAssetOwnership:input_type -> assetwalletrpc.ProveAssetOwnershipRequest + 22, // 29: assetwalletrpc.AssetWallet.VerifyAssetOwnership:input_type -> assetwalletrpc.VerifyAssetOwnershipRequest + 24, // 30: assetwalletrpc.AssetWallet.RemoveUTXOLease:input_type -> assetwalletrpc.RemoveUTXOLeaseRequest + 26, // 31: assetwalletrpc.AssetWallet.DeclareScriptKey:input_type -> assetwalletrpc.DeclareScriptKeyRequest + 28, // 32: assetwalletrpc.AssetWallet.ExportAssetWalletBackup:input_type -> assetwalletrpc.ExportAssetWalletBackupRequest + 30, // 33: assetwalletrpc.AssetWallet.ImportAssetsFromBackup:input_type -> assetwalletrpc.ImportAssetsFromBackupRequest + 3, // 34: assetwalletrpc.AssetWallet.FundVirtualPsbt:output_type -> assetwalletrpc.FundVirtualPsbtResponse + 7, // 35: assetwalletrpc.AssetWallet.SignVirtualPsbt:output_type -> assetwalletrpc.SignVirtualPsbtResponse + 38, // 36: assetwalletrpc.AssetWallet.AnchorVirtualPsbts:output_type -> taprpc.SendAssetResponse + 10, // 37: assetwalletrpc.AssetWallet.CommitVirtualPsbts:output_type -> assetwalletrpc.CommitVirtualPsbtsResponse + 38, // 38: assetwalletrpc.AssetWallet.PublishAndLogTransfer:output_type -> taprpc.SendAssetResponse + 13, // 39: assetwalletrpc.AssetWallet.NextInternalKey:output_type -> assetwalletrpc.NextInternalKeyResponse + 15, // 40: assetwalletrpc.AssetWallet.NextScriptKey:output_type -> assetwalletrpc.NextScriptKeyResponse + 17, // 41: assetwalletrpc.AssetWallet.QueryInternalKey:output_type -> assetwalletrpc.QueryInternalKeyResponse + 19, // 42: assetwalletrpc.AssetWallet.QueryScriptKey:output_type -> assetwalletrpc.QueryScriptKeyResponse + 21, // 43: assetwalletrpc.AssetWallet.ProveAssetOwnership:output_type -> assetwalletrpc.ProveAssetOwnershipResponse + 23, // 44: assetwalletrpc.AssetWallet.VerifyAssetOwnership:output_type -> assetwalletrpc.VerifyAssetOwnershipResponse + 25, // 45: assetwalletrpc.AssetWallet.RemoveUTXOLease:output_type -> assetwalletrpc.RemoveUTXOLeaseResponse + 27, // 46: assetwalletrpc.AssetWallet.DeclareScriptKey:output_type -> assetwalletrpc.DeclareScriptKeyResponse + 29, // 47: assetwalletrpc.AssetWallet.ExportAssetWalletBackup:output_type -> assetwalletrpc.ExportAssetWalletBackupResponse + 31, // 48: assetwalletrpc.AssetWallet.ImportAssetsFromBackup:output_type -> assetwalletrpc.ImportAssetsFromBackupResponse + 34, // [34:49] is the sub-list for method output_type + 19, // [19:34] is the sub-list for method input_type + 19, // [19:19] is the sub-list for extension type_name + 19, // [19:19] is the sub-list for extension extendee + 0, // [0:19] is the sub-list for field type_name } func init() { file_assetwalletrpc_assetwallet_proto_init() } diff --git a/taprpc/assetwalletrpc/assetwallet.proto b/taprpc/assetwalletrpc/assetwallet.proto index 9ec21b72cb..b355ef6683 100644 --- a/taprpc/assetwalletrpc/assetwallet.proto +++ b/taprpc/assetwalletrpc/assetwallet.proto @@ -274,6 +274,9 @@ message AnchorVirtualPsbtsRequest { the BTC level anchor transaction. */ repeated bytes virtual_psbts = 1; + + // The version to use when creating a new BTC anchor transaction. + taprpc.AnchorTxVersion anchor_tx_version = 2; } message CommitVirtualPsbtsRequest { diff --git a/taprpc/assetwalletrpc/assetwallet.swagger.json b/taprpc/assetwalletrpc/assetwallet.swagger.json index fda87d4327..c3b7dc20ba 100644 --- a/taprpc/assetwalletrpc/assetwallet.swagger.json +++ b/taprpc/assetwalletrpc/assetwallet.swagger.json @@ -523,6 +523,10 @@ "format": "byte" }, "description": "The list of virtual transactions that should be merged and committed to in\nthe BTC level anchor transaction." + }, + "anchor_tx_version": { + "$ref": "#/definitions/taprpcAnchorTxVersion", + "description": "The version to use when creating a new BTC anchor transaction." } } }, @@ -1054,6 +1058,16 @@ } } }, + "taprpcAnchorTxVersion": { + "type": "string", + "enum": [ + "ANCHOR_TX_VERSION_UNSPECIFIED", + "ANCHOR_TX_VERSION_V2", + "ANCHOR_TX_VERSION_V3" + ], + "default": "ANCHOR_TX_VERSION_UNSPECIFIED", + "description": " - ANCHOR_TX_VERSION_UNSPECIFIED: Use the daemon default anchor transaction version, currently v2.\n - ANCHOR_TX_VERSION_V2: Create new anchor transactions with version 2.\n - ANCHOR_TX_VERSION_V3: Create new anchor transactions with version 3 (TRUC)." + }, "taprpcAssetTransfer": { "type": "object", "properties": { diff --git a/taprpc/mintrpc/mint.pb.go b/taprpc/mintrpc/mint.pb.go index da94606571..2bfb9dfb0e 100644 --- a/taprpc/mintrpc/mint.pb.go +++ b/taprpc/mintrpc/mint.pb.go @@ -812,6 +812,8 @@ type FundBatchRequest struct { // *FundBatchRequest_FullTree // *FundBatchRequest_Branch BatchSibling isFundBatchRequest_BatchSibling `protobuf_oneof:"batch_sibling"` + // The version to use when creating a new mint anchor transaction. + AnchorTxVersion taprpc.AnchorTxVersion `protobuf:"varint,5,opt,name=anchor_tx_version,json=anchorTxVersion,proto3,enum=taprpc.AnchorTxVersion" json:"anchor_tx_version,omitempty"` } func (x *FundBatchRequest) Reset() { @@ -881,6 +883,13 @@ func (x *FundBatchRequest) GetBranch() *taprpc.TapBranch { return nil } +func (x *FundBatchRequest) GetAnchorTxVersion() taprpc.AnchorTxVersion { + if x != nil { + return x.AnchorTxVersion + } + return taprpc.AnchorTxVersion(0) +} + type isFundBatchRequest_BatchSibling interface { isFundBatchRequest_BatchSibling() } @@ -1088,6 +1097,8 @@ type FinalizeBatchRequest struct { // *FinalizeBatchRequest_FullTree // *FinalizeBatchRequest_Branch BatchSibling isFinalizeBatchRequest_BatchSibling `protobuf_oneof:"batch_sibling"` + // The version to use when creating a new mint anchor transaction. + AnchorTxVersion taprpc.AnchorTxVersion `protobuf:"varint,5,opt,name=anchor_tx_version,json=anchorTxVersion,proto3,enum=taprpc.AnchorTxVersion" json:"anchor_tx_version,omitempty"` } func (x *FinalizeBatchRequest) Reset() { @@ -1157,6 +1168,13 @@ func (x *FinalizeBatchRequest) GetBranch() *taprpc.TapBranch { return nil } +func (x *FinalizeBatchRequest) GetAnchorTxVersion() taprpc.AnchorTxVersion { + if x != nil { + return x.AnchorTxVersion + } + return taprpc.AnchorTxVersion(0) +} + type isFinalizeBatchRequest_BatchSibling interface { isFinalizeBatchRequest_BatchSibling() } @@ -1585,269 +1603,279 @@ var File_mintrpc_mint_proto protoreflect.FileDescriptor var file_mintrpc_mint_proto_rawDesc = []byte{ 0x0a, 0x12, 0x6d, 0x69, 0x6e, 0x74, 0x72, 0x70, 0x63, 0x2f, 0x6d, 0x69, 0x6e, 0x74, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x07, 0x6d, 0x69, 0x6e, 0x74, 0x72, 0x70, 0x63, 0x1a, 0x13, 0x74, - 0x61, 0x70, 0x72, 0x6f, 0x6f, 0x74, 0x61, 0x73, 0x73, 0x65, 0x74, 0x73, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x22, 0xee, 0x03, 0x0a, 0x0c, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x41, 0x73, - 0x73, 0x65, 0x74, 0x12, 0x39, 0x0a, 0x0d, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x76, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x74, 0x61, 0x70, - 0x72, 0x70, 0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x52, 0x0c, 0x61, 0x73, 0x73, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x30, - 0x0a, 0x0a, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0e, 0x32, 0x11, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, - 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x09, 0x61, 0x73, 0x73, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, - 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x30, 0x0a, 0x0a, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x6d, 0x65, - 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, - 0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x52, 0x09, 0x61, 0x73, 0x73, - 0x65, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x2a, - 0x0a, 0x11, 0x6e, 0x65, 0x77, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x65, 0x64, 0x5f, 0x61, 0x73, - 0x73, 0x65, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x6e, 0x65, 0x77, 0x47, 0x72, - 0x6f, 0x75, 0x70, 0x65, 0x64, 0x41, 0x73, 0x73, 0x65, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x67, 0x72, - 0x6f, 0x75, 0x70, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x67, - 0x72, 0x6f, 0x75, 0x70, 0x4b, 0x65, 0x79, 0x12, 0x21, 0x0a, 0x0c, 0x67, 0x72, 0x6f, 0x75, 0x70, - 0x5f, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x67, - 0x72, 0x6f, 0x75, 0x70, 0x41, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x12, 0x43, 0x0a, 0x12, 0x67, 0x72, - 0x6f, 0x75, 0x70, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x6b, 0x65, 0x79, - 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, - 0x4b, 0x65, 0x79, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x52, 0x10, 0x67, - 0x72, 0x6f, 0x75, 0x70, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x4b, 0x65, 0x79, 0x12, - 0x30, 0x0a, 0x14, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x74, 0x61, 0x70, 0x73, 0x63, 0x72, 0x69, - 0x70, 0x74, 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x12, 0x67, - 0x72, 0x6f, 0x75, 0x70, 0x54, 0x61, 0x70, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x52, 0x6f, 0x6f, - 0x74, 0x12, 0x30, 0x0a, 0x0a, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x18, - 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x53, - 0x63, 0x72, 0x69, 0x70, 0x74, 0x4b, 0x65, 0x79, 0x52, 0x09, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, - 0x4b, 0x65, 0x79, 0x22, 0xf1, 0x01, 0x0a, 0x0d, 0x55, 0x6e, 0x73, 0x65, 0x61, 0x6c, 0x65, 0x64, - 0x41, 0x73, 0x73, 0x65, 0x74, 0x12, 0x2b, 0x0a, 0x05, 0x61, 0x73, 0x73, 0x65, 0x74, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x6d, 0x69, 0x6e, 0x74, 0x72, 0x70, 0x63, 0x2e, 0x50, - 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x05, 0x61, 0x73, 0x73, - 0x65, 0x74, 0x12, 0x43, 0x0a, 0x11, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6b, 0x65, 0x79, 0x5f, - 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, - 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4b, 0x65, 0x79, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x0f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x4b, 0x65, 0x79, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x40, 0x0a, 0x10, 0x67, 0x72, 0x6f, 0x75, 0x70, - 0x5f, 0x76, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x5f, 0x74, 0x78, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x16, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x47, 0x72, 0x6f, 0x75, 0x70, - 0x56, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x54, 0x78, 0x52, 0x0e, 0x67, 0x72, 0x6f, 0x75, 0x70, - 0x56, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x54, 0x78, 0x12, 0x2c, 0x0a, 0x12, 0x67, 0x72, 0x6f, - 0x75, 0x70, 0x5f, 0x76, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x5f, 0x70, 0x73, 0x62, 0x74, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x56, 0x69, 0x72, 0x74, - 0x75, 0x61, 0x6c, 0x50, 0x73, 0x62, 0x74, 0x22, 0xb8, 0x05, 0x0a, 0x09, 0x4d, 0x69, 0x6e, 0x74, - 0x41, 0x73, 0x73, 0x65, 0x74, 0x12, 0x39, 0x0a, 0x0d, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x76, - 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x74, - 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, - 0x6f, 0x6e, 0x52, 0x0c, 0x61, 0x73, 0x73, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x12, 0x30, 0x0a, 0x0a, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0e, 0x32, 0x11, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x73, - 0x73, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x09, 0x61, 0x73, 0x73, 0x65, 0x74, 0x54, 0x79, - 0x70, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x30, 0x0a, 0x0a, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, - 0x6d, 0x65, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x74, 0x61, 0x70, - 0x72, 0x70, 0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x52, 0x09, 0x61, - 0x73, 0x73, 0x65, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x6d, 0x6f, 0x75, - 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, - 0x12, 0x2a, 0x0a, 0x11, 0x6e, 0x65, 0x77, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x65, 0x64, 0x5f, - 0x61, 0x73, 0x73, 0x65, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x6e, 0x65, 0x77, - 0x47, 0x72, 0x6f, 0x75, 0x70, 0x65, 0x64, 0x41, 0x73, 0x73, 0x65, 0x74, 0x12, 0x23, 0x0a, 0x0d, - 0x67, 0x72, 0x6f, 0x75, 0x70, 0x65, 0x64, 0x5f, 0x61, 0x73, 0x73, 0x65, 0x74, 0x18, 0x07, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x0c, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x65, 0x64, 0x41, 0x73, 0x73, 0x65, - 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x08, - 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x4b, 0x65, 0x79, 0x12, 0x21, - 0x0a, 0x0c, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x18, 0x09, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x41, 0x6e, 0x63, 0x68, 0x6f, - 0x72, 0x12, 0x43, 0x0a, 0x12, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, - 0x6e, 0x61, 0x6c, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, - 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4b, 0x65, 0x79, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, - 0x70, 0x74, 0x6f, 0x72, 0x52, 0x10, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x6e, 0x74, 0x65, 0x72, - 0x6e, 0x61, 0x6c, 0x4b, 0x65, 0x79, 0x12, 0x30, 0x0a, 0x14, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, - 0x74, 0x61, 0x70, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x0b, - 0x20, 0x01, 0x28, 0x0c, 0x52, 0x12, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x54, 0x61, 0x70, 0x73, 0x63, - 0x72, 0x69, 0x70, 0x74, 0x52, 0x6f, 0x6f, 0x74, 0x12, 0x30, 0x0a, 0x0a, 0x73, 0x63, 0x72, 0x69, - 0x70, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x74, - 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x4b, 0x65, 0x79, 0x52, - 0x09, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x4b, 0x65, 0x79, 0x12, 0x27, 0x0a, 0x0f, 0x64, 0x65, - 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x5f, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x18, 0x0d, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x0e, 0x64, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x44, 0x69, 0x73, 0x70, - 0x6c, 0x61, 0x79, 0x12, 0x41, 0x0a, 0x12, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, - 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x13, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, - 0x6c, 0x4b, 0x65, 0x79, 0x52, 0x10, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x47, 0x72, - 0x6f, 0x75, 0x70, 0x4b, 0x65, 0x79, 0x12, 0x3a, 0x0a, 0x19, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, - 0x5f, 0x73, 0x75, 0x70, 0x70, 0x6c, 0x79, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, - 0x6e, 0x74, 0x73, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x08, 0x52, 0x17, 0x65, 0x6e, 0x61, 0x62, 0x6c, - 0x65, 0x53, 0x75, 0x70, 0x70, 0x6c, 0x79, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, - 0x74, 0x73, 0x22, 0x63, 0x0a, 0x10, 0x4d, 0x69, 0x6e, 0x74, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x28, 0x0a, 0x05, 0x61, 0x73, 0x73, 0x65, 0x74, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x69, 0x6e, 0x74, 0x72, 0x70, 0x63, 0x2e, - 0x4d, 0x69, 0x6e, 0x74, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x05, 0x61, 0x73, 0x73, 0x65, 0x74, - 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x4f, 0x0a, 0x11, 0x4d, 0x69, 0x6e, 0x74, 0x41, - 0x73, 0x73, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3a, 0x0a, 0x0d, - 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x62, 0x61, 0x74, 0x63, 0x68, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x6d, 0x69, 0x6e, 0x74, 0x72, 0x70, 0x63, 0x2e, 0x4d, 0x69, - 0x6e, 0x74, 0x69, 0x6e, 0x67, 0x42, 0x61, 0x74, 0x63, 0x68, 0x52, 0x0c, 0x70, 0x65, 0x6e, 0x64, - 0x69, 0x6e, 0x67, 0x42, 0x61, 0x74, 0x63, 0x68, 0x22, 0x83, 0x02, 0x0a, 0x0c, 0x4d, 0x69, 0x6e, - 0x74, 0x69, 0x6e, 0x67, 0x42, 0x61, 0x74, 0x63, 0x68, 0x12, 0x1b, 0x0a, 0x09, 0x62, 0x61, 0x74, - 0x63, 0x68, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x62, 0x61, - 0x74, 0x63, 0x68, 0x4b, 0x65, 0x79, 0x12, 0x1d, 0x0a, 0x0a, 0x62, 0x61, 0x74, 0x63, 0x68, 0x5f, - 0x74, 0x78, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x62, 0x61, 0x74, 0x63, - 0x68, 0x54, 0x78, 0x69, 0x64, 0x12, 0x29, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x0e, 0x32, 0x13, 0x2e, 0x6d, 0x69, 0x6e, 0x74, 0x72, 0x70, 0x63, 0x2e, 0x42, - 0x61, 0x74, 0x63, 0x68, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, - 0x12, 0x2d, 0x0a, 0x06, 0x61, 0x73, 0x73, 0x65, 0x74, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x15, 0x2e, 0x6d, 0x69, 0x6e, 0x74, 0x72, 0x70, 0x63, 0x2e, 0x50, 0x65, 0x6e, 0x64, 0x69, - 0x6e, 0x67, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x06, 0x61, 0x73, 0x73, 0x65, 0x74, 0x73, 0x12, - 0x1d, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x1f, - 0x0a, 0x0b, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x68, 0x69, 0x6e, 0x74, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x48, 0x69, 0x6e, 0x74, 0x12, - 0x1d, 0x0a, 0x0a, 0x62, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x70, 0x73, 0x62, 0x74, 0x18, 0x07, 0x20, - 0x01, 0x28, 0x0c, 0x52, 0x09, 0x62, 0x61, 0x74, 0x63, 0x68, 0x50, 0x73, 0x62, 0x74, 0x22, 0x7c, - 0x0a, 0x0c, 0x56, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x65, 0x42, 0x61, 0x74, 0x63, 0x68, 0x12, 0x2b, - 0x0a, 0x05, 0x62, 0x61, 0x74, 0x63, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, - 0x6d, 0x69, 0x6e, 0x74, 0x72, 0x70, 0x63, 0x2e, 0x4d, 0x69, 0x6e, 0x74, 0x69, 0x6e, 0x67, 0x42, - 0x61, 0x74, 0x63, 0x68, 0x52, 0x05, 0x62, 0x61, 0x74, 0x63, 0x68, 0x12, 0x3f, 0x0a, 0x0f, 0x75, - 0x6e, 0x73, 0x65, 0x61, 0x6c, 0x65, 0x64, 0x5f, 0x61, 0x73, 0x73, 0x65, 0x74, 0x73, 0x18, 0x02, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6d, 0x69, 0x6e, 0x74, 0x72, 0x70, 0x63, 0x2e, 0x55, - 0x6e, 0x73, 0x65, 0x61, 0x6c, 0x65, 0x64, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x0e, 0x75, 0x6e, - 0x73, 0x65, 0x61, 0x6c, 0x65, 0x64, 0x41, 0x73, 0x73, 0x65, 0x74, 0x73, 0x22, 0xcc, 0x01, 0x0a, - 0x10, 0x46, 0x75, 0x6e, 0x64, 0x42, 0x61, 0x74, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x07, 0x6d, 0x69, 0x6e, 0x74, 0x72, 0x70, 0x63, 0x1a, 0x0f, 0x74, + 0x61, 0x70, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x13, + 0x74, 0x61, 0x70, 0x72, 0x6f, 0x6f, 0x74, 0x61, 0x73, 0x73, 0x65, 0x74, 0x73, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x22, 0xee, 0x03, 0x0a, 0x0c, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x41, + 0x73, 0x73, 0x65, 0x74, 0x12, 0x39, 0x0a, 0x0d, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x76, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x74, 0x61, + 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x52, 0x0c, 0x61, 0x73, 0x73, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, + 0x30, 0x0a, 0x0a, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x11, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x73, 0x73, + 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x09, 0x61, 0x73, 0x73, 0x65, 0x74, 0x54, 0x79, 0x70, + 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x30, 0x0a, 0x0a, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x6d, + 0x65, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x74, 0x61, 0x70, 0x72, + 0x70, 0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x52, 0x09, 0x61, 0x73, + 0x73, 0x65, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, + 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, + 0x2a, 0x0a, 0x11, 0x6e, 0x65, 0x77, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x65, 0x64, 0x5f, 0x61, + 0x73, 0x73, 0x65, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x6e, 0x65, 0x77, 0x47, + 0x72, 0x6f, 0x75, 0x70, 0x65, 0x64, 0x41, 0x73, 0x73, 0x65, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x67, + 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, + 0x67, 0x72, 0x6f, 0x75, 0x70, 0x4b, 0x65, 0x79, 0x12, 0x21, 0x0a, 0x0c, 0x67, 0x72, 0x6f, 0x75, + 0x70, 0x5f, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, + 0x67, 0x72, 0x6f, 0x75, 0x70, 0x41, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x12, 0x43, 0x0a, 0x12, 0x67, + 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x6b, 0x65, + 0x79, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, + 0x2e, 0x4b, 0x65, 0x79, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x52, 0x10, + 0x67, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x4b, 0x65, 0x79, + 0x12, 0x30, 0x0a, 0x14, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x74, 0x61, 0x70, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x12, + 0x67, 0x72, 0x6f, 0x75, 0x70, 0x54, 0x61, 0x70, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x52, 0x6f, + 0x6f, 0x74, 0x12, 0x30, 0x0a, 0x0a, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x5f, 0x6b, 0x65, 0x79, + 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, + 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x4b, 0x65, 0x79, 0x52, 0x09, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x4b, 0x65, 0x79, 0x22, 0xf1, 0x01, 0x0a, 0x0d, 0x55, 0x6e, 0x73, 0x65, 0x61, 0x6c, 0x65, + 0x64, 0x41, 0x73, 0x73, 0x65, 0x74, 0x12, 0x2b, 0x0a, 0x05, 0x61, 0x73, 0x73, 0x65, 0x74, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x6d, 0x69, 0x6e, 0x74, 0x72, 0x70, 0x63, 0x2e, + 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x05, 0x61, 0x73, + 0x73, 0x65, 0x74, 0x12, 0x43, 0x0a, 0x11, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6b, 0x65, 0x79, + 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, + 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4b, 0x65, 0x79, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x0f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x4b, 0x65, + 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x40, 0x0a, 0x10, 0x67, 0x72, 0x6f, 0x75, + 0x70, 0x5f, 0x76, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x5f, 0x74, 0x78, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x47, 0x72, 0x6f, 0x75, + 0x70, 0x56, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x54, 0x78, 0x52, 0x0e, 0x67, 0x72, 0x6f, 0x75, + 0x70, 0x56, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x54, 0x78, 0x12, 0x2c, 0x0a, 0x12, 0x67, 0x72, + 0x6f, 0x75, 0x70, 0x5f, 0x76, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x5f, 0x70, 0x73, 0x62, 0x74, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x56, 0x69, 0x72, + 0x74, 0x75, 0x61, 0x6c, 0x50, 0x73, 0x62, 0x74, 0x22, 0xb8, 0x05, 0x0a, 0x09, 0x4d, 0x69, 0x6e, + 0x74, 0x41, 0x73, 0x73, 0x65, 0x74, 0x12, 0x39, 0x0a, 0x0d, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, + 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x14, 0x2e, + 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 0x52, 0x0c, 0x61, 0x73, 0x73, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x12, 0x30, 0x0a, 0x0a, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x11, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, + 0x73, 0x73, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x09, 0x61, 0x73, 0x73, 0x65, 0x74, 0x54, + 0x79, 0x70, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x30, 0x0a, 0x0a, 0x61, 0x73, 0x73, 0x65, 0x74, + 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x74, 0x61, + 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x52, 0x09, + 0x61, 0x73, 0x73, 0x65, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x6d, 0x6f, + 0x75, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, + 0x74, 0x12, 0x2a, 0x0a, 0x11, 0x6e, 0x65, 0x77, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x65, 0x64, + 0x5f, 0x61, 0x73, 0x73, 0x65, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x6e, 0x65, + 0x77, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x65, 0x64, 0x41, 0x73, 0x73, 0x65, 0x74, 0x12, 0x23, 0x0a, + 0x0d, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x65, 0x64, 0x5f, 0x61, 0x73, 0x73, 0x65, 0x74, 0x18, 0x07, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x65, 0x64, 0x41, 0x73, 0x73, + 0x65, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6b, 0x65, 0x79, 0x18, + 0x08, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x4b, 0x65, 0x79, 0x12, + 0x21, 0x0a, 0x0c, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x18, + 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x41, 0x6e, 0x63, 0x68, + 0x6f, 0x72, 0x12, 0x43, 0x0a, 0x12, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x69, 0x6e, 0x74, 0x65, + 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, + 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4b, 0x65, 0x79, 0x44, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x6f, 0x72, 0x52, 0x10, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x6e, 0x74, 0x65, + 0x72, 0x6e, 0x61, 0x6c, 0x4b, 0x65, 0x79, 0x12, 0x30, 0x0a, 0x14, 0x67, 0x72, 0x6f, 0x75, 0x70, + 0x5f, 0x74, 0x61, 0x70, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x18, + 0x0b, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x12, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x54, 0x61, 0x70, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x52, 0x6f, 0x6f, 0x74, 0x12, 0x30, 0x0a, 0x0a, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, + 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x4b, 0x65, 0x79, + 0x52, 0x09, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x4b, 0x65, 0x79, 0x12, 0x27, 0x0a, 0x0f, 0x64, + 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x5f, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x18, 0x0d, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0e, 0x64, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x44, 0x69, 0x73, + 0x70, 0x6c, 0x61, 0x79, 0x12, 0x41, 0x0a, 0x12, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, + 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x13, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, + 0x61, 0x6c, 0x4b, 0x65, 0x79, 0x52, 0x10, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x47, + 0x72, 0x6f, 0x75, 0x70, 0x4b, 0x65, 0x79, 0x12, 0x3a, 0x0a, 0x19, 0x65, 0x6e, 0x61, 0x62, 0x6c, + 0x65, 0x5f, 0x73, 0x75, 0x70, 0x70, 0x6c, 0x79, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x08, 0x52, 0x17, 0x65, 0x6e, 0x61, 0x62, + 0x6c, 0x65, 0x53, 0x75, 0x70, 0x70, 0x6c, 0x79, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x22, 0x63, 0x0a, 0x10, 0x4d, 0x69, 0x6e, 0x74, 0x41, 0x73, 0x73, 0x65, 0x74, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x28, 0x0a, 0x05, 0x61, 0x73, 0x73, 0x65, 0x74, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x69, 0x6e, 0x74, 0x72, 0x70, 0x63, + 0x2e, 0x4d, 0x69, 0x6e, 0x74, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x05, 0x61, 0x73, 0x73, 0x65, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x73, 0x68, 0x6f, 0x72, 0x74, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x66, 0x65, 0x65, 0x5f, - 0x72, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x66, 0x65, 0x65, 0x52, - 0x61, 0x74, 0x65, 0x12, 0x38, 0x0a, 0x09, 0x66, 0x75, 0x6c, 0x6c, 0x5f, 0x74, 0x72, 0x65, 0x65, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, - 0x54, 0x61, 0x70, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x46, 0x75, 0x6c, 0x6c, 0x54, 0x72, 0x65, - 0x65, 0x48, 0x00, 0x52, 0x08, 0x66, 0x75, 0x6c, 0x6c, 0x54, 0x72, 0x65, 0x65, 0x12, 0x2b, 0x0a, - 0x06, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, - 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x54, 0x61, 0x70, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, - 0x48, 0x00, 0x52, 0x06, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x42, 0x0f, 0x0a, 0x0d, 0x62, 0x61, - 0x74, 0x63, 0x68, 0x5f, 0x73, 0x69, 0x62, 0x6c, 0x69, 0x6e, 0x67, 0x22, 0x40, 0x0a, 0x11, 0x46, - 0x75, 0x6e, 0x64, 0x42, 0x61, 0x74, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x2b, 0x0a, 0x05, 0x62, 0x61, 0x74, 0x63, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x15, 0x2e, 0x6d, 0x69, 0x6e, 0x74, 0x72, 0x70, 0x63, 0x2e, 0x56, 0x65, 0x72, 0x62, 0x6f, 0x73, - 0x65, 0x42, 0x61, 0x74, 0x63, 0x68, 0x52, 0x05, 0x62, 0x61, 0x74, 0x63, 0x68, 0x22, 0xb5, 0x01, - 0x0a, 0x10, 0x53, 0x65, 0x61, 0x6c, 0x42, 0x61, 0x74, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x6e, 0x73, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x73, 0x68, 0x6f, 0x72, 0x74, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x4f, 0x0a, 0x11, 0x4d, 0x69, 0x6e, 0x74, + 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3a, 0x0a, + 0x0d, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x62, 0x61, 0x74, 0x63, 0x68, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x6d, 0x69, 0x6e, 0x74, 0x72, 0x70, 0x63, 0x2e, 0x4d, + 0x69, 0x6e, 0x74, 0x69, 0x6e, 0x67, 0x42, 0x61, 0x74, 0x63, 0x68, 0x52, 0x0c, 0x70, 0x65, 0x6e, + 0x64, 0x69, 0x6e, 0x67, 0x42, 0x61, 0x74, 0x63, 0x68, 0x22, 0x83, 0x02, 0x0a, 0x0c, 0x4d, 0x69, + 0x6e, 0x74, 0x69, 0x6e, 0x67, 0x42, 0x61, 0x74, 0x63, 0x68, 0x12, 0x1b, 0x0a, 0x09, 0x62, 0x61, + 0x74, 0x63, 0x68, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x62, + 0x61, 0x74, 0x63, 0x68, 0x4b, 0x65, 0x79, 0x12, 0x1d, 0x0a, 0x0a, 0x62, 0x61, 0x74, 0x63, 0x68, + 0x5f, 0x74, 0x78, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x62, 0x61, 0x74, + 0x63, 0x68, 0x54, 0x78, 0x69, 0x64, 0x12, 0x29, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x13, 0x2e, 0x6d, 0x69, 0x6e, 0x74, 0x72, 0x70, 0x63, 0x2e, + 0x42, 0x61, 0x74, 0x63, 0x68, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, + 0x65, 0x12, 0x2d, 0x0a, 0x06, 0x61, 0x73, 0x73, 0x65, 0x74, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x15, 0x2e, 0x6d, 0x69, 0x6e, 0x74, 0x72, 0x70, 0x63, 0x2e, 0x50, 0x65, 0x6e, 0x64, + 0x69, 0x6e, 0x67, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x06, 0x61, 0x73, 0x73, 0x65, 0x74, 0x73, + 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, + 0x1f, 0x0a, 0x0b, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x68, 0x69, 0x6e, 0x74, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x48, 0x69, 0x6e, 0x74, + 0x12, 0x1d, 0x0a, 0x0a, 0x62, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x70, 0x73, 0x62, 0x74, 0x18, 0x07, + 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x62, 0x61, 0x74, 0x63, 0x68, 0x50, 0x73, 0x62, 0x74, 0x22, + 0x7c, 0x0a, 0x0c, 0x56, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x65, 0x42, 0x61, 0x74, 0x63, 0x68, 0x12, + 0x2b, 0x0a, 0x05, 0x62, 0x61, 0x74, 0x63, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, + 0x2e, 0x6d, 0x69, 0x6e, 0x74, 0x72, 0x70, 0x63, 0x2e, 0x4d, 0x69, 0x6e, 0x74, 0x69, 0x6e, 0x67, + 0x42, 0x61, 0x74, 0x63, 0x68, 0x52, 0x05, 0x62, 0x61, 0x74, 0x63, 0x68, 0x12, 0x3f, 0x0a, 0x0f, + 0x75, 0x6e, 0x73, 0x65, 0x61, 0x6c, 0x65, 0x64, 0x5f, 0x61, 0x73, 0x73, 0x65, 0x74, 0x73, 0x18, + 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6d, 0x69, 0x6e, 0x74, 0x72, 0x70, 0x63, 0x2e, + 0x55, 0x6e, 0x73, 0x65, 0x61, 0x6c, 0x65, 0x64, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x0e, 0x75, + 0x6e, 0x73, 0x65, 0x61, 0x6c, 0x65, 0x64, 0x41, 0x73, 0x73, 0x65, 0x74, 0x73, 0x22, 0x91, 0x02, + 0x0a, 0x10, 0x46, 0x75, 0x6e, 0x64, 0x42, 0x61, 0x74, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x73, 0x68, 0x6f, 0x72, - 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3d, 0x0a, 0x0f, 0x67, 0x72, 0x6f, - 0x75, 0x70, 0x5f, 0x77, 0x69, 0x74, 0x6e, 0x65, 0x73, 0x73, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x47, 0x72, 0x6f, 0x75, - 0x70, 0x57, 0x69, 0x74, 0x6e, 0x65, 0x73, 0x73, 0x52, 0x0e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x57, - 0x69, 0x74, 0x6e, 0x65, 0x73, 0x73, 0x65, 0x73, 0x12, 0x3b, 0x0a, 0x1a, 0x73, 0x69, 0x67, 0x6e, - 0x65, 0x64, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x76, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, - 0x5f, 0x70, 0x73, 0x62, 0x74, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x17, 0x73, 0x69, - 0x67, 0x6e, 0x65, 0x64, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x56, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, - 0x50, 0x73, 0x62, 0x74, 0x73, 0x22, 0x40, 0x0a, 0x11, 0x53, 0x65, 0x61, 0x6c, 0x42, 0x61, 0x74, - 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2b, 0x0a, 0x05, 0x62, 0x61, - 0x74, 0x63, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x6d, 0x69, 0x6e, 0x74, - 0x72, 0x70, 0x63, 0x2e, 0x4d, 0x69, 0x6e, 0x74, 0x69, 0x6e, 0x67, 0x42, 0x61, 0x74, 0x63, 0x68, - 0x52, 0x05, 0x62, 0x61, 0x74, 0x63, 0x68, 0x22, 0xd0, 0x01, 0x0a, 0x14, 0x46, 0x69, 0x6e, 0x61, - 0x6c, 0x69, 0x7a, 0x65, 0x42, 0x61, 0x74, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x66, 0x65, 0x65, 0x5f, 0x72, - 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x66, 0x65, 0x65, 0x52, 0x61, - 0x74, 0x65, 0x12, 0x38, 0x0a, 0x09, 0x66, 0x75, 0x6c, 0x6c, 0x5f, 0x74, 0x72, 0x65, 0x65, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x54, - 0x61, 0x70, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x46, 0x75, 0x6c, 0x6c, 0x54, 0x72, 0x65, 0x65, - 0x48, 0x00, 0x52, 0x08, 0x66, 0x75, 0x6c, 0x6c, 0x54, 0x72, 0x65, 0x65, 0x12, 0x2b, 0x0a, 0x06, - 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x74, - 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x54, 0x61, 0x70, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x48, - 0x00, 0x52, 0x06, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x42, 0x0f, 0x0a, 0x0d, 0x62, 0x61, 0x74, - 0x63, 0x68, 0x5f, 0x73, 0x69, 0x62, 0x6c, 0x69, 0x6e, 0x67, 0x22, 0x44, 0x0a, 0x15, 0x46, 0x69, - 0x6e, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x42, 0x61, 0x74, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x2b, 0x0a, 0x05, 0x62, 0x61, 0x74, 0x63, 0x68, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x6d, 0x69, 0x6e, 0x74, 0x72, 0x70, 0x63, 0x2e, 0x4d, 0x69, 0x6e, - 0x74, 0x69, 0x6e, 0x67, 0x42, 0x61, 0x74, 0x63, 0x68, 0x52, 0x05, 0x62, 0x61, 0x74, 0x63, 0x68, - 0x22, 0x14, 0x0a, 0x12, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x42, 0x61, 0x74, 0x63, 0x68, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x32, 0x0a, 0x13, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, - 0x42, 0x61, 0x74, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1b, 0x0a, - 0x09, 0x62, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, - 0x52, 0x08, 0x62, 0x61, 0x74, 0x63, 0x68, 0x4b, 0x65, 0x79, 0x22, 0x7b, 0x0a, 0x10, 0x4c, 0x69, - 0x73, 0x74, 0x42, 0x61, 0x74, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, - 0x0a, 0x09, 0x62, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0c, 0x48, 0x00, 0x52, 0x08, 0x62, 0x61, 0x74, 0x63, 0x68, 0x4b, 0x65, 0x79, 0x12, 0x24, 0x0a, - 0x0d, 0x62, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x73, 0x74, 0x72, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0b, 0x62, 0x61, 0x74, 0x63, 0x68, 0x4b, 0x65, 0x79, - 0x53, 0x74, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x65, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x76, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x65, 0x42, 0x08, 0x0a, - 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x22, 0x44, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x42, - 0x61, 0x74, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2f, 0x0a, 0x07, - 0x62, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, - 0x6d, 0x69, 0x6e, 0x74, 0x72, 0x70, 0x63, 0x2e, 0x56, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x65, 0x42, - 0x61, 0x74, 0x63, 0x68, 0x52, 0x07, 0x62, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x22, 0x43, 0x0a, - 0x1a, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x4d, 0x69, 0x6e, 0x74, 0x45, 0x76, - 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x73, - 0x68, 0x6f, 0x72, 0x74, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x0d, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0xa2, 0x01, 0x0a, 0x09, 0x4d, 0x69, 0x6e, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, - 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x34, - 0x0a, 0x0b, 0x62, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0e, 0x32, 0x13, 0x2e, 0x6d, 0x69, 0x6e, 0x74, 0x72, 0x70, 0x63, 0x2e, 0x42, 0x61, - 0x74, 0x63, 0x68, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x0a, 0x62, 0x61, 0x74, 0x63, 0x68, 0x53, - 0x74, 0x61, 0x74, 0x65, 0x12, 0x2b, 0x0a, 0x05, 0x62, 0x61, 0x74, 0x63, 0x68, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x6d, 0x69, 0x6e, 0x74, 0x72, 0x70, 0x63, 0x2e, 0x4d, 0x69, - 0x6e, 0x74, 0x69, 0x6e, 0x67, 0x42, 0x61, 0x74, 0x63, 0x68, 0x52, 0x05, 0x62, 0x61, 0x74, 0x63, - 0x68, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x2a, 0x88, 0x02, 0x0a, 0x0a, 0x42, 0x61, 0x74, 0x63, - 0x68, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x17, 0x0a, 0x13, 0x42, 0x41, 0x54, 0x43, 0x48, 0x5f, - 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, - 0x17, 0x0a, 0x13, 0x42, 0x41, 0x54, 0x43, 0x48, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x50, - 0x45, 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x16, 0x0a, 0x12, 0x42, 0x41, 0x54, 0x43, - 0x48, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x46, 0x52, 0x4f, 0x5a, 0x45, 0x4e, 0x10, 0x02, - 0x12, 0x19, 0x0a, 0x15, 0x42, 0x41, 0x54, 0x43, 0x48, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, - 0x43, 0x4f, 0x4d, 0x4d, 0x49, 0x54, 0x54, 0x45, 0x44, 0x10, 0x03, 0x12, 0x19, 0x0a, 0x15, 0x42, - 0x41, 0x54, 0x43, 0x48, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x42, 0x52, 0x4f, 0x41, 0x44, - 0x43, 0x41, 0x53, 0x54, 0x10, 0x04, 0x12, 0x19, 0x0a, 0x15, 0x42, 0x41, 0x54, 0x43, 0x48, 0x5f, - 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x52, 0x4d, 0x45, 0x44, 0x10, - 0x05, 0x12, 0x19, 0x0a, 0x15, 0x42, 0x41, 0x54, 0x43, 0x48, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, - 0x5f, 0x46, 0x49, 0x4e, 0x41, 0x4c, 0x49, 0x5a, 0x45, 0x44, 0x10, 0x06, 0x12, 0x22, 0x0a, 0x1e, - 0x42, 0x41, 0x54, 0x43, 0x48, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x53, 0x45, 0x45, 0x44, - 0x4c, 0x49, 0x4e, 0x47, 0x5f, 0x43, 0x41, 0x4e, 0x43, 0x45, 0x4c, 0x4c, 0x45, 0x44, 0x10, 0x07, - 0x12, 0x20, 0x0a, 0x1c, 0x42, 0x41, 0x54, 0x43, 0x48, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, - 0x53, 0x50, 0x52, 0x4f, 0x55, 0x54, 0x5f, 0x43, 0x41, 0x4e, 0x43, 0x45, 0x4c, 0x4c, 0x45, 0x44, - 0x10, 0x08, 0x32, 0x84, 0x04, 0x0a, 0x04, 0x4d, 0x69, 0x6e, 0x74, 0x12, 0x42, 0x0a, 0x09, 0x4d, - 0x69, 0x6e, 0x74, 0x41, 0x73, 0x73, 0x65, 0x74, 0x12, 0x19, 0x2e, 0x6d, 0x69, 0x6e, 0x74, 0x72, - 0x70, 0x63, 0x2e, 0x4d, 0x69, 0x6e, 0x74, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x6d, 0x69, 0x6e, 0x74, 0x72, 0x70, 0x63, 0x2e, 0x4d, 0x69, - 0x6e, 0x74, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x42, 0x0a, 0x09, 0x46, 0x75, 0x6e, 0x64, 0x42, 0x61, 0x74, 0x63, 0x68, 0x12, 0x19, 0x2e, 0x6d, - 0x69, 0x6e, 0x74, 0x72, 0x70, 0x63, 0x2e, 0x46, 0x75, 0x6e, 0x64, 0x42, 0x61, 0x74, 0x63, 0x68, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x6d, 0x69, 0x6e, 0x74, 0x72, 0x70, - 0x63, 0x2e, 0x46, 0x75, 0x6e, 0x64, 0x42, 0x61, 0x74, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x42, 0x0a, 0x09, 0x53, 0x65, 0x61, 0x6c, 0x42, 0x61, 0x74, 0x63, 0x68, - 0x12, 0x19, 0x2e, 0x6d, 0x69, 0x6e, 0x74, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x65, 0x61, 0x6c, 0x42, - 0x61, 0x74, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x6d, 0x69, + 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x66, 0x65, 0x65, + 0x5f, 0x72, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x66, 0x65, 0x65, + 0x52, 0x61, 0x74, 0x65, 0x12, 0x38, 0x0a, 0x09, 0x66, 0x75, 0x6c, 0x6c, 0x5f, 0x74, 0x72, 0x65, + 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, + 0x2e, 0x54, 0x61, 0x70, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x46, 0x75, 0x6c, 0x6c, 0x54, 0x72, + 0x65, 0x65, 0x48, 0x00, 0x52, 0x08, 0x66, 0x75, 0x6c, 0x6c, 0x54, 0x72, 0x65, 0x65, 0x12, 0x2b, + 0x0a, 0x06, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, + 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x54, 0x61, 0x70, 0x42, 0x72, 0x61, 0x6e, 0x63, + 0x68, 0x48, 0x00, 0x52, 0x06, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x12, 0x43, 0x0a, 0x11, 0x61, + 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x5f, 0x74, 0x78, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, + 0x41, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x54, 0x78, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, + 0x0f, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x54, 0x78, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x42, 0x0f, 0x0a, 0x0d, 0x62, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x73, 0x69, 0x62, 0x6c, 0x69, 0x6e, + 0x67, 0x22, 0x40, 0x0a, 0x11, 0x46, 0x75, 0x6e, 0x64, 0x42, 0x61, 0x74, 0x63, 0x68, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2b, 0x0a, 0x05, 0x62, 0x61, 0x74, 0x63, 0x68, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x6d, 0x69, 0x6e, 0x74, 0x72, 0x70, 0x63, 0x2e, + 0x56, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x65, 0x42, 0x61, 0x74, 0x63, 0x68, 0x52, 0x05, 0x62, 0x61, + 0x74, 0x63, 0x68, 0x22, 0xb5, 0x01, 0x0a, 0x10, 0x53, 0x65, 0x61, 0x6c, 0x42, 0x61, 0x74, 0x63, + 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x68, 0x6f, 0x72, + 0x74, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x0d, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x3d, 0x0a, 0x0f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x77, 0x69, 0x74, 0x6e, 0x65, 0x73, 0x73, + 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, + 0x63, 0x2e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x57, 0x69, 0x74, 0x6e, 0x65, 0x73, 0x73, 0x52, 0x0e, + 0x67, 0x72, 0x6f, 0x75, 0x70, 0x57, 0x69, 0x74, 0x6e, 0x65, 0x73, 0x73, 0x65, 0x73, 0x12, 0x3b, + 0x0a, 0x1a, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x76, + 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x5f, 0x70, 0x73, 0x62, 0x74, 0x73, 0x18, 0x03, 0x20, 0x03, + 0x28, 0x09, 0x52, 0x17, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x56, + 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x50, 0x73, 0x62, 0x74, 0x73, 0x22, 0x40, 0x0a, 0x11, 0x53, + 0x65, 0x61, 0x6c, 0x42, 0x61, 0x74, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x2b, 0x0a, 0x05, 0x62, 0x61, 0x74, 0x63, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x15, 0x2e, 0x6d, 0x69, 0x6e, 0x74, 0x72, 0x70, 0x63, 0x2e, 0x4d, 0x69, 0x6e, 0x74, 0x69, 0x6e, + 0x67, 0x42, 0x61, 0x74, 0x63, 0x68, 0x52, 0x05, 0x62, 0x61, 0x74, 0x63, 0x68, 0x22, 0x95, 0x02, + 0x0a, 0x14, 0x46, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x42, 0x61, 0x74, 0x63, 0x68, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x5f, + 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, + 0x73, 0x68, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x19, 0x0a, + 0x08, 0x66, 0x65, 0x65, 0x5f, 0x72, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x07, 0x66, 0x65, 0x65, 0x52, 0x61, 0x74, 0x65, 0x12, 0x38, 0x0a, 0x09, 0x66, 0x75, 0x6c, 0x6c, + 0x5f, 0x74, 0x72, 0x65, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x74, 0x61, + 0x70, 0x72, 0x70, 0x63, 0x2e, 0x54, 0x61, 0x70, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x46, 0x75, + 0x6c, 0x6c, 0x54, 0x72, 0x65, 0x65, 0x48, 0x00, 0x52, 0x08, 0x66, 0x75, 0x6c, 0x6c, 0x54, 0x72, + 0x65, 0x65, 0x12, 0x2b, 0x0a, 0x06, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x54, 0x61, 0x70, 0x42, + 0x72, 0x61, 0x6e, 0x63, 0x68, 0x48, 0x00, 0x52, 0x06, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x12, + 0x43, 0x0a, 0x11, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x5f, 0x74, 0x78, 0x5f, 0x76, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x74, 0x61, 0x70, + 0x72, 0x70, 0x63, 0x2e, 0x41, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x54, 0x78, 0x56, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 0x52, 0x0f, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x54, 0x78, 0x56, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x42, 0x0f, 0x0a, 0x0d, 0x62, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x73, 0x69, + 0x62, 0x6c, 0x69, 0x6e, 0x67, 0x22, 0x44, 0x0a, 0x15, 0x46, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x7a, + 0x65, 0x42, 0x61, 0x74, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2b, + 0x0a, 0x05, 0x62, 0x61, 0x74, 0x63, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, + 0x6d, 0x69, 0x6e, 0x74, 0x72, 0x70, 0x63, 0x2e, 0x4d, 0x69, 0x6e, 0x74, 0x69, 0x6e, 0x67, 0x42, + 0x61, 0x74, 0x63, 0x68, 0x52, 0x05, 0x62, 0x61, 0x74, 0x63, 0x68, 0x22, 0x14, 0x0a, 0x12, 0x43, + 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x42, 0x61, 0x74, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x22, 0x32, 0x0a, 0x13, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x42, 0x61, 0x74, 0x63, 0x68, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x62, 0x61, 0x74, 0x63, + 0x68, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x62, 0x61, 0x74, + 0x63, 0x68, 0x4b, 0x65, 0x79, 0x22, 0x7b, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x61, 0x74, + 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x09, 0x62, 0x61, 0x74, + 0x63, 0x68, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, 0x08, + 0x62, 0x61, 0x74, 0x63, 0x68, 0x4b, 0x65, 0x79, 0x12, 0x24, 0x0a, 0x0d, 0x62, 0x61, 0x74, 0x63, + 0x68, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x73, 0x74, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, + 0x00, 0x52, 0x0b, 0x62, 0x61, 0x74, 0x63, 0x68, 0x4b, 0x65, 0x79, 0x53, 0x74, 0x72, 0x12, 0x18, + 0x0a, 0x07, 0x76, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x07, 0x76, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x65, 0x42, 0x08, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, + 0x65, 0x72, 0x22, 0x44, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x61, 0x74, 0x63, 0x68, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2f, 0x0a, 0x07, 0x62, 0x61, 0x74, 0x63, 0x68, + 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x6d, 0x69, 0x6e, 0x74, 0x72, + 0x70, 0x63, 0x2e, 0x56, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x65, 0x42, 0x61, 0x74, 0x63, 0x68, 0x52, + 0x07, 0x62, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x22, 0x43, 0x0a, 0x1a, 0x53, 0x75, 0x62, 0x73, + 0x63, 0x72, 0x69, 0x62, 0x65, 0x4d, 0x69, 0x6e, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x5f, + 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, + 0x73, 0x68, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xa2, 0x01, + 0x0a, 0x09, 0x4d, 0x69, 0x6e, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x74, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, + 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x34, 0x0a, 0x0b, 0x62, 0x61, 0x74, + 0x63, 0x68, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x13, + 0x2e, 0x6d, 0x69, 0x6e, 0x74, 0x72, 0x70, 0x63, 0x2e, 0x42, 0x61, 0x74, 0x63, 0x68, 0x53, 0x74, + 0x61, 0x74, 0x65, 0x52, 0x0a, 0x62, 0x61, 0x74, 0x63, 0x68, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, + 0x2b, 0x0a, 0x05, 0x62, 0x61, 0x74, 0x63, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, + 0x2e, 0x6d, 0x69, 0x6e, 0x74, 0x72, 0x70, 0x63, 0x2e, 0x4d, 0x69, 0x6e, 0x74, 0x69, 0x6e, 0x67, + 0x42, 0x61, 0x74, 0x63, 0x68, 0x52, 0x05, 0x62, 0x61, 0x74, 0x63, 0x68, 0x12, 0x14, 0x0a, 0x05, + 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, + 0x6f, 0x72, 0x2a, 0x88, 0x02, 0x0a, 0x0a, 0x42, 0x61, 0x74, 0x63, 0x68, 0x53, 0x74, 0x61, 0x74, + 0x65, 0x12, 0x17, 0x0a, 0x13, 0x42, 0x41, 0x54, 0x43, 0x48, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, + 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x17, 0x0a, 0x13, 0x42, 0x41, + 0x54, 0x43, 0x48, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x50, 0x45, 0x4e, 0x44, 0x49, 0x4e, + 0x47, 0x10, 0x01, 0x12, 0x16, 0x0a, 0x12, 0x42, 0x41, 0x54, 0x43, 0x48, 0x5f, 0x53, 0x54, 0x41, + 0x54, 0x45, 0x5f, 0x46, 0x52, 0x4f, 0x5a, 0x45, 0x4e, 0x10, 0x02, 0x12, 0x19, 0x0a, 0x15, 0x42, + 0x41, 0x54, 0x43, 0x48, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x43, 0x4f, 0x4d, 0x4d, 0x49, + 0x54, 0x54, 0x45, 0x44, 0x10, 0x03, 0x12, 0x19, 0x0a, 0x15, 0x42, 0x41, 0x54, 0x43, 0x48, 0x5f, + 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x42, 0x52, 0x4f, 0x41, 0x44, 0x43, 0x41, 0x53, 0x54, 0x10, + 0x04, 0x12, 0x19, 0x0a, 0x15, 0x42, 0x41, 0x54, 0x43, 0x48, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, + 0x5f, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x52, 0x4d, 0x45, 0x44, 0x10, 0x05, 0x12, 0x19, 0x0a, 0x15, + 0x42, 0x41, 0x54, 0x43, 0x48, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x46, 0x49, 0x4e, 0x41, + 0x4c, 0x49, 0x5a, 0x45, 0x44, 0x10, 0x06, 0x12, 0x22, 0x0a, 0x1e, 0x42, 0x41, 0x54, 0x43, 0x48, + 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x53, 0x45, 0x45, 0x44, 0x4c, 0x49, 0x4e, 0x47, 0x5f, + 0x43, 0x41, 0x4e, 0x43, 0x45, 0x4c, 0x4c, 0x45, 0x44, 0x10, 0x07, 0x12, 0x20, 0x0a, 0x1c, 0x42, + 0x41, 0x54, 0x43, 0x48, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x53, 0x50, 0x52, 0x4f, 0x55, + 0x54, 0x5f, 0x43, 0x41, 0x4e, 0x43, 0x45, 0x4c, 0x4c, 0x45, 0x44, 0x10, 0x08, 0x32, 0x84, 0x04, + 0x0a, 0x04, 0x4d, 0x69, 0x6e, 0x74, 0x12, 0x42, 0x0a, 0x09, 0x4d, 0x69, 0x6e, 0x74, 0x41, 0x73, + 0x73, 0x65, 0x74, 0x12, 0x19, 0x2e, 0x6d, 0x69, 0x6e, 0x74, 0x72, 0x70, 0x63, 0x2e, 0x4d, 0x69, + 0x6e, 0x74, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, + 0x2e, 0x6d, 0x69, 0x6e, 0x74, 0x72, 0x70, 0x63, 0x2e, 0x4d, 0x69, 0x6e, 0x74, 0x41, 0x73, 0x73, + 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x42, 0x0a, 0x09, 0x46, 0x75, + 0x6e, 0x64, 0x42, 0x61, 0x74, 0x63, 0x68, 0x12, 0x19, 0x2e, 0x6d, 0x69, 0x6e, 0x74, 0x72, 0x70, + 0x63, 0x2e, 0x46, 0x75, 0x6e, 0x64, 0x42, 0x61, 0x74, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x6d, 0x69, 0x6e, 0x74, 0x72, 0x70, 0x63, 0x2e, 0x46, 0x75, 0x6e, + 0x64, 0x42, 0x61, 0x74, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x42, + 0x0a, 0x09, 0x53, 0x65, 0x61, 0x6c, 0x42, 0x61, 0x74, 0x63, 0x68, 0x12, 0x19, 0x2e, 0x6d, 0x69, 0x6e, 0x74, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x65, 0x61, 0x6c, 0x42, 0x61, 0x74, 0x63, 0x68, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4e, 0x0a, 0x0d, 0x46, 0x69, 0x6e, 0x61, 0x6c, - 0x69, 0x7a, 0x65, 0x42, 0x61, 0x74, 0x63, 0x68, 0x12, 0x1d, 0x2e, 0x6d, 0x69, 0x6e, 0x74, 0x72, - 0x70, 0x63, 0x2e, 0x46, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x42, 0x61, 0x74, 0x63, 0x68, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6d, 0x69, 0x6e, 0x74, 0x72, 0x70, - 0x63, 0x2e, 0x46, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x42, 0x61, 0x74, 0x63, 0x68, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x48, 0x0a, 0x0b, 0x43, 0x61, 0x6e, 0x63, 0x65, - 0x6c, 0x42, 0x61, 0x74, 0x63, 0x68, 0x12, 0x1b, 0x2e, 0x6d, 0x69, 0x6e, 0x74, 0x72, 0x70, 0x63, - 0x2e, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x42, 0x61, 0x74, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x6d, 0x69, 0x6e, 0x74, 0x72, 0x70, 0x63, 0x2e, 0x43, 0x61, - 0x6e, 0x63, 0x65, 0x6c, 0x42, 0x61, 0x74, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x44, 0x0a, 0x0b, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, - 0x12, 0x19, 0x2e, 0x6d, 0x69, 0x6e, 0x74, 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x42, - 0x61, 0x74, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x6d, 0x69, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x6d, 0x69, 0x6e, 0x74, 0x72, 0x70, 0x63, + 0x2e, 0x53, 0x65, 0x61, 0x6c, 0x42, 0x61, 0x74, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x4e, 0x0a, 0x0d, 0x46, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x42, 0x61, + 0x74, 0x63, 0x68, 0x12, 0x1d, 0x2e, 0x6d, 0x69, 0x6e, 0x74, 0x72, 0x70, 0x63, 0x2e, 0x46, 0x69, + 0x6e, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x42, 0x61, 0x74, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6d, 0x69, 0x6e, 0x74, 0x72, 0x70, 0x63, 0x2e, 0x46, 0x69, 0x6e, + 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x42, 0x61, 0x74, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x48, 0x0a, 0x0b, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x42, 0x61, 0x74, 0x63, + 0x68, 0x12, 0x1b, 0x2e, 0x6d, 0x69, 0x6e, 0x74, 0x72, 0x70, 0x63, 0x2e, 0x43, 0x61, 0x6e, 0x63, + 0x65, 0x6c, 0x42, 0x61, 0x74, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, + 0x2e, 0x6d, 0x69, 0x6e, 0x74, 0x72, 0x70, 0x63, 0x2e, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x42, + 0x61, 0x74, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x44, 0x0a, 0x0b, + 0x4c, 0x69, 0x73, 0x74, 0x42, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x12, 0x19, 0x2e, 0x6d, 0x69, 0x6e, 0x74, 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x61, 0x74, 0x63, 0x68, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x50, 0x0a, 0x13, 0x53, 0x75, 0x62, 0x73, 0x63, - 0x72, 0x69, 0x62, 0x65, 0x4d, 0x69, 0x6e, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x23, - 0x2e, 0x6d, 0x69, 0x6e, 0x74, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, - 0x62, 0x65, 0x4d, 0x69, 0x6e, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x12, 0x2e, 0x6d, 0x69, 0x6e, 0x74, 0x72, 0x70, 0x63, 0x2e, 0x4d, 0x69, - 0x6e, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x30, 0x01, 0x42, 0x38, 0x5a, 0x36, 0x67, 0x69, 0x74, - 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x6e, 0x69, 0x6e, - 0x67, 0x6c, 0x61, 0x62, 0x73, 0x2f, 0x74, 0x61, 0x70, 0x72, 0x6f, 0x6f, 0x74, 0x2d, 0x61, 0x73, - 0x73, 0x65, 0x74, 0x73, 0x2f, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2f, 0x6d, 0x69, 0x6e, 0x74, - 0x72, 0x70, 0x63, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x6d, 0x69, 0x6e, 0x74, 0x72, 0x70, 0x63, + 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x61, 0x74, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x50, 0x0a, 0x13, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x4d, + 0x69, 0x6e, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x23, 0x2e, 0x6d, 0x69, 0x6e, 0x74, + 0x72, 0x70, 0x63, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x4d, 0x69, 0x6e, + 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x12, + 0x2e, 0x6d, 0x69, 0x6e, 0x74, 0x72, 0x70, 0x63, 0x2e, 0x4d, 0x69, 0x6e, 0x74, 0x45, 0x76, 0x65, + 0x6e, 0x74, 0x30, 0x01, 0x42, 0x38, 0x5a, 0x36, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, + 0x6f, 0x6d, 0x2f, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x6e, 0x69, 0x6e, 0x67, 0x6c, 0x61, 0x62, 0x73, + 0x2f, 0x74, 0x61, 0x70, 0x72, 0x6f, 0x6f, 0x74, 0x2d, 0x61, 0x73, 0x73, 0x65, 0x74, 0x73, 0x2f, + 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2f, 0x6d, 0x69, 0x6e, 0x74, 0x72, 0x70, 0x63, 0x62, 0x06, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -1895,7 +1923,8 @@ var file_mintrpc_mint_proto_goTypes = []any{ (*taprpc.ExternalKey)(nil), // 27: taprpc.ExternalKey (*taprpc.TapscriptFullTree)(nil), // 28: taprpc.TapscriptFullTree (*taprpc.TapBranch)(nil), // 29: taprpc.TapBranch - (*taprpc.GroupWitness)(nil), // 30: taprpc.GroupWitness + (taprpc.AnchorTxVersion)(0), // 30: taprpc.AnchorTxVersion + (*taprpc.GroupWitness)(nil), // 31: taprpc.GroupWitness } var file_mintrpc_mint_proto_depIdxs = []int32{ 20, // 0: mintrpc.PendingAsset.asset_version:type_name -> taprpc.AssetVersion @@ -1920,34 +1949,36 @@ var file_mintrpc_mint_proto_depIdxs = []int32{ 2, // 19: mintrpc.VerboseBatch.unsealed_assets:type_name -> mintrpc.UnsealedAsset 28, // 20: mintrpc.FundBatchRequest.full_tree:type_name -> taprpc.TapscriptFullTree 29, // 21: mintrpc.FundBatchRequest.branch:type_name -> taprpc.TapBranch - 7, // 22: mintrpc.FundBatchResponse.batch:type_name -> mintrpc.VerboseBatch - 30, // 23: mintrpc.SealBatchRequest.group_witnesses:type_name -> taprpc.GroupWitness - 6, // 24: mintrpc.SealBatchResponse.batch:type_name -> mintrpc.MintingBatch - 28, // 25: mintrpc.FinalizeBatchRequest.full_tree:type_name -> taprpc.TapscriptFullTree - 29, // 26: mintrpc.FinalizeBatchRequest.branch:type_name -> taprpc.TapBranch - 6, // 27: mintrpc.FinalizeBatchResponse.batch:type_name -> mintrpc.MintingBatch - 7, // 28: mintrpc.ListBatchResponse.batches:type_name -> mintrpc.VerboseBatch - 0, // 29: mintrpc.MintEvent.batch_state:type_name -> mintrpc.BatchState - 6, // 30: mintrpc.MintEvent.batch:type_name -> mintrpc.MintingBatch - 4, // 31: mintrpc.Mint.MintAsset:input_type -> mintrpc.MintAssetRequest - 8, // 32: mintrpc.Mint.FundBatch:input_type -> mintrpc.FundBatchRequest - 10, // 33: mintrpc.Mint.SealBatch:input_type -> mintrpc.SealBatchRequest - 12, // 34: mintrpc.Mint.FinalizeBatch:input_type -> mintrpc.FinalizeBatchRequest - 14, // 35: mintrpc.Mint.CancelBatch:input_type -> mintrpc.CancelBatchRequest - 16, // 36: mintrpc.Mint.ListBatches:input_type -> mintrpc.ListBatchRequest - 18, // 37: mintrpc.Mint.SubscribeMintEvents:input_type -> mintrpc.SubscribeMintEventsRequest - 5, // 38: mintrpc.Mint.MintAsset:output_type -> mintrpc.MintAssetResponse - 9, // 39: mintrpc.Mint.FundBatch:output_type -> mintrpc.FundBatchResponse - 11, // 40: mintrpc.Mint.SealBatch:output_type -> mintrpc.SealBatchResponse - 13, // 41: mintrpc.Mint.FinalizeBatch:output_type -> mintrpc.FinalizeBatchResponse - 15, // 42: mintrpc.Mint.CancelBatch:output_type -> mintrpc.CancelBatchResponse - 17, // 43: mintrpc.Mint.ListBatches:output_type -> mintrpc.ListBatchResponse - 19, // 44: mintrpc.Mint.SubscribeMintEvents:output_type -> mintrpc.MintEvent - 38, // [38:45] is the sub-list for method output_type - 31, // [31:38] is the sub-list for method input_type - 31, // [31:31] is the sub-list for extension type_name - 31, // [31:31] is the sub-list for extension extendee - 0, // [0:31] is the sub-list for field type_name + 30, // 22: mintrpc.FundBatchRequest.anchor_tx_version:type_name -> taprpc.AnchorTxVersion + 7, // 23: mintrpc.FundBatchResponse.batch:type_name -> mintrpc.VerboseBatch + 31, // 24: mintrpc.SealBatchRequest.group_witnesses:type_name -> taprpc.GroupWitness + 6, // 25: mintrpc.SealBatchResponse.batch:type_name -> mintrpc.MintingBatch + 28, // 26: mintrpc.FinalizeBatchRequest.full_tree:type_name -> taprpc.TapscriptFullTree + 29, // 27: mintrpc.FinalizeBatchRequest.branch:type_name -> taprpc.TapBranch + 30, // 28: mintrpc.FinalizeBatchRequest.anchor_tx_version:type_name -> taprpc.AnchorTxVersion + 6, // 29: mintrpc.FinalizeBatchResponse.batch:type_name -> mintrpc.MintingBatch + 7, // 30: mintrpc.ListBatchResponse.batches:type_name -> mintrpc.VerboseBatch + 0, // 31: mintrpc.MintEvent.batch_state:type_name -> mintrpc.BatchState + 6, // 32: mintrpc.MintEvent.batch:type_name -> mintrpc.MintingBatch + 4, // 33: mintrpc.Mint.MintAsset:input_type -> mintrpc.MintAssetRequest + 8, // 34: mintrpc.Mint.FundBatch:input_type -> mintrpc.FundBatchRequest + 10, // 35: mintrpc.Mint.SealBatch:input_type -> mintrpc.SealBatchRequest + 12, // 36: mintrpc.Mint.FinalizeBatch:input_type -> mintrpc.FinalizeBatchRequest + 14, // 37: mintrpc.Mint.CancelBatch:input_type -> mintrpc.CancelBatchRequest + 16, // 38: mintrpc.Mint.ListBatches:input_type -> mintrpc.ListBatchRequest + 18, // 39: mintrpc.Mint.SubscribeMintEvents:input_type -> mintrpc.SubscribeMintEventsRequest + 5, // 40: mintrpc.Mint.MintAsset:output_type -> mintrpc.MintAssetResponse + 9, // 41: mintrpc.Mint.FundBatch:output_type -> mintrpc.FundBatchResponse + 11, // 42: mintrpc.Mint.SealBatch:output_type -> mintrpc.SealBatchResponse + 13, // 43: mintrpc.Mint.FinalizeBatch:output_type -> mintrpc.FinalizeBatchResponse + 15, // 44: mintrpc.Mint.CancelBatch:output_type -> mintrpc.CancelBatchResponse + 17, // 45: mintrpc.Mint.ListBatches:output_type -> mintrpc.ListBatchResponse + 19, // 46: mintrpc.Mint.SubscribeMintEvents:output_type -> mintrpc.MintEvent + 40, // [40:47] is the sub-list for method output_type + 33, // [33:40] is the sub-list for method input_type + 33, // [33:33] is the sub-list for extension type_name + 33, // [33:33] is the sub-list for extension extendee + 0, // [0:33] is the sub-list for field type_name } func init() { file_mintrpc_mint_proto_init() } diff --git a/taprpc/mintrpc/mint.proto b/taprpc/mintrpc/mint.proto index 3268e93ef1..30c3b423fd 100644 --- a/taprpc/mintrpc/mint.proto +++ b/taprpc/mintrpc/mint.proto @@ -1,5 +1,6 @@ syntax = "proto3"; +import "tapcommon.proto"; import "taprootassets.proto"; package mintrpc; @@ -333,6 +334,9 @@ message FundBatchRequest { // A TapBranch that represents a Tapscript tree managed externally. taprpc.TapBranch branch = 4; } + + // The version to use when creating a new mint anchor transaction. + taprpc.AnchorTxVersion anchor_tx_version = 5; } message FundBatchResponse { @@ -390,6 +394,9 @@ message FinalizeBatchRequest { // A TapBranch that represents a Tapscript tree managed externally. taprpc.TapBranch branch = 4; } + + // The version to use when creating a new mint anchor transaction. + taprpc.AnchorTxVersion anchor_tx_version = 5; } message FinalizeBatchResponse { diff --git a/taprpc/mintrpc/mint.swagger.json b/taprpc/mintrpc/mint.swagger.json index ecce068da6..bf4e83b16f 100644 --- a/taprpc/mintrpc/mint.swagger.json +++ b/taprpc/mintrpc/mint.swagger.json @@ -319,6 +319,10 @@ "branch": { "$ref": "#/definitions/taprpcTapBranch", "description": "A TapBranch that represents a Tapscript tree managed externally." + }, + "anchor_tx_version": { + "$ref": "#/definitions/taprpcAnchorTxVersion", + "description": "The version to use when creating a new mint anchor transaction." } } }, @@ -350,6 +354,10 @@ "branch": { "$ref": "#/definitions/taprpcTapBranch", "description": "A TapBranch that represents a Tapscript tree managed externally." + }, + "anchor_tx_version": { + "$ref": "#/definitions/taprpcAnchorTxVersion", + "description": "The version to use when creating a new mint anchor transaction." } } }, @@ -688,6 +696,16 @@ } } }, + "taprpcAnchorTxVersion": { + "type": "string", + "enum": [ + "ANCHOR_TX_VERSION_UNSPECIFIED", + "ANCHOR_TX_VERSION_V2", + "ANCHOR_TX_VERSION_V3" + ], + "default": "ANCHOR_TX_VERSION_UNSPECIFIED", + "description": " - ANCHOR_TX_VERSION_UNSPECIFIED: Use the daemon default anchor transaction version, currently v2.\n - ANCHOR_TX_VERSION_V2: Create new anchor transactions with version 2.\n - ANCHOR_TX_VERSION_V3: Create new anchor transactions with version 3 (TRUC)." + }, "taprpcAssetMeta": { "type": "object", "properties": { diff --git a/taprpc/tapcommon.pb.go b/taprpc/tapcommon.pb.go index 4ce74c11ab..2e76b739c6 100644 --- a/taprpc/tapcommon.pb.go +++ b/taprpc/tapcommon.pb.go @@ -68,6 +68,58 @@ func (SortDirection) EnumDescriptor() ([]byte, []int) { return file_tapcommon_proto_rawDescGZIP(), []int{0} } +type AnchorTxVersion int32 + +const ( + // Use the daemon default anchor transaction version, currently v2. + AnchorTxVersion_ANCHOR_TX_VERSION_UNSPECIFIED AnchorTxVersion = 0 + // Create new anchor transactions with version 2. + AnchorTxVersion_ANCHOR_TX_VERSION_V2 AnchorTxVersion = 1 + // Create new anchor transactions with version 3 (TRUC). + AnchorTxVersion_ANCHOR_TX_VERSION_V3 AnchorTxVersion = 2 +) + +// Enum value maps for AnchorTxVersion. +var ( + AnchorTxVersion_name = map[int32]string{ + 0: "ANCHOR_TX_VERSION_UNSPECIFIED", + 1: "ANCHOR_TX_VERSION_V2", + 2: "ANCHOR_TX_VERSION_V3", + } + AnchorTxVersion_value = map[string]int32{ + "ANCHOR_TX_VERSION_UNSPECIFIED": 0, + "ANCHOR_TX_VERSION_V2": 1, + "ANCHOR_TX_VERSION_V3": 2, + } +) + +func (x AnchorTxVersion) Enum() *AnchorTxVersion { + p := new(AnchorTxVersion) + *p = x + return p +} + +func (x AnchorTxVersion) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (AnchorTxVersion) Descriptor() protoreflect.EnumDescriptor { + return file_tapcommon_proto_enumTypes[1].Descriptor() +} + +func (AnchorTxVersion) Type() protoreflect.EnumType { + return &file_tapcommon_proto_enumTypes[1] +} + +func (x AnchorTxVersion) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use AnchorTxVersion.Descriptor instead. +func (AnchorTxVersion) EnumDescriptor() ([]byte, []int) { + return file_tapcommon_proto_rawDescGZIP(), []int{1} +} + // Represents a Bitcoin transaction outpoint. type OutPoint struct { state protoimpl.MessageState @@ -219,10 +271,17 @@ var file_tapcommon_proto_rawDesc = []byte{ 0x6f, 0x6e, 0x12, 0x17, 0x0a, 0x13, 0x53, 0x4f, 0x52, 0x54, 0x5f, 0x44, 0x49, 0x52, 0x45, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x44, 0x45, 0x53, 0x43, 0x10, 0x00, 0x12, 0x16, 0x0a, 0x12, 0x53, 0x4f, 0x52, 0x54, 0x5f, 0x44, 0x49, 0x52, 0x45, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x41, 0x53, - 0x43, 0x10, 0x01, 0x42, 0x30, 0x5a, 0x2e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, - 0x6d, 0x2f, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x6e, 0x69, 0x6e, 0x67, 0x6c, 0x61, 0x62, 0x73, 0x2f, - 0x74, 0x61, 0x70, 0x72, 0x6f, 0x6f, 0x74, 0x2d, 0x61, 0x73, 0x73, 0x65, 0x74, 0x73, 0x2f, 0x74, - 0x61, 0x70, 0x72, 0x70, 0x63, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x43, 0x10, 0x01, 0x2a, 0x68, 0x0a, 0x0f, 0x41, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x54, 0x78, 0x56, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x0a, 0x1d, 0x41, 0x4e, 0x43, 0x48, 0x4f, 0x52, + 0x5f, 0x54, 0x58, 0x5f, 0x56, 0x45, 0x52, 0x53, 0x49, 0x4f, 0x4e, 0x5f, 0x55, 0x4e, 0x53, 0x50, + 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x18, 0x0a, 0x14, 0x41, 0x4e, 0x43, + 0x48, 0x4f, 0x52, 0x5f, 0x54, 0x58, 0x5f, 0x56, 0x45, 0x52, 0x53, 0x49, 0x4f, 0x4e, 0x5f, 0x56, + 0x32, 0x10, 0x01, 0x12, 0x18, 0x0a, 0x14, 0x41, 0x4e, 0x43, 0x48, 0x4f, 0x52, 0x5f, 0x54, 0x58, + 0x5f, 0x56, 0x45, 0x52, 0x53, 0x49, 0x4f, 0x4e, 0x5f, 0x56, 0x33, 0x10, 0x02, 0x42, 0x30, 0x5a, + 0x2e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6c, 0x69, 0x67, 0x68, + 0x74, 0x6e, 0x69, 0x6e, 0x67, 0x6c, 0x61, 0x62, 0x73, 0x2f, 0x74, 0x61, 0x70, 0x72, 0x6f, 0x6f, + 0x74, 0x2d, 0x61, 0x73, 0x73, 0x65, 0x74, 0x73, 0x2f, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x62, + 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -237,12 +296,13 @@ func file_tapcommon_proto_rawDescGZIP() []byte { return file_tapcommon_proto_rawDescData } -var file_tapcommon_proto_enumTypes = make([]protoimpl.EnumInfo, 1) +var file_tapcommon_proto_enumTypes = make([]protoimpl.EnumInfo, 2) var file_tapcommon_proto_msgTypes = make([]protoimpl.MessageInfo, 2) var file_tapcommon_proto_goTypes = []any{ (SortDirection)(0), // 0: taprpc.SortDirection - (*OutPoint)(nil), // 1: taprpc.OutPoint - (*AssetOutPoint)(nil), // 2: taprpc.AssetOutPoint + (AnchorTxVersion)(0), // 1: taprpc.AnchorTxVersion + (*OutPoint)(nil), // 2: taprpc.OutPoint + (*AssetOutPoint)(nil), // 3: taprpc.AssetOutPoint } var file_tapcommon_proto_depIdxs = []int32{ 0, // [0:0] is the sub-list for method output_type @@ -288,7 +348,7 @@ func file_tapcommon_proto_init() { File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_tapcommon_proto_rawDesc, - NumEnums: 1, + NumEnums: 2, NumMessages: 2, NumExtensions: 0, NumServices: 0, diff --git a/taprpc/tapcommon.proto b/taprpc/tapcommon.proto index b7783d38bf..3d83702c2f 100644 --- a/taprpc/tapcommon.proto +++ b/taprpc/tapcommon.proto @@ -42,3 +42,14 @@ enum SortDirection { // Sort results in ascending order. SORT_DIRECTION_ASC = 1; } + +enum AnchorTxVersion { + // Use the daemon default anchor transaction version, currently v2. + ANCHOR_TX_VERSION_UNSPECIFIED = 0; + + // Create new anchor transactions with version 2. + ANCHOR_TX_VERSION_V2 = 1; + + // Create new anchor transactions with version 3 (TRUC). + ANCHOR_TX_VERSION_V3 = 2; +} diff --git a/taprpc/taprootassets.pb.go b/taprpc/taprootassets.pb.go index 6f28412b5c..cbf36a3552 100644 --- a/taprpc/taprootassets.pb.go +++ b/taprpc/taprootassets.pb.go @@ -5863,6 +5863,8 @@ type SendAssetRequest struct { // meaning that if addresses_with_amounts is set, then tap_addrs must be // empty, and vice versa. AddressesWithAmounts []*AddressWithAmount `protobuf:"bytes,5,rep,name=addresses_with_amounts,json=addressesWithAmounts,proto3" json:"addresses_with_amounts,omitempty"` + // The version to use when creating a new send anchor transaction. + AnchorTxVersion AnchorTxVersion `protobuf:"varint,6,opt,name=anchor_tx_version,json=anchorTxVersion,proto3,enum=taprpc.AnchorTxVersion" json:"anchor_tx_version,omitempty"` } func (x *SendAssetRequest) Reset() { @@ -5932,6 +5934,13 @@ func (x *SendAssetRequest) GetAddressesWithAmounts() []*AddressWithAmount { return nil } +func (x *SendAssetRequest) GetAnchorTxVersion() AnchorTxVersion { + if x != nil { + return x.AnchorTxVersion + } + return AnchorTxVersion_ANCHOR_TX_VERSION_UNSPECIFIED +} + type AddressWithAmount struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -8384,7 +8393,7 @@ var file_taprootassets_proto_rawDesc = []byte{ 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x29, 0x0a, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x06, 0x65, 0x76, 0x65, 0x6e, - 0x74, 0x73, 0x22, 0xf3, 0x01, 0x0a, 0x10, 0x53, 0x65, 0x6e, 0x64, 0x41, 0x73, 0x73, 0x65, 0x74, + 0x74, 0x73, 0x22, 0xb8, 0x02, 0x0a, 0x10, 0x53, 0x65, 0x6e, 0x64, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x61, 0x70, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x74, 0x61, 0x70, 0x41, 0x64, 0x64, 0x72, 0x73, 0x12, 0x19, 0x0a, 0x08, 0x66, 0x65, 0x65, 0x5f, 0x72, 0x61, 0x74, 0x65, @@ -8399,436 +8408,440 @@ var file_taprootassets_proto_rawDesc = []byte{ 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x57, 0x69, 0x74, 0x68, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x14, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x57, 0x69, 0x74, - 0x68, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x22, 0x46, 0x0a, 0x11, 0x41, 0x64, 0x64, 0x72, - 0x65, 0x73, 0x73, 0x57, 0x69, 0x74, 0x68, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x19, 0x0a, - 0x08, 0x74, 0x61, 0x70, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x07, 0x74, 0x61, 0x70, 0x41, 0x64, 0x64, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x6d, 0x6f, 0x75, - 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, - 0x22, 0x85, 0x01, 0x0a, 0x0e, 0x50, 0x72, 0x65, 0x76, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x41, 0x73, - 0x73, 0x65, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x5f, 0x70, 0x6f, - 0x69, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x61, 0x6e, 0x63, 0x68, 0x6f, - 0x72, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, - 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x61, 0x73, 0x73, 0x65, 0x74, 0x49, - 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x4b, 0x65, 0x79, - 0x12, 0x16, 0x0a, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, - 0x52, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x46, 0x0a, 0x11, 0x53, 0x65, 0x6e, 0x64, - 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x31, 0x0a, - 0x08, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x15, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x54, 0x72, - 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x52, 0x08, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, - 0x22, 0x10, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x22, 0x9b, 0x02, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x12, 0x1f, 0x0a, 0x0b, 0x6c, 0x6e, 0x64, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x6c, 0x6e, 0x64, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x07, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x12, 0x2e, 0x0a, 0x13, 0x6c, - 0x6e, 0x64, 0x5f, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x5f, 0x70, 0x75, 0x62, 0x6b, - 0x65, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x6c, 0x6e, 0x64, 0x49, 0x64, 0x65, - 0x6e, 0x74, 0x69, 0x74, 0x79, 0x50, 0x75, 0x62, 0x6b, 0x65, 0x79, 0x12, 0x1d, 0x0a, 0x0a, 0x6e, - 0x6f, 0x64, 0x65, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x09, 0x6e, 0x6f, 0x64, 0x65, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x62, 0x6c, - 0x6f, 0x63, 0x6b, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, - 0x52, 0x0b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x1d, 0x0a, - 0x0a, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x07, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x09, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x61, 0x73, 0x68, 0x12, 0x22, 0x0a, 0x0d, - 0x73, 0x79, 0x6e, 0x63, 0x5f, 0x74, 0x6f, 0x5f, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x18, 0x08, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x0b, 0x73, 0x79, 0x6e, 0x63, 0x54, 0x6f, 0x43, 0x68, 0x61, 0x69, 0x6e, - 0x22, 0xa6, 0x01, 0x0a, 0x15, 0x46, 0x65, 0x74, 0x63, 0x68, 0x41, 0x73, 0x73, 0x65, 0x74, 0x4d, - 0x65, 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x08, 0x61, 0x73, - 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, 0x07, - 0x61, 0x73, 0x73, 0x65, 0x74, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x09, 0x6d, 0x65, 0x74, 0x61, 0x5f, - 0x68, 0x61, 0x73, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, 0x08, 0x6d, 0x65, - 0x74, 0x61, 0x48, 0x61, 0x73, 0x68, 0x12, 0x22, 0x0a, 0x0c, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, - 0x69, 0x64, 0x5f, 0x73, 0x74, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0a, - 0x61, 0x73, 0x73, 0x65, 0x74, 0x49, 0x64, 0x53, 0x74, 0x72, 0x12, 0x24, 0x0a, 0x0d, 0x6d, 0x65, - 0x74, 0x61, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x5f, 0x73, 0x74, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x09, 0x48, 0x00, 0x52, 0x0b, 0x6d, 0x65, 0x74, 0x61, 0x48, 0x61, 0x73, 0x68, 0x53, 0x74, 0x72, - 0x42, 0x07, 0x0a, 0x05, 0x61, 0x73, 0x73, 0x65, 0x74, 0x22, 0xd4, 0x03, 0x0a, 0x16, 0x46, 0x65, - 0x74, 0x63, 0x68, 0x41, 0x73, 0x73, 0x65, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x12, 0x29, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, - 0x41, 0x73, 0x73, 0x65, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, - 0x79, 0x70, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x65, 0x74, 0x61, 0x5f, 0x68, 0x61, 0x73, 0x68, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x48, 0x61, 0x73, 0x68, - 0x12, 0x5f, 0x0a, 0x11, 0x75, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x5f, 0x6f, 0x64, 0x64, 0x5f, - 0x74, 0x79, 0x70, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x74, 0x61, - 0x70, 0x72, 0x70, 0x63, 0x2e, 0x46, 0x65, 0x74, 0x63, 0x68, 0x41, 0x73, 0x73, 0x65, 0x74, 0x4d, - 0x65, 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x55, 0x6e, 0x6b, 0x6e, - 0x6f, 0x77, 0x6e, 0x4f, 0x64, 0x64, 0x54, 0x79, 0x70, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x52, 0x0f, 0x75, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x4f, 0x64, 0x64, 0x54, 0x79, 0x70, 0x65, - 0x73, 0x12, 0x27, 0x0a, 0x0f, 0x64, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x5f, 0x64, 0x69, 0x73, - 0x70, 0x6c, 0x61, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0e, 0x64, 0x65, 0x63, 0x69, - 0x6d, 0x61, 0x6c, 0x44, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x12, 0x31, 0x0a, 0x14, 0x75, 0x6e, - 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, - 0x74, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, - 0x73, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x36, 0x0a, - 0x17, 0x63, 0x61, 0x6e, 0x6f, 0x6e, 0x69, 0x63, 0x61, 0x6c, 0x5f, 0x75, 0x6e, 0x69, 0x76, 0x65, - 0x72, 0x73, 0x65, 0x5f, 0x75, 0x72, 0x6c, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x15, - 0x63, 0x61, 0x6e, 0x6f, 0x6e, 0x69, 0x63, 0x61, 0x6c, 0x55, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, - 0x65, 0x55, 0x72, 0x6c, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0d, 0x64, - 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4b, 0x65, 0x79, 0x1a, 0x42, 0x0a, 0x14, - 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x4f, 0x64, 0x64, 0x54, 0x79, 0x70, 0x65, 0x73, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x04, 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, 0x3a, 0x02, 0x38, 0x01, - 0x22, 0xc3, 0x01, 0x0a, 0x10, 0x42, 0x75, 0x72, 0x6e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x08, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, 0x07, 0x61, 0x73, 0x73, 0x65, 0x74, - 0x49, 0x64, 0x12, 0x22, 0x0a, 0x0c, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x5f, 0x73, - 0x74, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0a, 0x61, 0x73, 0x73, 0x65, - 0x74, 0x49, 0x64, 0x53, 0x74, 0x72, 0x12, 0x24, 0x0a, 0x0e, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, - 0x5f, 0x74, 0x6f, 0x5f, 0x62, 0x75, 0x72, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, - 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x54, 0x6f, 0x42, 0x75, 0x72, 0x6e, 0x12, 0x2b, 0x0a, 0x11, - 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x65, 0x78, - 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x65, 0x78, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x6f, 0x74, - 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x6f, 0x74, 0x65, 0x42, 0x07, 0x0a, - 0x05, 0x61, 0x73, 0x73, 0x65, 0x74, 0x22, 0x84, 0x01, 0x0a, 0x11, 0x42, 0x75, 0x72, 0x6e, 0x41, - 0x73, 0x73, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3a, 0x0a, 0x0d, - 0x62, 0x75, 0x72, 0x6e, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x73, 0x73, - 0x65, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x52, 0x0c, 0x62, 0x75, 0x72, 0x6e, - 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x12, 0x33, 0x0a, 0x0a, 0x62, 0x75, 0x72, 0x6e, - 0x5f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x74, - 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x44, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x50, 0x72, 0x6f, - 0x6f, 0x66, 0x52, 0x09, 0x62, 0x75, 0x72, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x22, 0x7a, 0x0a, - 0x10, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x75, 0x72, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0c, 0x52, 0x07, 0x61, 0x73, 0x73, 0x65, 0x74, 0x49, 0x64, 0x12, 0x2a, 0x0a, 0x11, - 0x74, 0x77, 0x65, 0x61, 0x6b, 0x65, 0x64, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6b, 0x65, - 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0f, 0x74, 0x77, 0x65, 0x61, 0x6b, 0x65, 0x64, - 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4b, 0x65, 0x79, 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x6e, 0x63, 0x68, - 0x6f, 0x72, 0x5f, 0x74, 0x78, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0a, 0x61, - 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x54, 0x78, 0x69, 0x64, 0x22, 0x9f, 0x01, 0x0a, 0x09, 0x41, 0x73, - 0x73, 0x65, 0x74, 0x42, 0x75, 0x72, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x6f, 0x74, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x6f, 0x74, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x61, + 0x68, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x12, 0x43, 0x0a, 0x11, 0x61, 0x6e, 0x63, 0x68, + 0x6f, 0x72, 0x5f, 0x74, 0x78, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x6e, 0x63, + 0x68, 0x6f, 0x72, 0x54, 0x78, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x0f, 0x61, 0x6e, + 0x63, 0x68, 0x6f, 0x72, 0x54, 0x78, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x46, 0x0a, + 0x11, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x57, 0x69, 0x74, 0x68, 0x41, 0x6d, 0x6f, 0x75, + 0x6e, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x74, 0x61, 0x70, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x74, 0x61, 0x70, 0x41, 0x64, 0x64, 0x72, 0x12, 0x16, 0x0a, + 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x61, + 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x85, 0x01, 0x0a, 0x0e, 0x50, 0x72, 0x65, 0x76, 0x49, 0x6e, + 0x70, 0x75, 0x74, 0x41, 0x73, 0x73, 0x65, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x61, 0x6e, 0x63, 0x68, + 0x6f, 0x72, 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, + 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x61, - 0x73, 0x73, 0x65, 0x74, 0x49, 0x64, 0x12, 0x2a, 0x0a, 0x11, 0x74, 0x77, 0x65, 0x61, 0x6b, 0x65, - 0x64, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x0c, 0x52, 0x0f, 0x74, 0x77, 0x65, 0x61, 0x6b, 0x65, 0x64, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4b, - 0x65, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x04, 0x52, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x6e, - 0x63, 0x68, 0x6f, 0x72, 0x5f, 0x74, 0x78, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, - 0x0a, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x54, 0x78, 0x69, 0x64, 0x22, 0x3c, 0x0a, 0x11, 0x4c, - 0x69, 0x73, 0x74, 0x42, 0x75, 0x72, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x27, 0x0a, 0x05, 0x62, 0x75, 0x72, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x11, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x42, 0x75, - 0x72, 0x6e, 0x52, 0x05, 0x62, 0x75, 0x72, 0x6e, 0x73, 0x22, 0x69, 0x0a, 0x1d, 0x53, 0x75, 0x62, - 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x45, 0x76, 0x65, - 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x66, 0x69, - 0x6c, 0x74, 0x65, 0x72, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0a, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x12, 0x27, 0x0a, 0x0f, 0x73, - 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x73, - 0x74, 0x61, 0x6d, 0x70, 0x22, 0xe8, 0x01, 0x0a, 0x0c, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, - 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, - 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, - 0x61, 0x6d, 0x70, 0x12, 0x26, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x64, - 0x64, 0x72, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x6f, - 0x75, 0x74, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6f, - 0x75, 0x74, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x2f, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, - 0x2e, 0x41, 0x64, 0x64, 0x72, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x2f, 0x0a, 0x13, 0x63, 0x6f, 0x6e, 0x66, - 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x12, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, - 0x6f, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, - 0x94, 0x01, 0x0a, 0x1a, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x53, 0x65, 0x6e, - 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, - 0x0a, 0x11, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x5f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x5f, - 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0f, 0x66, 0x69, 0x6c, 0x74, 0x65, - 0x72, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x4b, 0x65, 0x79, 0x12, 0x21, 0x0a, 0x0c, 0x66, 0x69, - 0x6c, 0x74, 0x65, 0x72, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0b, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x27, 0x0a, - 0x0f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, - 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0xec, 0x03, 0x0a, 0x09, 0x53, 0x65, 0x6e, 0x64, 0x45, - 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, - 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, - 0x6d, 0x70, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x65, 0x6e, 0x64, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x6e, 0x64, 0x53, 0x74, 0x61, 0x74, - 0x65, 0x12, 0x33, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x63, 0x65, 0x6c, 0x5f, 0x74, 0x79, 0x70, 0x65, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x12, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, - 0x50, 0x61, 0x72, 0x63, 0x65, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0a, 0x70, 0x61, 0x72, 0x63, - 0x65, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x12, 0x2a, 0x0a, 0x09, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, - 0x73, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x74, 0x61, 0x70, 0x72, - 0x70, 0x63, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x52, 0x09, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, - 0x65, 0x73, 0x12, 0x27, 0x0a, 0x0f, 0x76, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x5f, 0x70, 0x61, - 0x63, 0x6b, 0x65, 0x74, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x0e, 0x76, 0x69, 0x72, - 0x74, 0x75, 0x61, 0x6c, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x12, 0x36, 0x0a, 0x17, 0x70, - 0x61, 0x73, 0x73, 0x69, 0x76, 0x65, 0x5f, 0x76, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x5f, 0x70, - 0x61, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x15, 0x70, 0x61, - 0x73, 0x73, 0x69, 0x76, 0x65, 0x56, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x50, 0x61, 0x63, 0x6b, - 0x65, 0x74, 0x73, 0x12, 0x48, 0x0a, 0x12, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x5f, 0x74, 0x72, - 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x19, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x54, - 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x11, 0x61, 0x6e, 0x63, 0x68, - 0x6f, 0x72, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x31, 0x0a, - 0x08, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x15, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x54, 0x72, - 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x52, 0x08, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, - 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x25, 0x0a, 0x0e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, - 0x65, 0x72, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, - 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x26, 0x0a, - 0x0f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x73, 0x65, 0x6e, 0x64, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, - 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x65, 0x78, 0x74, 0x53, 0x65, 0x6e, 0x64, - 0x53, 0x74, 0x61, 0x74, 0x65, 0x22, 0x97, 0x02, 0x0a, 0x11, 0x41, 0x6e, 0x63, 0x68, 0x6f, 0x72, - 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1f, 0x0a, 0x0b, 0x61, - 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x5f, 0x70, 0x73, 0x62, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, - 0x52, 0x0a, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x50, 0x73, 0x62, 0x74, 0x12, 0x2e, 0x0a, 0x13, - 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x5f, 0x69, 0x6e, - 0x64, 0x65, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x11, 0x63, 0x68, 0x61, 0x6e, 0x67, - 0x65, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x26, 0x0a, 0x0f, - 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x66, 0x65, 0x65, 0x73, 0x5f, 0x73, 0x61, 0x74, 0x73, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x46, 0x65, 0x65, 0x73, - 0x53, 0x61, 0x74, 0x73, 0x12, 0x32, 0x0a, 0x16, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x66, - 0x65, 0x65, 0x5f, 0x72, 0x61, 0x74, 0x65, 0x5f, 0x73, 0x61, 0x74, 0x5f, 0x6b, 0x77, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x12, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x46, 0x65, 0x65, 0x52, - 0x61, 0x74, 0x65, 0x53, 0x61, 0x74, 0x4b, 0x77, 0x12, 0x3a, 0x0a, 0x10, 0x6c, 0x6e, 0x64, 0x5f, - 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x5f, 0x75, 0x74, 0x78, 0x6f, 0x73, 0x18, 0x05, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4f, 0x75, 0x74, 0x50, - 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x0e, 0x6c, 0x6e, 0x64, 0x4c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x55, - 0x74, 0x78, 0x6f, 0x73, 0x12, 0x19, 0x0a, 0x08, 0x66, 0x69, 0x6e, 0x61, 0x6c, 0x5f, 0x74, 0x78, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x66, 0x69, 0x6e, 0x61, 0x6c, 0x54, 0x78, 0x22, - 0x9e, 0x01, 0x0a, 0x17, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x54, 0x72, 0x61, 0x6e, - 0x73, 0x66, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x61, - 0x73, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x61, - 0x73, 0x73, 0x65, 0x74, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, - 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x67, 0x72, 0x6f, 0x75, 0x70, - 0x4b, 0x65, 0x79, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x5f, 0x6b, 0x65, - 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x4b, - 0x65, 0x79, 0x12, 0x2c, 0x0a, 0x08, 0x6f, 0x75, 0x74, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4f, 0x75, - 0x74, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x08, 0x6f, 0x75, 0x74, 0x70, 0x6f, 0x69, 0x6e, 0x74, - 0x22, 0x54, 0x0a, 0x18, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x54, 0x72, 0x61, 0x6e, - 0x73, 0x66, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x38, 0x0a, 0x10, - 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x5f, 0x61, 0x73, 0x73, 0x65, 0x74, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, - 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x0f, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, - 0x64, 0x41, 0x73, 0x73, 0x65, 0x74, 0x22, 0x44, 0x0a, 0x12, 0x4d, 0x61, 0x63, 0x61, 0x72, 0x6f, - 0x6f, 0x6e, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x06, - 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x6e, - 0x74, 0x69, 0x74, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xb1, 0x01, 0x0a, - 0x13, 0x42, 0x61, 0x6b, 0x65, 0x4d, 0x61, 0x63, 0x61, 0x72, 0x6f, 0x6f, 0x6e, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x3c, 0x0a, 0x0b, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, - 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x74, 0x61, 0x70, 0x72, - 0x70, 0x63, 0x2e, 0x4d, 0x61, 0x63, 0x61, 0x72, 0x6f, 0x6f, 0x6e, 0x50, 0x65, 0x72, 0x6d, 0x69, - 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, - 0x6e, 0x73, 0x12, 0x1e, 0x0a, 0x0b, 0x72, 0x6f, 0x6f, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x69, - 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x72, 0x6f, 0x6f, 0x74, 0x4b, 0x65, 0x79, - 0x49, 0x64, 0x12, 0x3c, 0x0a, 0x1a, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x65, 0x78, 0x74, 0x65, - 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x18, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x45, 0x78, 0x74, - 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, - 0x22, 0x32, 0x0a, 0x14, 0x42, 0x61, 0x6b, 0x65, 0x4d, 0x61, 0x63, 0x61, 0x72, 0x6f, 0x6f, 0x6e, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x6d, 0x61, 0x63, 0x61, - 0x72, 0x6f, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6d, 0x61, 0x63, 0x61, - 0x72, 0x6f, 0x6f, 0x6e, 0x2a, 0x28, 0x0a, 0x09, 0x41, 0x73, 0x73, 0x65, 0x74, 0x54, 0x79, 0x70, - 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x4e, 0x4f, 0x52, 0x4d, 0x41, 0x4c, 0x10, 0x00, 0x12, 0x0f, 0x0a, - 0x0b, 0x43, 0x4f, 0x4c, 0x4c, 0x45, 0x43, 0x54, 0x49, 0x42, 0x4c, 0x45, 0x10, 0x01, 0x2a, 0x39, - 0x0a, 0x0d, 0x41, 0x73, 0x73, 0x65, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x12, - 0x14, 0x0a, 0x10, 0x4d, 0x45, 0x54, 0x41, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4f, 0x50, 0x41, - 0x51, 0x55, 0x45, 0x10, 0x00, 0x12, 0x12, 0x0a, 0x0e, 0x4d, 0x45, 0x54, 0x41, 0x5f, 0x54, 0x59, - 0x50, 0x45, 0x5f, 0x4a, 0x53, 0x4f, 0x4e, 0x10, 0x01, 0x2a, 0x3a, 0x0a, 0x0c, 0x41, 0x73, 0x73, - 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x10, 0x41, 0x53, 0x53, - 0x45, 0x54, 0x5f, 0x56, 0x45, 0x52, 0x53, 0x49, 0x4f, 0x4e, 0x5f, 0x56, 0x30, 0x10, 0x00, 0x12, - 0x14, 0x0a, 0x10, 0x41, 0x53, 0x53, 0x45, 0x54, 0x5f, 0x56, 0x45, 0x52, 0x53, 0x49, 0x4f, 0x4e, - 0x5f, 0x56, 0x31, 0x10, 0x01, 0x2a, 0x52, 0x0a, 0x0a, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x54, - 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x12, 0x4f, 0x55, 0x54, 0x50, 0x55, 0x54, 0x5f, 0x54, 0x59, - 0x50, 0x45, 0x5f, 0x53, 0x49, 0x4d, 0x50, 0x4c, 0x45, 0x10, 0x00, 0x12, 0x1a, 0x0a, 0x16, 0x4f, - 0x55, 0x54, 0x50, 0x55, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x50, 0x4c, 0x49, 0x54, - 0x5f, 0x52, 0x4f, 0x4f, 0x54, 0x10, 0x01, 0x22, 0x04, 0x08, 0x02, 0x10, 0x02, 0x22, 0x04, 0x08, - 0x03, 0x10, 0x03, 0x22, 0x04, 0x08, 0x04, 0x10, 0x04, 0x2a, 0x86, 0x01, 0x0a, 0x13, 0x50, 0x72, - 0x6f, 0x6f, 0x66, 0x44, 0x65, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x79, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x12, 0x28, 0x0a, 0x24, 0x50, 0x52, 0x4f, 0x4f, 0x46, 0x5f, 0x44, 0x45, 0x4c, 0x49, 0x56, - 0x45, 0x52, 0x59, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x41, - 0x50, 0x50, 0x4c, 0x49, 0x43, 0x41, 0x42, 0x4c, 0x45, 0x10, 0x00, 0x12, 0x22, 0x0a, 0x1e, 0x50, - 0x52, 0x4f, 0x4f, 0x46, 0x5f, 0x44, 0x45, 0x4c, 0x49, 0x56, 0x45, 0x52, 0x59, 0x5f, 0x53, 0x54, - 0x41, 0x54, 0x55, 0x53, 0x5f, 0x43, 0x4f, 0x4d, 0x50, 0x4c, 0x45, 0x54, 0x45, 0x10, 0x01, 0x12, - 0x21, 0x0a, 0x1d, 0x50, 0x52, 0x4f, 0x4f, 0x46, 0x5f, 0x44, 0x45, 0x4c, 0x49, 0x56, 0x45, 0x52, - 0x59, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x50, 0x45, 0x4e, 0x44, 0x49, 0x4e, 0x47, - 0x10, 0x02, 0x2a, 0x6a, 0x0a, 0x0b, 0x41, 0x64, 0x64, 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x12, 0x1c, 0x0a, 0x18, 0x41, 0x44, 0x44, 0x52, 0x5f, 0x56, 0x45, 0x52, 0x53, 0x49, 0x4f, - 0x4e, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, - 0x13, 0x0a, 0x0f, 0x41, 0x44, 0x44, 0x52, 0x5f, 0x56, 0x45, 0x52, 0x53, 0x49, 0x4f, 0x4e, 0x5f, - 0x56, 0x30, 0x10, 0x01, 0x12, 0x13, 0x0a, 0x0f, 0x41, 0x44, 0x44, 0x52, 0x5f, 0x56, 0x45, 0x52, - 0x53, 0x49, 0x4f, 0x4e, 0x5f, 0x56, 0x31, 0x10, 0x02, 0x12, 0x13, 0x0a, 0x0f, 0x41, 0x44, 0x44, - 0x52, 0x5f, 0x56, 0x45, 0x52, 0x53, 0x49, 0x4f, 0x4e, 0x5f, 0x56, 0x32, 0x10, 0x03, 0x2a, 0xc9, - 0x01, 0x0a, 0x0d, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x4b, 0x65, 0x79, 0x54, 0x79, 0x70, 0x65, - 0x12, 0x16, 0x0a, 0x12, 0x53, 0x43, 0x52, 0x49, 0x50, 0x54, 0x5f, 0x4b, 0x45, 0x59, 0x5f, 0x55, - 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x14, 0x0a, 0x10, 0x53, 0x43, 0x52, 0x49, - 0x50, 0x54, 0x5f, 0x4b, 0x45, 0x59, 0x5f, 0x42, 0x49, 0x50, 0x38, 0x36, 0x10, 0x01, 0x12, 0x23, - 0x0a, 0x1f, 0x53, 0x43, 0x52, 0x49, 0x50, 0x54, 0x5f, 0x4b, 0x45, 0x59, 0x5f, 0x53, 0x43, 0x52, - 0x49, 0x50, 0x54, 0x5f, 0x50, 0x41, 0x54, 0x48, 0x5f, 0x45, 0x58, 0x54, 0x45, 0x52, 0x4e, 0x41, - 0x4c, 0x10, 0x02, 0x12, 0x13, 0x0a, 0x0f, 0x53, 0x43, 0x52, 0x49, 0x50, 0x54, 0x5f, 0x4b, 0x45, - 0x59, 0x5f, 0x42, 0x55, 0x52, 0x4e, 0x10, 0x03, 0x12, 0x18, 0x0a, 0x14, 0x53, 0x43, 0x52, 0x49, - 0x50, 0x54, 0x5f, 0x4b, 0x45, 0x59, 0x5f, 0x54, 0x4f, 0x4d, 0x42, 0x53, 0x54, 0x4f, 0x4e, 0x45, - 0x10, 0x04, 0x12, 0x16, 0x0a, 0x12, 0x53, 0x43, 0x52, 0x49, 0x50, 0x54, 0x5f, 0x4b, 0x45, 0x59, - 0x5f, 0x43, 0x48, 0x41, 0x4e, 0x4e, 0x45, 0x4c, 0x10, 0x05, 0x12, 0x1e, 0x0a, 0x1a, 0x53, 0x43, - 0x52, 0x49, 0x50, 0x54, 0x5f, 0x4b, 0x45, 0x59, 0x5f, 0x55, 0x4e, 0x49, 0x51, 0x55, 0x45, 0x5f, - 0x50, 0x45, 0x44, 0x45, 0x52, 0x53, 0x45, 0x4e, 0x10, 0x06, 0x2a, 0xd0, 0x01, 0x0a, 0x0f, 0x41, - 0x64, 0x64, 0x72, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1d, - 0x0a, 0x19, 0x41, 0x44, 0x44, 0x52, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x53, 0x54, 0x41, - 0x54, 0x55, 0x53, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x2a, 0x0a, - 0x26, 0x41, 0x44, 0x44, 0x52, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x53, 0x54, 0x41, 0x54, - 0x55, 0x53, 0x5f, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x44, - 0x45, 0x54, 0x45, 0x43, 0x54, 0x45, 0x44, 0x10, 0x01, 0x12, 0x2b, 0x0a, 0x27, 0x41, 0x44, 0x44, - 0x52, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x54, - 0x52, 0x41, 0x4e, 0x53, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x43, 0x4f, 0x4e, 0x46, 0x49, - 0x52, 0x4d, 0x45, 0x44, 0x10, 0x02, 0x12, 0x24, 0x0a, 0x20, 0x41, 0x44, 0x44, 0x52, 0x5f, 0x45, - 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x50, 0x52, 0x4f, 0x4f, - 0x46, 0x5f, 0x52, 0x45, 0x43, 0x45, 0x49, 0x56, 0x45, 0x44, 0x10, 0x03, 0x12, 0x1f, 0x0a, 0x1b, - 0x41, 0x44, 0x44, 0x52, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, - 0x53, 0x5f, 0x43, 0x4f, 0x4d, 0x50, 0x4c, 0x45, 0x54, 0x45, 0x44, 0x10, 0x04, 0x2a, 0x9b, 0x02, - 0x0a, 0x09, 0x53, 0x65, 0x6e, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x23, 0x0a, 0x1f, 0x53, - 0x45, 0x4e, 0x44, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x56, 0x49, 0x52, 0x54, 0x55, 0x41, - 0x4c, 0x5f, 0x49, 0x4e, 0x50, 0x55, 0x54, 0x5f, 0x53, 0x45, 0x4c, 0x45, 0x43, 0x54, 0x10, 0x00, - 0x12, 0x1b, 0x0a, 0x17, 0x53, 0x45, 0x4e, 0x44, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x56, - 0x49, 0x52, 0x54, 0x55, 0x41, 0x4c, 0x5f, 0x53, 0x49, 0x47, 0x4e, 0x10, 0x01, 0x12, 0x1a, 0x0a, - 0x16, 0x53, 0x45, 0x4e, 0x44, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x41, 0x4e, 0x43, 0x48, - 0x4f, 0x52, 0x5f, 0x53, 0x49, 0x47, 0x4e, 0x10, 0x02, 0x12, 0x1d, 0x0a, 0x19, 0x53, 0x45, 0x4e, - 0x44, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x4c, 0x4f, 0x47, 0x5f, 0x43, 0x4f, 0x4d, 0x4d, - 0x49, 0x54, 0x4d, 0x45, 0x4e, 0x54, 0x10, 0x03, 0x12, 0x18, 0x0a, 0x14, 0x53, 0x45, 0x4e, 0x44, - 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x42, 0x52, 0x4f, 0x41, 0x44, 0x43, 0x41, 0x53, 0x54, - 0x10, 0x04, 0x12, 0x20, 0x0a, 0x1c, 0x53, 0x45, 0x4e, 0x44, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, - 0x5f, 0x57, 0x41, 0x49, 0x54, 0x5f, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x52, 0x4d, 0x41, 0x54, 0x49, - 0x4f, 0x4e, 0x10, 0x05, 0x12, 0x1b, 0x0a, 0x17, 0x53, 0x45, 0x4e, 0x44, 0x5f, 0x53, 0x54, 0x41, - 0x54, 0x45, 0x5f, 0x53, 0x54, 0x4f, 0x52, 0x45, 0x5f, 0x50, 0x52, 0x4f, 0x4f, 0x46, 0x53, 0x10, - 0x06, 0x12, 0x1e, 0x0a, 0x1a, 0x53, 0x45, 0x4e, 0x44, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, - 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x50, 0x52, 0x4f, 0x4f, 0x46, 0x53, 0x10, - 0x07, 0x12, 0x18, 0x0a, 0x14, 0x53, 0x45, 0x4e, 0x44, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, - 0x43, 0x4f, 0x4d, 0x50, 0x4c, 0x45, 0x54, 0x45, 0x44, 0x10, 0x08, 0x2a, 0x78, 0x0a, 0x0a, 0x50, - 0x61, 0x72, 0x63, 0x65, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x12, 0x17, 0x0a, 0x13, 0x50, 0x41, 0x52, - 0x43, 0x45, 0x4c, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x41, 0x44, 0x44, 0x52, 0x45, 0x53, 0x53, - 0x10, 0x00, 0x12, 0x1a, 0x0a, 0x16, 0x50, 0x41, 0x52, 0x43, 0x45, 0x4c, 0x5f, 0x54, 0x59, 0x50, - 0x45, 0x5f, 0x50, 0x52, 0x45, 0x5f, 0x53, 0x49, 0x47, 0x4e, 0x45, 0x44, 0x10, 0x01, 0x12, 0x17, - 0x0a, 0x13, 0x50, 0x41, 0x52, 0x43, 0x45, 0x4c, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x50, 0x45, - 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x12, 0x1c, 0x0a, 0x18, 0x50, 0x41, 0x52, 0x43, 0x45, - 0x4c, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x50, 0x52, 0x45, 0x5f, 0x41, 0x4e, 0x43, 0x48, 0x4f, - 0x52, 0x45, 0x44, 0x10, 0x03, 0x32, 0xe2, 0x0d, 0x0a, 0x0d, 0x54, 0x61, 0x70, 0x72, 0x6f, 0x6f, - 0x74, 0x41, 0x73, 0x73, 0x65, 0x74, 0x73, 0x12, 0x41, 0x0a, 0x0a, 0x4c, 0x69, 0x73, 0x74, 0x41, - 0x73, 0x73, 0x65, 0x74, 0x73, 0x12, 0x18, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4c, - 0x69, 0x73, 0x74, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x19, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x73, 0x73, - 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x43, 0x0a, 0x0a, 0x46, 0x65, - 0x74, 0x63, 0x68, 0x41, 0x73, 0x73, 0x65, 0x74, 0x12, 0x19, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, - 0x63, 0x2e, 0x46, 0x65, 0x74, 0x63, 0x68, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x46, 0x65, 0x74, - 0x63, 0x68, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x40, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x74, 0x78, 0x6f, 0x73, 0x12, 0x18, 0x2e, 0x74, - 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x74, 0x78, 0x6f, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, - 0x4c, 0x69, 0x73, 0x74, 0x55, 0x74, 0x78, 0x6f, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x43, 0x0a, 0x0a, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x12, - 0x19, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x72, 0x6f, - 0x75, 0x70, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x74, 0x61, 0x70, - 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x49, 0x0a, 0x0c, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x61, - 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x12, 0x1b, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, - 0x4c, 0x69, 0x73, 0x74, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x69, 0x73, - 0x74, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x4c, 0x0a, 0x0d, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, - 0x72, 0x73, 0x12, 0x1c, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x69, 0x73, 0x74, - 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x1d, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x72, - 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x37, 0x0a, 0x0a, 0x53, 0x74, 0x6f, 0x70, 0x44, 0x61, 0x65, 0x6d, 0x6f, 0x6e, 0x12, 0x13, 0x2e, - 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x74, 0x6f, 0x70, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x43, 0x0a, 0x0a, 0x44, 0x65, 0x62, 0x75, - 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x19, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, - 0x44, 0x65, 0x62, 0x75, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x1a, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x44, 0x65, 0x62, 0x75, 0x67, - 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x41, 0x0a, - 0x0a, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x64, 0x64, 0x72, 0x73, 0x12, 0x18, 0x2e, 0x74, 0x61, - 0x70, 0x72, 0x70, 0x63, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x64, 0x64, 0x72, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x51, - 0x75, 0x65, 0x72, 0x79, 0x41, 0x64, 0x64, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x2f, 0x0a, 0x07, 0x4e, 0x65, 0x77, 0x41, 0x64, 0x64, 0x72, 0x12, 0x16, 0x2e, 0x74, 0x61, - 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x64, 0x64, 0x72, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x0c, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x64, 0x64, - 0x72, 0x12, 0x35, 0x0a, 0x0a, 0x44, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x41, 0x64, 0x64, 0x72, 0x12, - 0x19, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x44, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x41, - 0x64, 0x64, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0c, 0x2e, 0x74, 0x61, 0x70, - 0x72, 0x70, 0x63, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x12, 0x49, 0x0a, 0x0c, 0x41, 0x64, 0x64, 0x72, - 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x73, 0x12, 0x1b, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, - 0x63, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, - 0x64, 0x64, 0x72, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x3d, 0x0a, 0x0b, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x50, 0x72, 0x6f, - 0x6f, 0x66, 0x12, 0x11, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x50, 0x72, 0x6f, 0x6f, - 0x66, 0x46, 0x69, 0x6c, 0x65, 0x1a, 0x1b, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x56, - 0x65, 0x72, 0x69, 0x66, 0x79, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x46, 0x0a, 0x0b, 0x44, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x50, 0x72, 0x6f, 0x6f, - 0x66, 0x12, 0x1a, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x44, 0x65, 0x63, 0x6f, 0x64, - 0x65, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, - 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x44, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x50, 0x72, 0x6f, - 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3c, 0x0a, 0x0b, 0x45, 0x78, - 0x70, 0x6f, 0x72, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x1a, 0x2e, 0x74, 0x61, 0x70, 0x72, - 0x70, 0x63, 0x2e, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x50, - 0x72, 0x6f, 0x6f, 0x66, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x52, 0x0a, 0x0f, 0x55, 0x6e, 0x70, 0x61, - 0x63, 0x6b, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x1e, 0x2e, 0x74, 0x61, - 0x70, 0x72, 0x70, 0x63, 0x2e, 0x55, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x50, 0x72, 0x6f, 0x6f, 0x66, - 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x74, 0x61, - 0x70, 0x72, 0x70, 0x63, 0x2e, 0x55, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x50, 0x72, 0x6f, 0x6f, 0x66, - 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x40, 0x0a, 0x09, - 0x53, 0x65, 0x6e, 0x64, 0x41, 0x73, 0x73, 0x65, 0x74, 0x12, 0x18, 0x2e, 0x74, 0x61, 0x70, 0x72, - 0x70, 0x63, 0x2e, 0x53, 0x65, 0x6e, 0x64, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x65, 0x6e, - 0x64, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x40, - 0x0a, 0x09, 0x42, 0x75, 0x72, 0x6e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x12, 0x18, 0x2e, 0x74, 0x61, - 0x70, 0x72, 0x70, 0x63, 0x2e, 0x42, 0x75, 0x72, 0x6e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x42, - 0x75, 0x72, 0x6e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x40, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x75, 0x72, 0x6e, 0x73, 0x12, 0x18, 0x2e, - 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x75, 0x72, 0x6e, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, - 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x75, 0x72, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x3a, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x16, 0x2e, - 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x47, - 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x49, - 0x0a, 0x0c, 0x42, 0x61, 0x6b, 0x65, 0x4d, 0x61, 0x63, 0x61, 0x72, 0x6f, 0x6f, 0x6e, 0x12, 0x1b, - 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x42, 0x61, 0x6b, 0x65, 0x4d, 0x61, 0x63, 0x61, - 0x72, 0x6f, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x74, 0x61, - 0x70, 0x72, 0x70, 0x63, 0x2e, 0x42, 0x61, 0x6b, 0x65, 0x4d, 0x61, 0x63, 0x61, 0x72, 0x6f, 0x6f, - 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4f, 0x0a, 0x0e, 0x46, 0x65, 0x74, - 0x63, 0x68, 0x41, 0x73, 0x73, 0x65, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x1d, 0x2e, 0x74, 0x61, - 0x70, 0x72, 0x70, 0x63, 0x2e, 0x46, 0x65, 0x74, 0x63, 0x68, 0x41, 0x73, 0x73, 0x65, 0x74, 0x4d, - 0x65, 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x74, 0x61, 0x70, - 0x72, 0x70, 0x63, 0x2e, 0x46, 0x65, 0x74, 0x63, 0x68, 0x41, 0x73, 0x73, 0x65, 0x74, 0x4d, 0x65, - 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x57, 0x0a, 0x16, 0x53, 0x75, - 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x45, 0x76, - 0x65, 0x6e, 0x74, 0x73, 0x12, 0x25, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x75, - 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x45, 0x76, - 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x74, 0x61, - 0x70, 0x72, 0x70, 0x63, 0x2e, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x45, 0x76, 0x65, 0x6e, - 0x74, 0x30, 0x01, 0x12, 0x4e, 0x0a, 0x13, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, - 0x53, 0x65, 0x6e, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x22, 0x2e, 0x74, 0x61, 0x70, - 0x72, 0x70, 0x63, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x53, 0x65, 0x6e, - 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, - 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x65, 0x6e, 0x64, 0x45, 0x76, 0x65, 0x6e, - 0x74, 0x30, 0x01, 0x12, 0x55, 0x0a, 0x10, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x54, - 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x12, 0x1f, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, - 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, - 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, - 0x63, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, - 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x30, 0x5a, 0x2e, 0x67, 0x69, - 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x6e, 0x69, - 0x6e, 0x67, 0x6c, 0x61, 0x62, 0x73, 0x2f, 0x74, 0x61, 0x70, 0x72, 0x6f, 0x6f, 0x74, 0x2d, 0x61, - 0x73, 0x73, 0x65, 0x74, 0x73, 0x2f, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x62, 0x06, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x33, + 0x73, 0x73, 0x65, 0x74, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x4b, 0x65, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x46, 0x0a, + 0x11, 0x53, 0x65, 0x6e, 0x64, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x31, 0x0a, 0x08, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x73, + 0x73, 0x65, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x52, 0x08, 0x74, 0x72, 0x61, + 0x6e, 0x73, 0x66, 0x65, 0x72, 0x22, 0x10, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x9b, 0x02, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x49, + 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x76, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1f, 0x0a, 0x0b, 0x6c, 0x6e, 0x64, 0x5f, 0x76, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x6c, 0x6e, 0x64, 0x56, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, + 0x6b, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, + 0x12, 0x2e, 0x0a, 0x13, 0x6c, 0x6e, 0x64, 0x5f, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, + 0x5f, 0x70, 0x75, 0x62, 0x6b, 0x65, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x6c, + 0x6e, 0x64, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x50, 0x75, 0x62, 0x6b, 0x65, 0x79, + 0x12, 0x1d, 0x0a, 0x0a, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x6f, 0x64, 0x65, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x12, + 0x21, 0x0a, 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x69, 0x67, + 0x68, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x68, 0x61, 0x73, 0x68, + 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x61, 0x73, + 0x68, 0x12, 0x22, 0x0a, 0x0d, 0x73, 0x79, 0x6e, 0x63, 0x5f, 0x74, 0x6f, 0x5f, 0x63, 0x68, 0x61, + 0x69, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x73, 0x79, 0x6e, 0x63, 0x54, 0x6f, + 0x43, 0x68, 0x61, 0x69, 0x6e, 0x22, 0xa6, 0x01, 0x0a, 0x15, 0x46, 0x65, 0x74, 0x63, 0x68, 0x41, + 0x73, 0x73, 0x65, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x1b, 0x0a, 0x08, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0c, 0x48, 0x00, 0x52, 0x07, 0x61, 0x73, 0x73, 0x65, 0x74, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x09, + 0x6d, 0x65, 0x74, 0x61, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x48, + 0x00, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x48, 0x61, 0x73, 0x68, 0x12, 0x22, 0x0a, 0x0c, 0x61, + 0x73, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x5f, 0x73, 0x74, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x48, 0x00, 0x52, 0x0a, 0x61, 0x73, 0x73, 0x65, 0x74, 0x49, 0x64, 0x53, 0x74, 0x72, 0x12, + 0x24, 0x0a, 0x0d, 0x6d, 0x65, 0x74, 0x61, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x5f, 0x73, 0x74, 0x72, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0b, 0x6d, 0x65, 0x74, 0x61, 0x48, 0x61, + 0x73, 0x68, 0x53, 0x74, 0x72, 0x42, 0x07, 0x0a, 0x05, 0x61, 0x73, 0x73, 0x65, 0x74, 0x22, 0xd4, + 0x03, 0x0a, 0x16, 0x46, 0x65, 0x74, 0x63, 0x68, 0x41, 0x73, 0x73, 0x65, 0x74, 0x4d, 0x65, 0x74, + 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, + 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x12, 0x29, 0x0a, + 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x74, 0x61, + 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x54, 0x79, + 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x65, 0x74, 0x61, + 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x6d, 0x65, 0x74, + 0x61, 0x48, 0x61, 0x73, 0x68, 0x12, 0x5f, 0x0a, 0x11, 0x75, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, + 0x5f, 0x6f, 0x64, 0x64, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x33, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x46, 0x65, 0x74, 0x63, 0x68, 0x41, + 0x73, 0x73, 0x65, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x2e, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x4f, 0x64, 0x64, 0x54, 0x79, 0x70, 0x65, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0f, 0x75, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x4f, 0x64, + 0x64, 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, 0x27, 0x0a, 0x0f, 0x64, 0x65, 0x63, 0x69, 0x6d, 0x61, + 0x6c, 0x5f, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x0e, 0x64, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x44, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x12, + 0x31, 0x0a, 0x14, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, + 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x75, + 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x12, 0x36, 0x0a, 0x17, 0x63, 0x61, 0x6e, 0x6f, 0x6e, 0x69, 0x63, 0x61, 0x6c, 0x5f, + 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x5f, 0x75, 0x72, 0x6c, 0x73, 0x18, 0x07, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x15, 0x63, 0x61, 0x6e, 0x6f, 0x6e, 0x69, 0x63, 0x61, 0x6c, 0x55, 0x6e, + 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x55, 0x72, 0x6c, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x64, 0x65, + 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x08, 0x20, 0x01, + 0x28, 0x0c, 0x52, 0x0d, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4b, 0x65, + 0x79, 0x1a, 0x42, 0x0a, 0x14, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x4f, 0x64, 0x64, 0x54, + 0x79, 0x70, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 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, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xc3, 0x01, 0x0a, 0x10, 0x42, 0x75, 0x72, 0x6e, 0x41, 0x73, + 0x73, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x08, 0x61, 0x73, + 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, 0x07, + 0x61, 0x73, 0x73, 0x65, 0x74, 0x49, 0x64, 0x12, 0x22, 0x0a, 0x0c, 0x61, 0x73, 0x73, 0x65, 0x74, + 0x5f, 0x69, 0x64, 0x5f, 0x73, 0x74, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, + 0x0a, 0x61, 0x73, 0x73, 0x65, 0x74, 0x49, 0x64, 0x53, 0x74, 0x72, 0x12, 0x24, 0x0a, 0x0e, 0x61, + 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x74, 0x6f, 0x5f, 0x62, 0x75, 0x72, 0x6e, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x04, 0x52, 0x0c, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x54, 0x6f, 0x42, 0x75, 0x72, + 0x6e, 0x12, 0x2b, 0x0a, 0x11, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x5f, 0x74, 0x65, 0x78, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x63, 0x6f, + 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x65, 0x78, 0x74, 0x12, 0x12, + 0x0a, 0x04, 0x6e, 0x6f, 0x74, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x6f, + 0x74, 0x65, 0x42, 0x07, 0x0a, 0x05, 0x61, 0x73, 0x73, 0x65, 0x74, 0x22, 0x84, 0x01, 0x0a, 0x11, + 0x42, 0x75, 0x72, 0x6e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x3a, 0x0a, 0x0d, 0x62, 0x75, 0x72, 0x6e, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, + 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, + 0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x52, + 0x0c, 0x62, 0x75, 0x72, 0x6e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x12, 0x33, 0x0a, + 0x0a, 0x62, 0x75, 0x72, 0x6e, 0x5f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x14, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x44, 0x65, 0x63, 0x6f, 0x64, + 0x65, 0x64, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x09, 0x62, 0x75, 0x72, 0x6e, 0x50, 0x72, 0x6f, + 0x6f, 0x66, 0x22, 0x7a, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x75, 0x72, 0x6e, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x61, 0x73, 0x73, 0x65, 0x74, 0x49, + 0x64, 0x12, 0x2a, 0x0a, 0x11, 0x74, 0x77, 0x65, 0x61, 0x6b, 0x65, 0x64, 0x5f, 0x67, 0x72, 0x6f, + 0x75, 0x70, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0f, 0x74, 0x77, + 0x65, 0x61, 0x6b, 0x65, 0x64, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4b, 0x65, 0x79, 0x12, 0x1f, 0x0a, + 0x0b, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x5f, 0x74, 0x78, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x0c, 0x52, 0x0a, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x54, 0x78, 0x69, 0x64, 0x22, 0x9f, + 0x01, 0x0a, 0x09, 0x41, 0x73, 0x73, 0x65, 0x74, 0x42, 0x75, 0x72, 0x6e, 0x12, 0x12, 0x0a, 0x04, + 0x6e, 0x6f, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x6f, 0x74, 0x65, + 0x12, 0x19, 0x0a, 0x08, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0c, 0x52, 0x07, 0x61, 0x73, 0x73, 0x65, 0x74, 0x49, 0x64, 0x12, 0x2a, 0x0a, 0x11, 0x74, + 0x77, 0x65, 0x61, 0x6b, 0x65, 0x64, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6b, 0x65, 0x79, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0f, 0x74, 0x77, 0x65, 0x61, 0x6b, 0x65, 0x64, 0x47, + 0x72, 0x6f, 0x75, 0x70, 0x4b, 0x65, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, + 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, + 0x1f, 0x0a, 0x0b, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x5f, 0x74, 0x78, 0x69, 0x64, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0a, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x54, 0x78, 0x69, 0x64, + 0x22, 0x3c, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x75, 0x72, 0x6e, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x27, 0x0a, 0x05, 0x62, 0x75, 0x72, 0x6e, 0x73, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x73, + 0x73, 0x65, 0x74, 0x42, 0x75, 0x72, 0x6e, 0x52, 0x05, 0x62, 0x75, 0x72, 0x6e, 0x73, 0x22, 0x69, + 0x0a, 0x1d, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x63, 0x65, 0x69, + 0x76, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x1f, 0x0a, 0x0b, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, + 0x12, 0x27, 0x0a, 0x0f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x73, 0x74, 0x61, 0x72, 0x74, + 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0xe8, 0x01, 0x0a, 0x0c, 0x52, 0x65, + 0x63, 0x65, 0x69, 0x76, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x26, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, + 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x74, 0x61, 0x70, 0x72, + 0x70, 0x63, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, + 0x12, 0x1a, 0x0a, 0x08, 0x6f, 0x75, 0x74, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x6f, 0x75, 0x74, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x2f, 0x0a, 0x06, + 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x74, + 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x2f, 0x0a, + 0x13, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x68, 0x65, + 0x69, 0x67, 0x68, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x12, 0x63, 0x6f, 0x6e, 0x66, + 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x14, + 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, + 0x72, 0x72, 0x6f, 0x72, 0x22, 0x94, 0x01, 0x0a, 0x1a, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, + 0x62, 0x65, 0x53, 0x65, 0x6e, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x11, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x5f, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0f, + 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x4b, 0x65, 0x79, 0x12, + 0x21, 0x0a, 0x0c, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x4c, 0x61, 0x62, + 0x65, 0x6c, 0x12, 0x27, 0x0a, 0x0f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x73, 0x74, 0x61, + 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0xec, 0x03, 0x0a, 0x09, + 0x53, 0x65, 0x6e, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, + 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x65, 0x6e, 0x64, 0x5f, + 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x6e, + 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x33, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x63, 0x65, 0x6c, + 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x12, 0x2e, 0x74, 0x61, + 0x70, 0x72, 0x70, 0x63, 0x2e, 0x50, 0x61, 0x72, 0x63, 0x65, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x52, + 0x0a, 0x70, 0x61, 0x72, 0x63, 0x65, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x12, 0x2a, 0x0a, 0x09, 0x61, + 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0c, + 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x52, 0x09, 0x61, 0x64, + 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x12, 0x27, 0x0a, 0x0f, 0x76, 0x69, 0x72, 0x74, 0x75, + 0x61, 0x6c, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0c, + 0x52, 0x0e, 0x76, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x73, + 0x12, 0x36, 0x0a, 0x17, 0x70, 0x61, 0x73, 0x73, 0x69, 0x76, 0x65, 0x5f, 0x76, 0x69, 0x72, 0x74, + 0x75, 0x61, 0x6c, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, + 0x0c, 0x52, 0x15, 0x70, 0x61, 0x73, 0x73, 0x69, 0x76, 0x65, 0x56, 0x69, 0x72, 0x74, 0x75, 0x61, + 0x6c, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x12, 0x48, 0x0a, 0x12, 0x61, 0x6e, 0x63, 0x68, + 0x6f, 0x72, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x07, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x6e, + 0x63, 0x68, 0x6f, 0x72, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x11, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x31, 0x0a, 0x08, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x18, 0x08, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x73, + 0x73, 0x65, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x52, 0x08, 0x74, 0x72, 0x61, + 0x6e, 0x73, 0x66, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x09, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x25, 0x0a, 0x0e, 0x74, + 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x0a, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x4c, 0x61, 0x62, + 0x65, 0x6c, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x73, 0x65, 0x6e, 0x64, 0x5f, + 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x65, 0x78, + 0x74, 0x53, 0x65, 0x6e, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x22, 0x97, 0x02, 0x0a, 0x11, 0x41, + 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x5f, 0x70, 0x73, 0x62, 0x74, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0a, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x50, 0x73, 0x62, + 0x74, 0x12, 0x2e, 0x0a, 0x13, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x6f, 0x75, 0x74, 0x70, + 0x75, 0x74, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x11, + 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x49, 0x6e, 0x64, 0x65, + 0x78, 0x12, 0x26, 0x0a, 0x0f, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x66, 0x65, 0x65, 0x73, 0x5f, + 0x73, 0x61, 0x74, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x63, 0x68, 0x61, 0x69, + 0x6e, 0x46, 0x65, 0x65, 0x73, 0x53, 0x61, 0x74, 0x73, 0x12, 0x32, 0x0a, 0x16, 0x74, 0x61, 0x72, + 0x67, 0x65, 0x74, 0x5f, 0x66, 0x65, 0x65, 0x5f, 0x72, 0x61, 0x74, 0x65, 0x5f, 0x73, 0x61, 0x74, + 0x5f, 0x6b, 0x77, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x12, 0x74, 0x61, 0x72, 0x67, 0x65, + 0x74, 0x46, 0x65, 0x65, 0x52, 0x61, 0x74, 0x65, 0x53, 0x61, 0x74, 0x4b, 0x77, 0x12, 0x3a, 0x0a, + 0x10, 0x6c, 0x6e, 0x64, 0x5f, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x5f, 0x75, 0x74, 0x78, 0x6f, + 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, + 0x2e, 0x4f, 0x75, 0x74, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x0e, 0x6c, 0x6e, 0x64, 0x4c, 0x6f, + 0x63, 0x6b, 0x65, 0x64, 0x55, 0x74, 0x78, 0x6f, 0x73, 0x12, 0x19, 0x0a, 0x08, 0x66, 0x69, 0x6e, + 0x61, 0x6c, 0x5f, 0x74, 0x78, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x66, 0x69, 0x6e, + 0x61, 0x6c, 0x54, 0x78, 0x22, 0x9e, 0x01, 0x0a, 0x17, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, + 0x72, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x19, 0x0a, 0x08, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0c, 0x52, 0x07, 0x61, 0x73, 0x73, 0x65, 0x74, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x67, + 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, + 0x67, 0x72, 0x6f, 0x75, 0x70, 0x4b, 0x65, 0x79, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x4b, 0x65, 0x79, 0x12, 0x2c, 0x0a, 0x08, 0x6f, 0x75, 0x74, 0x70, 0x6f, + 0x69, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x74, 0x61, 0x70, 0x72, + 0x70, 0x63, 0x2e, 0x4f, 0x75, 0x74, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x08, 0x6f, 0x75, 0x74, + 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x22, 0x54, 0x0a, 0x18, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, + 0x72, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x38, 0x0a, 0x10, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x5f, + 0x61, 0x73, 0x73, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x74, 0x61, + 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x0f, 0x72, 0x65, 0x67, 0x69, + 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x41, 0x73, 0x73, 0x65, 0x74, 0x22, 0x44, 0x0a, 0x12, 0x4d, + 0x61, 0x63, 0x61, 0x72, 0x6f, 0x6f, 0x6e, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, + 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x06, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0xb1, 0x01, 0x0a, 0x13, 0x42, 0x61, 0x6b, 0x65, 0x4d, 0x61, 0x63, 0x61, 0x72, 0x6f, + 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3c, 0x0a, 0x0b, 0x70, 0x65, 0x72, + 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, + 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4d, 0x61, 0x63, 0x61, 0x72, 0x6f, 0x6f, 0x6e, + 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x70, 0x65, 0x72, 0x6d, + 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1e, 0x0a, 0x0b, 0x72, 0x6f, 0x6f, 0x74, 0x5f, + 0x6b, 0x65, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x72, 0x6f, + 0x6f, 0x74, 0x4b, 0x65, 0x79, 0x49, 0x64, 0x12, 0x3c, 0x0a, 0x1a, 0x61, 0x6c, 0x6c, 0x6f, 0x77, + 0x5f, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, + 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x18, 0x61, 0x6c, 0x6c, + 0x6f, 0x77, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, + 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x32, 0x0a, 0x14, 0x42, 0x61, 0x6b, 0x65, 0x4d, 0x61, 0x63, + 0x61, 0x72, 0x6f, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, + 0x08, 0x6d, 0x61, 0x63, 0x61, 0x72, 0x6f, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x6d, 0x61, 0x63, 0x61, 0x72, 0x6f, 0x6f, 0x6e, 0x2a, 0x28, 0x0a, 0x09, 0x41, 0x73, 0x73, + 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x4e, 0x4f, 0x52, 0x4d, 0x41, 0x4c, + 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x43, 0x4f, 0x4c, 0x4c, 0x45, 0x43, 0x54, 0x49, 0x42, 0x4c, + 0x45, 0x10, 0x01, 0x2a, 0x39, 0x0a, 0x0d, 0x41, 0x73, 0x73, 0x65, 0x74, 0x4d, 0x65, 0x74, 0x61, + 0x54, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x10, 0x4d, 0x45, 0x54, 0x41, 0x5f, 0x54, 0x59, 0x50, + 0x45, 0x5f, 0x4f, 0x50, 0x41, 0x51, 0x55, 0x45, 0x10, 0x00, 0x12, 0x12, 0x0a, 0x0e, 0x4d, 0x45, + 0x54, 0x41, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4a, 0x53, 0x4f, 0x4e, 0x10, 0x01, 0x2a, 0x3a, + 0x0a, 0x0c, 0x41, 0x73, 0x73, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x14, + 0x0a, 0x10, 0x41, 0x53, 0x53, 0x45, 0x54, 0x5f, 0x56, 0x45, 0x52, 0x53, 0x49, 0x4f, 0x4e, 0x5f, + 0x56, 0x30, 0x10, 0x00, 0x12, 0x14, 0x0a, 0x10, 0x41, 0x53, 0x53, 0x45, 0x54, 0x5f, 0x56, 0x45, + 0x52, 0x53, 0x49, 0x4f, 0x4e, 0x5f, 0x56, 0x31, 0x10, 0x01, 0x2a, 0x52, 0x0a, 0x0a, 0x4f, 0x75, + 0x74, 0x70, 0x75, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x12, 0x4f, 0x55, 0x54, 0x50, + 0x55, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x49, 0x4d, 0x50, 0x4c, 0x45, 0x10, 0x00, + 0x12, 0x1a, 0x0a, 0x16, 0x4f, 0x55, 0x54, 0x50, 0x55, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, + 0x53, 0x50, 0x4c, 0x49, 0x54, 0x5f, 0x52, 0x4f, 0x4f, 0x54, 0x10, 0x01, 0x22, 0x04, 0x08, 0x02, + 0x10, 0x02, 0x22, 0x04, 0x08, 0x03, 0x10, 0x03, 0x22, 0x04, 0x08, 0x04, 0x10, 0x04, 0x2a, 0x86, + 0x01, 0x0a, 0x13, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x44, 0x65, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x79, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x28, 0x0a, 0x24, 0x50, 0x52, 0x4f, 0x4f, 0x46, 0x5f, + 0x44, 0x45, 0x4c, 0x49, 0x56, 0x45, 0x52, 0x59, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, + 0x4e, 0x4f, 0x54, 0x5f, 0x41, 0x50, 0x50, 0x4c, 0x49, 0x43, 0x41, 0x42, 0x4c, 0x45, 0x10, 0x00, + 0x12, 0x22, 0x0a, 0x1e, 0x50, 0x52, 0x4f, 0x4f, 0x46, 0x5f, 0x44, 0x45, 0x4c, 0x49, 0x56, 0x45, + 0x52, 0x59, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x43, 0x4f, 0x4d, 0x50, 0x4c, 0x45, + 0x54, 0x45, 0x10, 0x01, 0x12, 0x21, 0x0a, 0x1d, 0x50, 0x52, 0x4f, 0x4f, 0x46, 0x5f, 0x44, 0x45, + 0x4c, 0x49, 0x56, 0x45, 0x52, 0x59, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x50, 0x45, + 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x2a, 0x6a, 0x0a, 0x0b, 0x41, 0x64, 0x64, 0x72, 0x56, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x18, 0x41, 0x44, 0x44, 0x52, 0x5f, 0x56, + 0x45, 0x52, 0x53, 0x49, 0x4f, 0x4e, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, + 0x45, 0x44, 0x10, 0x00, 0x12, 0x13, 0x0a, 0x0f, 0x41, 0x44, 0x44, 0x52, 0x5f, 0x56, 0x45, 0x52, + 0x53, 0x49, 0x4f, 0x4e, 0x5f, 0x56, 0x30, 0x10, 0x01, 0x12, 0x13, 0x0a, 0x0f, 0x41, 0x44, 0x44, + 0x52, 0x5f, 0x56, 0x45, 0x52, 0x53, 0x49, 0x4f, 0x4e, 0x5f, 0x56, 0x31, 0x10, 0x02, 0x12, 0x13, + 0x0a, 0x0f, 0x41, 0x44, 0x44, 0x52, 0x5f, 0x56, 0x45, 0x52, 0x53, 0x49, 0x4f, 0x4e, 0x5f, 0x56, + 0x32, 0x10, 0x03, 0x2a, 0xc9, 0x01, 0x0a, 0x0d, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x4b, 0x65, + 0x79, 0x54, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x12, 0x53, 0x43, 0x52, 0x49, 0x50, 0x54, 0x5f, + 0x4b, 0x45, 0x59, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x14, 0x0a, + 0x10, 0x53, 0x43, 0x52, 0x49, 0x50, 0x54, 0x5f, 0x4b, 0x45, 0x59, 0x5f, 0x42, 0x49, 0x50, 0x38, + 0x36, 0x10, 0x01, 0x12, 0x23, 0x0a, 0x1f, 0x53, 0x43, 0x52, 0x49, 0x50, 0x54, 0x5f, 0x4b, 0x45, + 0x59, 0x5f, 0x53, 0x43, 0x52, 0x49, 0x50, 0x54, 0x5f, 0x50, 0x41, 0x54, 0x48, 0x5f, 0x45, 0x58, + 0x54, 0x45, 0x52, 0x4e, 0x41, 0x4c, 0x10, 0x02, 0x12, 0x13, 0x0a, 0x0f, 0x53, 0x43, 0x52, 0x49, + 0x50, 0x54, 0x5f, 0x4b, 0x45, 0x59, 0x5f, 0x42, 0x55, 0x52, 0x4e, 0x10, 0x03, 0x12, 0x18, 0x0a, + 0x14, 0x53, 0x43, 0x52, 0x49, 0x50, 0x54, 0x5f, 0x4b, 0x45, 0x59, 0x5f, 0x54, 0x4f, 0x4d, 0x42, + 0x53, 0x54, 0x4f, 0x4e, 0x45, 0x10, 0x04, 0x12, 0x16, 0x0a, 0x12, 0x53, 0x43, 0x52, 0x49, 0x50, + 0x54, 0x5f, 0x4b, 0x45, 0x59, 0x5f, 0x43, 0x48, 0x41, 0x4e, 0x4e, 0x45, 0x4c, 0x10, 0x05, 0x12, + 0x1e, 0x0a, 0x1a, 0x53, 0x43, 0x52, 0x49, 0x50, 0x54, 0x5f, 0x4b, 0x45, 0x59, 0x5f, 0x55, 0x4e, + 0x49, 0x51, 0x55, 0x45, 0x5f, 0x50, 0x45, 0x44, 0x45, 0x52, 0x53, 0x45, 0x4e, 0x10, 0x06, 0x2a, + 0xd0, 0x01, 0x0a, 0x0f, 0x41, 0x64, 0x64, 0x72, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x12, 0x1d, 0x0a, 0x19, 0x41, 0x44, 0x44, 0x52, 0x5f, 0x45, 0x56, 0x45, 0x4e, + 0x54, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, + 0x10, 0x00, 0x12, 0x2a, 0x0a, 0x26, 0x41, 0x44, 0x44, 0x52, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, + 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x41, 0x43, 0x54, + 0x49, 0x4f, 0x4e, 0x5f, 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, 0x45, 0x44, 0x10, 0x01, 0x12, 0x2b, + 0x0a, 0x27, 0x41, 0x44, 0x44, 0x52, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x53, 0x54, 0x41, + 0x54, 0x55, 0x53, 0x5f, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, + 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x52, 0x4d, 0x45, 0x44, 0x10, 0x02, 0x12, 0x24, 0x0a, 0x20, 0x41, + 0x44, 0x44, 0x52, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, + 0x5f, 0x50, 0x52, 0x4f, 0x4f, 0x46, 0x5f, 0x52, 0x45, 0x43, 0x45, 0x49, 0x56, 0x45, 0x44, 0x10, + 0x03, 0x12, 0x1f, 0x0a, 0x1b, 0x41, 0x44, 0x44, 0x52, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, + 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x43, 0x4f, 0x4d, 0x50, 0x4c, 0x45, 0x54, 0x45, 0x44, + 0x10, 0x04, 0x2a, 0x9b, 0x02, 0x0a, 0x09, 0x53, 0x65, 0x6e, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, + 0x12, 0x23, 0x0a, 0x1f, 0x53, 0x45, 0x4e, 0x44, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x56, + 0x49, 0x52, 0x54, 0x55, 0x41, 0x4c, 0x5f, 0x49, 0x4e, 0x50, 0x55, 0x54, 0x5f, 0x53, 0x45, 0x4c, + 0x45, 0x43, 0x54, 0x10, 0x00, 0x12, 0x1b, 0x0a, 0x17, 0x53, 0x45, 0x4e, 0x44, 0x5f, 0x53, 0x54, + 0x41, 0x54, 0x45, 0x5f, 0x56, 0x49, 0x52, 0x54, 0x55, 0x41, 0x4c, 0x5f, 0x53, 0x49, 0x47, 0x4e, + 0x10, 0x01, 0x12, 0x1a, 0x0a, 0x16, 0x53, 0x45, 0x4e, 0x44, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, + 0x5f, 0x41, 0x4e, 0x43, 0x48, 0x4f, 0x52, 0x5f, 0x53, 0x49, 0x47, 0x4e, 0x10, 0x02, 0x12, 0x1d, + 0x0a, 0x19, 0x53, 0x45, 0x4e, 0x44, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x4c, 0x4f, 0x47, + 0x5f, 0x43, 0x4f, 0x4d, 0x4d, 0x49, 0x54, 0x4d, 0x45, 0x4e, 0x54, 0x10, 0x03, 0x12, 0x18, 0x0a, + 0x14, 0x53, 0x45, 0x4e, 0x44, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x42, 0x52, 0x4f, 0x41, + 0x44, 0x43, 0x41, 0x53, 0x54, 0x10, 0x04, 0x12, 0x20, 0x0a, 0x1c, 0x53, 0x45, 0x4e, 0x44, 0x5f, + 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x57, 0x41, 0x49, 0x54, 0x5f, 0x43, 0x4f, 0x4e, 0x46, 0x49, + 0x52, 0x4d, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x05, 0x12, 0x1b, 0x0a, 0x17, 0x53, 0x45, 0x4e, + 0x44, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x53, 0x54, 0x4f, 0x52, 0x45, 0x5f, 0x50, 0x52, + 0x4f, 0x4f, 0x46, 0x53, 0x10, 0x06, 0x12, 0x1e, 0x0a, 0x1a, 0x53, 0x45, 0x4e, 0x44, 0x5f, 0x53, + 0x54, 0x41, 0x54, 0x45, 0x5f, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x50, 0x52, + 0x4f, 0x4f, 0x46, 0x53, 0x10, 0x07, 0x12, 0x18, 0x0a, 0x14, 0x53, 0x45, 0x4e, 0x44, 0x5f, 0x53, + 0x54, 0x41, 0x54, 0x45, 0x5f, 0x43, 0x4f, 0x4d, 0x50, 0x4c, 0x45, 0x54, 0x45, 0x44, 0x10, 0x08, + 0x2a, 0x78, 0x0a, 0x0a, 0x50, 0x61, 0x72, 0x63, 0x65, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x12, 0x17, + 0x0a, 0x13, 0x50, 0x41, 0x52, 0x43, 0x45, 0x4c, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x41, 0x44, + 0x44, 0x52, 0x45, 0x53, 0x53, 0x10, 0x00, 0x12, 0x1a, 0x0a, 0x16, 0x50, 0x41, 0x52, 0x43, 0x45, + 0x4c, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x50, 0x52, 0x45, 0x5f, 0x53, 0x49, 0x47, 0x4e, 0x45, + 0x44, 0x10, 0x01, 0x12, 0x17, 0x0a, 0x13, 0x50, 0x41, 0x52, 0x43, 0x45, 0x4c, 0x5f, 0x54, 0x59, + 0x50, 0x45, 0x5f, 0x50, 0x45, 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x12, 0x1c, 0x0a, 0x18, + 0x50, 0x41, 0x52, 0x43, 0x45, 0x4c, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x50, 0x52, 0x45, 0x5f, + 0x41, 0x4e, 0x43, 0x48, 0x4f, 0x52, 0x45, 0x44, 0x10, 0x03, 0x32, 0xe2, 0x0d, 0x0a, 0x0d, 0x54, + 0x61, 0x70, 0x72, 0x6f, 0x6f, 0x74, 0x41, 0x73, 0x73, 0x65, 0x74, 0x73, 0x12, 0x41, 0x0a, 0x0a, + 0x4c, 0x69, 0x73, 0x74, 0x41, 0x73, 0x73, 0x65, 0x74, 0x73, 0x12, 0x18, 0x2e, 0x74, 0x61, 0x70, + 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x69, + 0x73, 0x74, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x43, 0x0a, 0x0a, 0x46, 0x65, 0x74, 0x63, 0x68, 0x41, 0x73, 0x73, 0x65, 0x74, 0x12, 0x19, 0x2e, + 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x46, 0x65, 0x74, 0x63, 0x68, 0x41, 0x73, 0x73, 0x65, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, + 0x63, 0x2e, 0x46, 0x65, 0x74, 0x63, 0x68, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x40, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x74, 0x78, 0x6f, + 0x73, 0x12, 0x18, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x55, + 0x74, 0x78, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x74, 0x61, + 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x74, 0x78, 0x6f, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x43, 0x0a, 0x0a, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x72, + 0x6f, 0x75, 0x70, 0x73, 0x12, 0x19, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x69, + 0x73, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x1a, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x72, 0x6f, + 0x75, 0x70, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x49, 0x0a, 0x0c, 0x4c, + 0x69, 0x73, 0x74, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x12, 0x1b, 0x2e, 0x74, 0x61, + 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, + 0x63, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4c, 0x0a, 0x0d, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x72, + 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x73, 0x12, 0x1c, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, + 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4c, + 0x69, 0x73, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x37, 0x0a, 0x0a, 0x53, 0x74, 0x6f, 0x70, 0x44, 0x61, 0x65, 0x6d, + 0x6f, 0x6e, 0x12, 0x13, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x74, 0x6f, 0x70, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, + 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x43, 0x0a, + 0x0a, 0x44, 0x65, 0x62, 0x75, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x19, 0x2e, 0x74, 0x61, + 0x70, 0x72, 0x70, 0x63, 0x2e, 0x44, 0x65, 0x62, 0x75, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, + 0x44, 0x65, 0x62, 0x75, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x41, 0x0a, 0x0a, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x64, 0x64, 0x72, 0x73, + 0x12, 0x18, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, + 0x64, 0x64, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x74, 0x61, 0x70, + 0x72, 0x70, 0x63, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x64, 0x64, 0x72, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2f, 0x0a, 0x07, 0x4e, 0x65, 0x77, 0x41, 0x64, 0x64, 0x72, + 0x12, 0x16, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x64, 0x64, + 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0c, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, + 0x63, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x12, 0x35, 0x0a, 0x0a, 0x44, 0x65, 0x63, 0x6f, 0x64, 0x65, + 0x41, 0x64, 0x64, 0x72, 0x12, 0x19, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x44, 0x65, + 0x63, 0x6f, 0x64, 0x65, 0x41, 0x64, 0x64, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x0c, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x12, 0x49, 0x0a, + 0x0c, 0x41, 0x64, 0x64, 0x72, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x73, 0x12, 0x1b, 0x2e, + 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x52, 0x65, 0x63, 0x65, 0x69, + 0x76, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x74, 0x61, 0x70, + 0x72, 0x70, 0x63, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3d, 0x0a, 0x0b, 0x56, 0x65, 0x72, 0x69, + 0x66, 0x79, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x11, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, + 0x2e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x46, 0x69, 0x6c, 0x65, 0x1a, 0x1b, 0x2e, 0x74, 0x61, 0x70, + 0x72, 0x70, 0x63, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x46, 0x0a, 0x0b, 0x44, 0x65, 0x63, 0x6f, 0x64, + 0x65, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x1a, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, + 0x44, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x44, 0x65, 0x63, 0x6f, + 0x64, 0x65, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x3c, 0x0a, 0x0b, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x1a, + 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x50, 0x72, + 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x74, 0x61, 0x70, + 0x72, 0x70, 0x63, 0x2e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x52, 0x0a, + 0x0f, 0x55, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x46, 0x69, 0x6c, 0x65, + 0x12, 0x1e, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x55, 0x6e, 0x70, 0x61, 0x63, 0x6b, + 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x1f, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x55, 0x6e, 0x70, 0x61, 0x63, 0x6b, + 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x40, 0x0a, 0x09, 0x53, 0x65, 0x6e, 0x64, 0x41, 0x73, 0x73, 0x65, 0x74, 0x12, 0x18, + 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x65, 0x6e, 0x64, 0x41, 0x73, 0x73, 0x65, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, + 0x63, 0x2e, 0x53, 0x65, 0x6e, 0x64, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x40, 0x0a, 0x09, 0x42, 0x75, 0x72, 0x6e, 0x41, 0x73, 0x73, 0x65, 0x74, + 0x12, 0x18, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x42, 0x75, 0x72, 0x6e, 0x41, 0x73, + 0x73, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x74, 0x61, 0x70, + 0x72, 0x70, 0x63, 0x2e, 0x42, 0x75, 0x72, 0x6e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x40, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x75, 0x72, + 0x6e, 0x73, 0x12, 0x18, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x69, 0x73, 0x74, + 0x42, 0x75, 0x72, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x74, + 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x75, 0x72, 0x6e, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3a, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x49, 0x6e, + 0x66, 0x6f, 0x12, 0x16, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x47, 0x65, 0x74, 0x49, + 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x74, 0x61, 0x70, + 0x72, 0x70, 0x63, 0x2e, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x49, 0x0a, 0x0c, 0x42, 0x61, 0x6b, 0x65, 0x4d, 0x61, 0x63, 0x61, 0x72, + 0x6f, 0x6f, 0x6e, 0x12, 0x1b, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x42, 0x61, 0x6b, + 0x65, 0x4d, 0x61, 0x63, 0x61, 0x72, 0x6f, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x1c, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x42, 0x61, 0x6b, 0x65, 0x4d, 0x61, + 0x63, 0x61, 0x72, 0x6f, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4f, + 0x0a, 0x0e, 0x46, 0x65, 0x74, 0x63, 0x68, 0x41, 0x73, 0x73, 0x65, 0x74, 0x4d, 0x65, 0x74, 0x61, + 0x12, 0x1d, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x46, 0x65, 0x74, 0x63, 0x68, 0x41, + 0x73, 0x73, 0x65, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x1e, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x46, 0x65, 0x74, 0x63, 0x68, 0x41, 0x73, + 0x73, 0x65, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x57, 0x0a, 0x16, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x63, 0x65, + 0x69, 0x76, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x25, 0x2e, 0x74, 0x61, 0x70, 0x72, + 0x70, 0x63, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x63, 0x65, + 0x69, 0x76, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x14, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, + 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x30, 0x01, 0x12, 0x4e, 0x0a, 0x13, 0x53, 0x75, 0x62, 0x73, + 0x63, 0x72, 0x69, 0x62, 0x65, 0x53, 0x65, 0x6e, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x12, + 0x22, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, + 0x62, 0x65, 0x53, 0x65, 0x6e, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x65, 0x6e, + 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x30, 0x01, 0x12, 0x55, 0x0a, 0x10, 0x52, 0x65, 0x67, 0x69, + 0x73, 0x74, 0x65, 0x72, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x12, 0x1f, 0x2e, 0x74, + 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x54, 0x72, + 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, + 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x54, + 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, + 0x30, 0x5a, 0x2e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6c, 0x69, + 0x67, 0x68, 0x74, 0x6e, 0x69, 0x6e, 0x67, 0x6c, 0x61, 0x62, 0x73, 0x2f, 0x74, 0x61, 0x70, 0x72, + 0x6f, 0x6f, 0x74, 0x2d, 0x61, 0x73, 0x73, 0x65, 0x74, 0x73, 0x2f, 0x74, 0x61, 0x70, 0x72, 0x70, + 0x63, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -8951,6 +8964,7 @@ var file_taprootassets_proto_goTypes = []any{ nil, // 102: taprpc.FetchAssetMetaResponse.UnknownOddTypesEntry (*OutPoint)(nil), // 103: taprpc.OutPoint (SortDirection)(0), // 104: taprpc.SortDirection + (AnchorTxVersion)(0), // 105: taprpc.AnchorTxVersion } var file_taprootassets_proto_depIdxs = []int32{ 1, // 0: taprpc.AssetMeta.type:type_name -> taprpc.AssetMetaType @@ -9023,81 +9037,82 @@ var file_taprootassets_proto_depIdxs = []int32{ 104, // 67: taprpc.AddrReceivesRequest.direction:type_name -> taprpc.SortDirection 72, // 68: taprpc.AddrReceivesResponse.events:type_name -> taprpc.AddrEvent 76, // 69: taprpc.SendAssetRequest.addresses_with_amounts:type_name -> taprpc.AddressWithAmount - 44, // 70: taprpc.SendAssetResponse.transfer:type_name -> taprpc.AssetTransfer - 1, // 71: taprpc.FetchAssetMetaResponse.type:type_name -> taprpc.AssetMetaType - 102, // 72: taprpc.FetchAssetMetaResponse.unknown_odd_types:type_name -> taprpc.FetchAssetMetaResponse.UnknownOddTypesEntry - 44, // 73: taprpc.BurnAssetResponse.burn_transfer:type_name -> taprpc.AssetTransfer - 65, // 74: taprpc.BurnAssetResponse.burn_proof:type_name -> taprpc.DecodedProof - 86, // 75: taprpc.ListBurnsResponse.burns:type_name -> taprpc.AssetBurn - 52, // 76: taprpc.ReceiveEvent.address:type_name -> taprpc.Addr - 7, // 77: taprpc.ReceiveEvent.status:type_name -> taprpc.AddrEventStatus - 9, // 78: taprpc.SendEvent.parcel_type:type_name -> taprpc.ParcelType - 52, // 79: taprpc.SendEvent.addresses:type_name -> taprpc.Addr - 92, // 80: taprpc.SendEvent.anchor_transaction:type_name -> taprpc.AnchorTransaction - 44, // 81: taprpc.SendEvent.transfer:type_name -> taprpc.AssetTransfer - 103, // 82: taprpc.AnchorTransaction.lnd_locked_utxos:type_name -> taprpc.OutPoint - 103, // 83: taprpc.RegisterTransferRequest.outpoint:type_name -> taprpc.OutPoint - 26, // 84: taprpc.RegisterTransferResponse.registered_asset:type_name -> taprpc.Asset - 95, // 85: taprpc.BakeMacaroonRequest.permissions:type_name -> taprpc.MacaroonPermission - 31, // 86: taprpc.ListUtxosResponse.ManagedUtxosEntry.value:type_name -> taprpc.ManagedUtxo - 35, // 87: taprpc.ListGroupsResponse.GroupsEntry.value:type_name -> taprpc.GroupedAssets - 38, // 88: taprpc.ListBalancesResponse.AssetBalancesEntry.value:type_name -> taprpc.AssetBalance - 39, // 89: taprpc.ListBalancesResponse.AssetGroupBalancesEntry.value:type_name -> taprpc.AssetGroupBalance - 14, // 90: taprpc.TaprootAssets.ListAssets:input_type -> taprpc.ListAssetRequest - 12, // 91: taprpc.TaprootAssets.FetchAsset:input_type -> taprpc.FetchAssetRequest - 30, // 92: taprpc.TaprootAssets.ListUtxos:input_type -> taprpc.ListUtxosRequest - 33, // 93: taprpc.TaprootAssets.ListGroups:input_type -> taprpc.ListGroupsRequest - 37, // 94: taprpc.TaprootAssets.ListBalances:input_type -> taprpc.ListBalancesRequest - 41, // 95: taprpc.TaprootAssets.ListTransfers:input_type -> taprpc.ListTransfersRequest - 48, // 96: taprpc.TaprootAssets.StopDaemon:input_type -> taprpc.StopRequest - 50, // 97: taprpc.TaprootAssets.DebugLevel:input_type -> taprpc.DebugLevelRequest - 53, // 98: taprpc.TaprootAssets.QueryAddrs:input_type -> taprpc.QueryAddrRequest - 55, // 99: taprpc.TaprootAssets.NewAddr:input_type -> taprpc.NewAddrRequest - 63, // 100: taprpc.TaprootAssets.DecodeAddr:input_type -> taprpc.DecodeAddrRequest - 73, // 101: taprpc.TaprootAssets.AddrReceives:input_type -> taprpc.AddrReceivesRequest - 64, // 102: taprpc.TaprootAssets.VerifyProof:input_type -> taprpc.ProofFile - 67, // 103: taprpc.TaprootAssets.DecodeProof:input_type -> taprpc.DecodeProofRequest - 69, // 104: taprpc.TaprootAssets.ExportProof:input_type -> taprpc.ExportProofRequest - 70, // 105: taprpc.TaprootAssets.UnpackProofFile:input_type -> taprpc.UnpackProofFileRequest - 75, // 106: taprpc.TaprootAssets.SendAsset:input_type -> taprpc.SendAssetRequest - 83, // 107: taprpc.TaprootAssets.BurnAsset:input_type -> taprpc.BurnAssetRequest - 85, // 108: taprpc.TaprootAssets.ListBurns:input_type -> taprpc.ListBurnsRequest - 79, // 109: taprpc.TaprootAssets.GetInfo:input_type -> taprpc.GetInfoRequest - 96, // 110: taprpc.TaprootAssets.BakeMacaroon:input_type -> taprpc.BakeMacaroonRequest - 81, // 111: taprpc.TaprootAssets.FetchAssetMeta:input_type -> taprpc.FetchAssetMetaRequest - 88, // 112: taprpc.TaprootAssets.SubscribeReceiveEvents:input_type -> taprpc.SubscribeReceiveEventsRequest - 90, // 113: taprpc.TaprootAssets.SubscribeSendEvents:input_type -> taprpc.SubscribeSendEventsRequest - 93, // 114: taprpc.TaprootAssets.RegisterTransfer:input_type -> taprpc.RegisterTransferRequest - 29, // 115: taprpc.TaprootAssets.ListAssets:output_type -> taprpc.ListAssetResponse - 13, // 116: taprpc.TaprootAssets.FetchAsset:output_type -> taprpc.FetchAssetResponse - 32, // 117: taprpc.TaprootAssets.ListUtxos:output_type -> taprpc.ListUtxosResponse - 36, // 118: taprpc.TaprootAssets.ListGroups:output_type -> taprpc.ListGroupsResponse - 40, // 119: taprpc.TaprootAssets.ListBalances:output_type -> taprpc.ListBalancesResponse - 42, // 120: taprpc.TaprootAssets.ListTransfers:output_type -> taprpc.ListTransfersResponse - 49, // 121: taprpc.TaprootAssets.StopDaemon:output_type -> taprpc.StopResponse - 51, // 122: taprpc.TaprootAssets.DebugLevel:output_type -> taprpc.DebugLevelResponse - 54, // 123: taprpc.TaprootAssets.QueryAddrs:output_type -> taprpc.QueryAddrResponse - 52, // 124: taprpc.TaprootAssets.NewAddr:output_type -> taprpc.Addr - 52, // 125: taprpc.TaprootAssets.DecodeAddr:output_type -> taprpc.Addr - 74, // 126: taprpc.TaprootAssets.AddrReceives:output_type -> taprpc.AddrReceivesResponse - 66, // 127: taprpc.TaprootAssets.VerifyProof:output_type -> taprpc.VerifyProofResponse - 68, // 128: taprpc.TaprootAssets.DecodeProof:output_type -> taprpc.DecodeProofResponse - 64, // 129: taprpc.TaprootAssets.ExportProof:output_type -> taprpc.ProofFile - 71, // 130: taprpc.TaprootAssets.UnpackProofFile:output_type -> taprpc.UnpackProofFileResponse - 78, // 131: taprpc.TaprootAssets.SendAsset:output_type -> taprpc.SendAssetResponse - 84, // 132: taprpc.TaprootAssets.BurnAsset:output_type -> taprpc.BurnAssetResponse - 87, // 133: taprpc.TaprootAssets.ListBurns:output_type -> taprpc.ListBurnsResponse - 80, // 134: taprpc.TaprootAssets.GetInfo:output_type -> taprpc.GetInfoResponse - 97, // 135: taprpc.TaprootAssets.BakeMacaroon:output_type -> taprpc.BakeMacaroonResponse - 82, // 136: taprpc.TaprootAssets.FetchAssetMeta:output_type -> taprpc.FetchAssetMetaResponse - 89, // 137: taprpc.TaprootAssets.SubscribeReceiveEvents:output_type -> taprpc.ReceiveEvent - 91, // 138: taprpc.TaprootAssets.SubscribeSendEvents:output_type -> taprpc.SendEvent - 94, // 139: taprpc.TaprootAssets.RegisterTransfer:output_type -> taprpc.RegisterTransferResponse - 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 + 105, // 70: taprpc.SendAssetRequest.anchor_tx_version:type_name -> taprpc.AnchorTxVersion + 44, // 71: taprpc.SendAssetResponse.transfer:type_name -> taprpc.AssetTransfer + 1, // 72: taprpc.FetchAssetMetaResponse.type:type_name -> taprpc.AssetMetaType + 102, // 73: taprpc.FetchAssetMetaResponse.unknown_odd_types:type_name -> taprpc.FetchAssetMetaResponse.UnknownOddTypesEntry + 44, // 74: taprpc.BurnAssetResponse.burn_transfer:type_name -> taprpc.AssetTransfer + 65, // 75: taprpc.BurnAssetResponse.burn_proof:type_name -> taprpc.DecodedProof + 86, // 76: taprpc.ListBurnsResponse.burns:type_name -> taprpc.AssetBurn + 52, // 77: taprpc.ReceiveEvent.address:type_name -> taprpc.Addr + 7, // 78: taprpc.ReceiveEvent.status:type_name -> taprpc.AddrEventStatus + 9, // 79: taprpc.SendEvent.parcel_type:type_name -> taprpc.ParcelType + 52, // 80: taprpc.SendEvent.addresses:type_name -> taprpc.Addr + 92, // 81: taprpc.SendEvent.anchor_transaction:type_name -> taprpc.AnchorTransaction + 44, // 82: taprpc.SendEvent.transfer:type_name -> taprpc.AssetTransfer + 103, // 83: taprpc.AnchorTransaction.lnd_locked_utxos:type_name -> taprpc.OutPoint + 103, // 84: taprpc.RegisterTransferRequest.outpoint:type_name -> taprpc.OutPoint + 26, // 85: taprpc.RegisterTransferResponse.registered_asset:type_name -> taprpc.Asset + 95, // 86: taprpc.BakeMacaroonRequest.permissions:type_name -> taprpc.MacaroonPermission + 31, // 87: taprpc.ListUtxosResponse.ManagedUtxosEntry.value:type_name -> taprpc.ManagedUtxo + 35, // 88: taprpc.ListGroupsResponse.GroupsEntry.value:type_name -> taprpc.GroupedAssets + 38, // 89: taprpc.ListBalancesResponse.AssetBalancesEntry.value:type_name -> taprpc.AssetBalance + 39, // 90: taprpc.ListBalancesResponse.AssetGroupBalancesEntry.value:type_name -> taprpc.AssetGroupBalance + 14, // 91: taprpc.TaprootAssets.ListAssets:input_type -> taprpc.ListAssetRequest + 12, // 92: taprpc.TaprootAssets.FetchAsset:input_type -> taprpc.FetchAssetRequest + 30, // 93: taprpc.TaprootAssets.ListUtxos:input_type -> taprpc.ListUtxosRequest + 33, // 94: taprpc.TaprootAssets.ListGroups:input_type -> taprpc.ListGroupsRequest + 37, // 95: taprpc.TaprootAssets.ListBalances:input_type -> taprpc.ListBalancesRequest + 41, // 96: taprpc.TaprootAssets.ListTransfers:input_type -> taprpc.ListTransfersRequest + 48, // 97: taprpc.TaprootAssets.StopDaemon:input_type -> taprpc.StopRequest + 50, // 98: taprpc.TaprootAssets.DebugLevel:input_type -> taprpc.DebugLevelRequest + 53, // 99: taprpc.TaprootAssets.QueryAddrs:input_type -> taprpc.QueryAddrRequest + 55, // 100: taprpc.TaprootAssets.NewAddr:input_type -> taprpc.NewAddrRequest + 63, // 101: taprpc.TaprootAssets.DecodeAddr:input_type -> taprpc.DecodeAddrRequest + 73, // 102: taprpc.TaprootAssets.AddrReceives:input_type -> taprpc.AddrReceivesRequest + 64, // 103: taprpc.TaprootAssets.VerifyProof:input_type -> taprpc.ProofFile + 67, // 104: taprpc.TaprootAssets.DecodeProof:input_type -> taprpc.DecodeProofRequest + 69, // 105: taprpc.TaprootAssets.ExportProof:input_type -> taprpc.ExportProofRequest + 70, // 106: taprpc.TaprootAssets.UnpackProofFile:input_type -> taprpc.UnpackProofFileRequest + 75, // 107: taprpc.TaprootAssets.SendAsset:input_type -> taprpc.SendAssetRequest + 83, // 108: taprpc.TaprootAssets.BurnAsset:input_type -> taprpc.BurnAssetRequest + 85, // 109: taprpc.TaprootAssets.ListBurns:input_type -> taprpc.ListBurnsRequest + 79, // 110: taprpc.TaprootAssets.GetInfo:input_type -> taprpc.GetInfoRequest + 96, // 111: taprpc.TaprootAssets.BakeMacaroon:input_type -> taprpc.BakeMacaroonRequest + 81, // 112: taprpc.TaprootAssets.FetchAssetMeta:input_type -> taprpc.FetchAssetMetaRequest + 88, // 113: taprpc.TaprootAssets.SubscribeReceiveEvents:input_type -> taprpc.SubscribeReceiveEventsRequest + 90, // 114: taprpc.TaprootAssets.SubscribeSendEvents:input_type -> taprpc.SubscribeSendEventsRequest + 93, // 115: taprpc.TaprootAssets.RegisterTransfer:input_type -> taprpc.RegisterTransferRequest + 29, // 116: taprpc.TaprootAssets.ListAssets:output_type -> taprpc.ListAssetResponse + 13, // 117: taprpc.TaprootAssets.FetchAsset:output_type -> taprpc.FetchAssetResponse + 32, // 118: taprpc.TaprootAssets.ListUtxos:output_type -> taprpc.ListUtxosResponse + 36, // 119: taprpc.TaprootAssets.ListGroups:output_type -> taprpc.ListGroupsResponse + 40, // 120: taprpc.TaprootAssets.ListBalances:output_type -> taprpc.ListBalancesResponse + 42, // 121: taprpc.TaprootAssets.ListTransfers:output_type -> taprpc.ListTransfersResponse + 49, // 122: taprpc.TaprootAssets.StopDaemon:output_type -> taprpc.StopResponse + 51, // 123: taprpc.TaprootAssets.DebugLevel:output_type -> taprpc.DebugLevelResponse + 54, // 124: taprpc.TaprootAssets.QueryAddrs:output_type -> taprpc.QueryAddrResponse + 52, // 125: taprpc.TaprootAssets.NewAddr:output_type -> taprpc.Addr + 52, // 126: taprpc.TaprootAssets.DecodeAddr:output_type -> taprpc.Addr + 74, // 127: taprpc.TaprootAssets.AddrReceives:output_type -> taprpc.AddrReceivesResponse + 66, // 128: taprpc.TaprootAssets.VerifyProof:output_type -> taprpc.VerifyProofResponse + 68, // 129: taprpc.TaprootAssets.DecodeProof:output_type -> taprpc.DecodeProofResponse + 64, // 130: taprpc.TaprootAssets.ExportProof:output_type -> taprpc.ProofFile + 71, // 131: taprpc.TaprootAssets.UnpackProofFile:output_type -> taprpc.UnpackProofFileResponse + 78, // 132: taprpc.TaprootAssets.SendAsset:output_type -> taprpc.SendAssetResponse + 84, // 133: taprpc.TaprootAssets.BurnAsset:output_type -> taprpc.BurnAssetResponse + 87, // 134: taprpc.TaprootAssets.ListBurns:output_type -> taprpc.ListBurnsResponse + 80, // 135: taprpc.TaprootAssets.GetInfo:output_type -> taprpc.GetInfoResponse + 97, // 136: taprpc.TaprootAssets.BakeMacaroon:output_type -> taprpc.BakeMacaroonResponse + 82, // 137: taprpc.TaprootAssets.FetchAssetMeta:output_type -> taprpc.FetchAssetMetaResponse + 89, // 138: taprpc.TaprootAssets.SubscribeReceiveEvents:output_type -> taprpc.ReceiveEvent + 91, // 139: taprpc.TaprootAssets.SubscribeSendEvents:output_type -> taprpc.SendEvent + 94, // 140: taprpc.TaprootAssets.RegisterTransfer:output_type -> taprpc.RegisterTransferResponse + 116, // [116:141] is the sub-list for method output_type + 91, // [91:116] is the sub-list for method input_type + 91, // [91:91] is the sub-list for extension type_name + 91, // [91:91] is the sub-list for extension extendee + 0, // [0:91] is the sub-list for field type_name } func init() { file_taprootassets_proto_init() } diff --git a/taprpc/taprootassets.proto b/taprpc/taprootassets.proto index 52a840a4e8..0e5abcd52a 100644 --- a/taprpc/taprootassets.proto +++ b/taprpc/taprootassets.proto @@ -1659,6 +1659,9 @@ message SendAssetRequest { // meaning that if addresses_with_amounts is set, then tap_addrs must be // empty, and vice versa. repeated AddressWithAmount addresses_with_amounts = 5; + + // The version to use when creating a new send anchor transaction. + AnchorTxVersion anchor_tx_version = 6; } message AddressWithAmount { diff --git a/taprpc/taprootassets.swagger.json b/taprpc/taprootassets.swagger.json index a437a5aba2..9dbbeb5715 100644 --- a/taprpc/taprootassets.swagger.json +++ b/taprpc/taprootassets.swagger.json @@ -1709,6 +1709,16 @@ } } }, + "taprpcAnchorTxVersion": { + "type": "string", + "enum": [ + "ANCHOR_TX_VERSION_UNSPECIFIED", + "ANCHOR_TX_VERSION_V2", + "ANCHOR_TX_VERSION_V3" + ], + "default": "ANCHOR_TX_VERSION_UNSPECIFIED", + "description": " - ANCHOR_TX_VERSION_UNSPECIFIED: Use the daemon default anchor transaction version, currently v2.\n - ANCHOR_TX_VERSION_V2: Create new anchor transactions with version 2.\n - ANCHOR_TX_VERSION_V3: Create new anchor transactions with version 3 (TRUC)." + }, "taprpcAsset": { "type": "object", "properties": { @@ -2979,6 +2989,10 @@ "$ref": "#/definitions/taprpcAddressWithAmount" }, "description": "A list of addresses and the amounts of asset units to send to them. This\nmust be used for V2 TAP addresses that don't specify an amount in the\naddress itself and allow the sender to choose the amount to send. The\ntap_addrs and addresses_with_amounts lists are mutually exclusive,\nmeaning that if addresses_with_amounts is set, then tap_addrs must be\nempty, and vice versa." + }, + "anchor_tx_version": { + "$ref": "#/definitions/taprpcAnchorTxVersion", + "description": "The version to use when creating a new send anchor transaction." } } }, diff --git a/tapscript/tx.go b/tapscript/tx.go index 9155385005..d6e35f96c0 100644 --- a/tapscript/tx.go +++ b/tapscript/tx.go @@ -210,6 +210,11 @@ func VirtualTx(newAsset *asset.Asset, prevAssets commitment.InputSet) ( // With our single input and output mapped, we're ready to construct our // virtual transaction. + // + // IMPORTANT: The virtual transaction version must remain at v2 for + // backwards compatibility. Changing the version would invalidate all + // existing asset witness signatures. Only the anchor (real Bitcoin) + // transactions use v3. virtualTx := wire.NewMsgTx(2) virtualTx.AddTxIn(txIn) virtualTx.AddTxOut(txOut) diff --git a/tapsend/anchor_tx.go b/tapsend/anchor_tx.go new file mode 100644 index 0000000000..5d89a27c19 --- /dev/null +++ b/tapsend/anchor_tx.go @@ -0,0 +1,54 @@ +package tapsend + +import "fmt" + +const ( + // AnchorTxVersionV2 is the default anchor transaction version. We keep + // v2 as the default to maximize propagation compatibility. + AnchorTxVersionV2 int32 = 2 + + // AnchorTxVersionV3 is the TRUC transaction version. + AnchorTxVersionV3 int32 = 3 + + // DefaultAnchorTxVersion is the transaction version used when callers + // do not explicitly opt into a newer version. + DefaultAnchorTxVersion = AnchorTxVersionV2 +) + +// AnchorTxConfig holds the configurable fields for newly constructed anchor +// transaction templates. +type AnchorTxConfig struct { + TxVersion int32 +} + +// AnchorTxOption configures a newly constructed anchor transaction template. +type AnchorTxOption func(*AnchorTxConfig) + +func defaultAnchorTxConfig() AnchorTxConfig { + return AnchorTxConfig{ + TxVersion: DefaultAnchorTxVersion, + } +} + +// WithAnchorTxVersion configures the version of a newly constructed anchor +// transaction template. +func WithAnchorTxVersion(version int32) AnchorTxOption { + return func(cfg *AnchorTxConfig) { + cfg.TxVersion = version + } +} + +// ResolveAnchorTxVersion validates an anchor transaction version and applies +// the default if none was specified. +func ResolveAnchorTxVersion(version int32) (int32, error) { + switch version { + case 0, DefaultAnchorTxVersion: + return DefaultAnchorTxVersion, nil + + case AnchorTxVersionV3: + return AnchorTxVersionV3, nil + + default: + return 0, fmt.Errorf("unknown anchor tx version: %d", version) + } +} diff --git a/tapsend/proof_test.go b/tapsend/proof_test.go index 72707d7a1a..5d2cc29905 100644 --- a/tapsend/proof_test.go +++ b/tapsend/proof_test.go @@ -86,7 +86,7 @@ func createProofSuffix(t *testing.T, stxoProof bool, expectedErr string) { createPacket(t, testAssets[3], false, internalKey2, 2), } - wireTx := wire.NewMsgTx(2) + wireTx := wire.NewMsgTx(3) wireTx.TxIn = []*wire.TxIn{{ PreviousOutPoint: wire.OutPoint{}, }} diff --git a/tapsend/send.go b/tapsend/send.go index 1247c8b0de..8978792171 100644 --- a/tapsend/send.go +++ b/tapsend/send.go @@ -1097,7 +1097,19 @@ func commitPacket(vPkt *tappsbt.VPacket, noSTXOProofs bool, } // CreateAnchorTx creates a template BTC anchor TX with dummy outputs. -func CreateAnchorTx(vPackets []*tappsbt.VPacket) (*psbt.Packet, error) { +func CreateAnchorTx(vPackets []*tappsbt.VPacket, + opts ...AnchorTxOption) (*psbt.Packet, error) { + + cfg := defaultAnchorTxConfig() + for _, opt := range opts { + opt(&cfg) + } + + txVersion, err := ResolveAnchorTxVersion(cfg.TxVersion) + if err != nil { + return nil, err + } + // We locate the highest anchor output index in all virtual packets to // create a template TX with the correct number of outputs. var maxOutputIndex uint32 @@ -1115,7 +1127,7 @@ func CreateAnchorTx(vPackets []*tappsbt.VPacket) (*psbt.Packet, error) { } } - txTemplate := wire.NewMsgTx(2) + txTemplate := wire.NewMsgTx(txVersion) // Zero is a valid anchor output index, so we need to do <= here. for i := uint32(0); i <= maxOutputIndex; i++ { @@ -1165,15 +1177,15 @@ func CreateAnchorTx(vPackets []*tappsbt.VPacket) (*psbt.Packet, error) { // necessary inputs and outputs to anchor the virtual packets, but without any // signatures. The main difference to CreateAnchorTx is that this function // populates the inputs with the witness UTXO and derivation path information. -func PrepareAnchoringTemplate( - vPackets []*tappsbt.VPacket) (*psbt.Packet, error) { +func PrepareAnchoringTemplate(vPackets []*tappsbt.VPacket, + opts ...AnchorTxOption) (*psbt.Packet, error) { err := ValidateVPacketVersions(vPackets) if err != nil { return nil, err } - btcPacket, err := CreateAnchorTx(vPackets) + btcPacket, err := CreateAnchorTx(vPackets, opts...) if err != nil { return nil, err } diff --git a/tapsend/send_test.go b/tapsend/send_test.go index 9ca3093cc9..8714252423 100644 --- a/tapsend/send_test.go +++ b/tapsend/send_test.go @@ -1387,6 +1387,51 @@ func TestUpdateTaprootOutputKeys(t *testing.T) { } } +func TestCreateAnchorTxVersion(t *testing.T) { + t.Parallel() + + pkt := &tappsbt.VPacket{ + Outputs: []*tappsbt.VOutput{{ + AnchorOutputIndex: 0, + AnchorOutputInternalKey: test.RandPubKey(t), + }}, + } + + testCases := []struct { + name string + opts []tapsend.AnchorTxOption + want int32 + }{ + { + name: "default v2", + want: tapsend.DefaultAnchorTxVersion, + }, + { + name: "explicit v3", + opts: []tapsend.AnchorTxOption{ + tapsend.WithAnchorTxVersion( + tapsend.AnchorTxVersionV3, + ), + }, + want: tapsend.AnchorTxVersionV3, + }, + } + + for _, testCase := range testCases { + testCase := testCase + + t.Run(testCase.name, func(t *testing.T) { + btcPkt, err := tapsend.CreateAnchorTx( + []*tappsbt.VPacket{pkt}, testCase.opts..., + ) + require.NoError(t, err) + require.Equal( + t, testCase.want, btcPkt.UnsignedTx.Version, + ) + }) + } +} + var updateTaprootOutputKeysTestCases = []testCase{{ name: "missing change commitment", f: func(t *testing.T) error { diff --git a/universe/supplycommit/env.go b/universe/supplycommit/env.go index de772d5dc0..5ef3119d9d 100644 --- a/universe/supplycommit/env.go +++ b/universe/supplycommit/env.go @@ -931,6 +931,10 @@ type Environment struct { // commitment transaction. CommitConfTarget uint32 + // AnchorTxVersion is the default version to use for newly created + // supply-commitment transactions. + AnchorTxVersion int32 + // ChainParams is the chain parameters for the chain that we're // operating on. ChainParams chaincfg.Params diff --git a/universe/supplycommit/manager.go b/universe/supplycommit/manager.go index a8ed0a9741..979f6b6b52 100644 --- a/universe/supplycommit/manager.go +++ b/universe/supplycommit/manager.go @@ -89,6 +89,11 @@ type ManagerCfg struct { // IgnoreCheckerCache is used to invalidate the ignore cache when a new // supply commitment is created. IgnoreCheckerCache IgnoreCheckerCache + + // AnchorTxVersion is the default version to use for newly created + // supply-commitment transactions when no request-specific version was + // propagated into the state machine. + AnchorTxVersion int32 } // Manager is a manager for multiple supply commitment state @@ -162,6 +167,7 @@ func (m *Manager) startAssetSM(ctx context.Context, SupplySyncer: m.cfg.SupplySyncer, StateLog: m.cfg.StateLog, CommitConfTarget: DefaultCommitConfTarget, + AnchorTxVersion: m.cfg.AnchorTxVersion, ChainParams: m.cfg.ChainParams, IgnoreCheckerCache: m.cfg.IgnoreCheckerCache, } @@ -444,12 +450,13 @@ func (m *Manager) SendEventSync(ctx context.Context, assetSpec asset.Specifier, // NOTE: This implements the tapgarden.MintSupplyCommitter interface. func (m *Manager) SendMintEvent(ctx context.Context, assetSpec asset.Specifier, leafKey universe.UniqueLeafKey, issuanceProof universe.Leaf, - mintBlockHeight uint32) error { + mintBlockHeight uint32, anchorTxVersion int32) error { mintEvent := &NewMintEvent{ - LeafKey: leafKey, - IssuanceProof: issuanceProof, - MintHeight: mintBlockHeight, + LeafKey: leafKey, + IssuanceProof: issuanceProof, + MintHeight: mintBlockHeight, + AnchorTxVersion: anchorTxVersion, } return m.SendEventSync(ctx, assetSpec, mintEvent) diff --git a/universe/supplycommit/state_machine_test.go b/universe/supplycommit/state_machine_test.go index f027df3015..bcfd4bfe4e 100644 --- a/universe/supplycommit/state_machine_test.go +++ b/universe/supplycommit/state_machine_test.go @@ -161,6 +161,7 @@ func newSupplyCommitTestHarness(t *testing.T, AssetLookup: mAssetLookup, SupplySyncer: mSupplySyncer, CommitConfTarget: DefaultCommitConfTarget, + AnchorTxVersion: tapsend.DefaultAnchorTxVersion, IgnoreCheckerCache: mCache, } @@ -440,7 +441,7 @@ func (h *supplyCommitTestHarness) expectPsbtFunding() { changeIdx int32, ) (*tapsend.FundedPsbt, error) { - fundedTx := wire.NewMsgTx(2) + fundedTx := wire.NewMsgTx(3) fundedTx.AddTxIn( &wire.TxIn{PreviousOutPoint: randOutPoint(h.t)}, ) @@ -969,7 +970,7 @@ func TestSupplyCommitTxSignStateTransitions(t *testing.T) { testAssetID, randGroupKey, ) - dummyTx := wire.NewMsgTx(2) + dummyTx := wire.NewMsgTx(3) dummyTx.AddTxOut(&wire.TxOut{PkScript: []byte("test"), Value: 1}) internalKey, _ := test.RandKeyDesc(t) @@ -1064,7 +1065,7 @@ func TestSupplyCommitBroadcastStateTransitions(t *testing.T) { randGroupKey := test.RandPubKey(t) defaultAssetSpec := asset.NewSpecifierFromGroupKey(*randGroupKey) - dummyTx := wire.NewMsgTx(2) + dummyTx := wire.NewMsgTx(3) dummyTx.AddTxOut(&wire.TxOut{PkScript: []byte("testscript"), Value: 1}) initialTransition := SupplyStateTransition{ NewCommitment: RootCommitment{ @@ -1407,7 +1408,7 @@ func TestSupplyUpdateEventTypes(t *testing.T) { // A random block containing a transaction is generated to serve // as part of the proof. - dummyTx := wire.NewMsgTx(2) + dummyTx := wire.NewMsgTx(3) dummyTx.AddTxOut( &wire.TxOut{Value: 1000, PkScript: []byte("dummy")}, ) @@ -1506,7 +1507,7 @@ func TestSupplyUpdateEventTypes(t *testing.T) { scriptKey := test.RandPubKey(t) outpoint := randOutPoint(t) - dummyTx := wire.NewMsgTx(2) + dummyTx := wire.NewMsgTx(3) dummyTx.AddTxIn( &wire.TxIn{PreviousOutPoint: outpoint}, ) @@ -1598,7 +1599,7 @@ func TestTxInMethods(t *testing.T) { t.Parallel() t.Run("pre_commitment_tx_in", func(t *testing.T) { - mintingTx := wire.NewMsgTx(2) + mintingTx := wire.NewMsgTx(3) mintingTx.AddTxOut( &wire.TxOut{Value: 1000, PkScript: []byte("test")}, ) @@ -1616,7 +1617,7 @@ func TestTxInMethods(t *testing.T) { t.Run("root_commitment_tx_in", func(t *testing.T) { rootCommit := RootCommitment{ - Txn: wire.NewMsgTx(2), + Txn: wire.NewMsgTx(3), TxOutIdx: 1, } @@ -1794,7 +1795,7 @@ func TestSupplySubTreeUniverseKey(t *testing.T) { func TestSpendEventMethods(t *testing.T) { t.Parallel() - tx := wire.NewMsgTx(2) + tx := wire.NewMsgTx(3) spendDetail := &chainntnfs.SpendDetail{ SpendingTx: tx, @@ -1886,7 +1887,7 @@ func TestDanglingUpdatesFullCycle(t *testing.T) { h.expectFullCommitmentCycleMocks(true) // We'll now make a dummy block to send the confirmation event. - dummyTx := wire.NewMsgTx(2) + dummyTx := wire.NewMsgTx(3) dummyTx.AddTxOut(&wire.TxOut{PkScript: []byte("test"), Value: 1}) block := &wire.MsgBlock{ Header: wire.BlockHeader{Timestamp: time.Now()}, @@ -1989,7 +1990,7 @@ func TestDanglingUpdatesAcrossStates(t *testing.T) { // Now, we'll set up again for the next cycle. h.expectFullCommitmentCycleMocks(true) - dummyTx := wire.NewMsgTx(2) + dummyTx := wire.NewMsgTx(3) dummyTx.AddTxOut( &wire.TxOut{PkScript: []byte("test"), Value: 1}, ) diff --git a/universe/supplycommit/states.go b/universe/supplycommit/states.go index 18dc22fe98..8f4c4f90cf 100644 --- a/universe/supplycommit/states.go +++ b/universe/supplycommit/states.go @@ -3,6 +3,7 @@ package supplycommit import ( "bytes" "context" + "encoding/binary" "fmt" "io" @@ -292,6 +293,10 @@ type NewMintEvent struct { // MintHeight is the height of the block that contains the mint. MintHeight uint32 + // AnchorTxVersion is the version to use for the follow-on + // supply-commitment transaction that commits this mint update. + AnchorTxVersion int32 + // Done is an optional channel that will receive an error (or nil for // success) when the event has been processed and written to disk. // If nil, the event is processed asynchronously. @@ -350,9 +355,22 @@ func (n *NewMintEvent) UniverseLeafNode() (*mssmt.LeafNode, error) { // Encode encodes the mint event into the passed io.Writer. func (n *NewMintEvent) Encode(w io.Writer) error { - // TODO(roasbeef): TLV here? - _, err := w.Write(n.IssuanceProof.RawProof) - return err + const magic = "nme1" + + if _, err := io.WriteString(w, magic); err != nil { + return err + } + + if err := binary.Write(w, binary.BigEndian, + uint32(len(n.IssuanceProof.RawProof))); err != nil { + return err + } + + if _, err := w.Write(n.IssuanceProof.RawProof); err != nil { + return err + } + + return binary.Write(w, binary.BigEndian, n.AnchorTxVersion) } // Decode decodes the mint event from the passed io.Reader. @@ -362,10 +380,29 @@ func (n *NewMintEvent) Decode(r io.Reader) error { return fmt.Errorf("unable to copy: %w", err) } + const magic = "nme1" + + rawEvent := b.Bytes() + rawProof := rawEvent + if len(rawEvent) >= 8 && string(rawEvent[:4]) == magic { + proofLen := binary.BigEndian.Uint32(rawEvent[4:8]) + payloadLen := int(proofLen) + if len(rawEvent) < 8+payloadLen+4 { + return fmt.Errorf("decode mint event: invalid payload") + } + + rawProof = rawEvent[8 : 8+payloadLen] + n.AnchorTxVersion = int32(binary.BigEndian.Uint32( + rawEvent[8+payloadLen : 8+payloadLen+4], + )) + } + n.IssuanceProof = universe.Leaf{ - RawProof: b.Bytes(), + RawProof: rawProof, } + b = *bytes.NewBuffer(rawProof) + var issuanceProof proof.Proof if err := issuanceProof.Decode(&b); err != nil { return fmt.Errorf("decode mint event: %w", err) diff --git a/universe/supplycommit/transitions.go b/universe/supplycommit/transitions.go index b70fb66b2b..09b2fe3ba1 100644 --- a/universe/supplycommit/transitions.go +++ b/universe/supplycommit/transitions.go @@ -448,7 +448,7 @@ func newRootCommitment(ctx context.Context, oldCommitment lfn.Option[RootCommitment], unspentPreCommits []PreCommitment, newSupplyRoot *mssmt.BranchNode, wallet Wallet, keyRing KeyRing, chainParams chaincfg.Params, - logger lfn.Option[btclog.Logger], + txVersion int32, logger lfn.Option[btclog.Logger], ) (*RootCommitment, *psbt.Packet, error) { logger.WhenSome(func(l btclog.Logger) { @@ -456,7 +456,12 @@ func newRootCommitment(ctx context.Context, "pre-commits", len(unspentPreCommits)) }) - newCommitTx := wire.NewMsgTx(2) + resolvedTxVersion, err := tapsend.ResolveAnchorTxVersion(txVersion) + if err != nil { + return nil, nil, err + } + + newCommitTx := wire.NewMsgTx(resolvedTxVersion) // With the set of pre-commits, we'll add them to as inputs into the new // transaction. @@ -617,6 +622,42 @@ func newRootCommitment(ctx context.Context, return &newSupplyCommit, commitPkt, nil } +func supplyUpdateAnchorTxVersion(updates []SupplyUpdateEvent, + defaultVersion int32) (int32, error) { + + baselineVersion, err := tapsend.ResolveAnchorTxVersion(defaultVersion) + if err != nil { + return 0, err + } + resolvedVersion := baselineVersion + + for _, update := range updates { + mintEvent, ok := update.(*NewMintEvent) + if !ok || mintEvent.AnchorTxVersion == 0 { + continue + } + + updateVersion, err := tapsend.ResolveAnchorTxVersion( + mintEvent.AnchorTxVersion, + ) + if err != nil { + return 0, err + } + + if resolvedVersion != baselineVersion && + resolvedVersion != updateVersion { + + return 0, fmt.Errorf( + "conflicting anchor tx versions: %d != %d", + resolvedVersion, updateVersion) + } + + resolvedVersion = updateVersion + } + + return resolvedVersion, nil +} + // fundSupplyCommitTx takes a newly created supply commitment transaction, // creates a PSBT, estimates fees, funds the PSBT using the wallet, and locates // the index of the supply commitment output within the funded transaction. It @@ -736,9 +777,16 @@ func (c *CommitTxCreateState) ProcessEvent(event Event, // With all the inputs obtained, we'll create the new supply // commitment. + txVersion, err := supplyUpdateAnchorTxVersion( + c.SupplyTransition.PendingUpdates, env.AnchorTxVersion, + ) + if err != nil { + return nil, err + } + newSupplyCommit, commitPkt, err := newRootCommitment( ctx, oldCommitment, preCommits, newSupplyRoot, - env.Wallet, env.KeyRing, env.ChainParams, + env.Wallet, env.KeyRing, env.ChainParams, txVersion, lfn.Some(prefixedLog), ) if err != nil {