diff --git a/.github/workflows/main.yaml b/.github/workflows/main.yaml index f2424be9a1..e239b16d9e 100644 --- a/.github/workflows/main.yaml +++ b/.github/workflows/main.yaml @@ -21,7 +21,7 @@ env: GO_VERSION: '1.23.6' - LITD_ITEST_BRANCH: 'master' + LITD_ITEST_BRANCH: 'script-key-migrations' jobs: ####################### diff --git a/address/book.go b/address/book.go index 10cc88ec3c..d107114068 100644 --- a/address/book.go +++ b/address/book.go @@ -134,13 +134,9 @@ type Storage interface { // InsertScriptKey inserts an address related script key into the // database, so it can be recognized as belonging to the wallet when a - // transfer comes in later on. The script key can be declared as known - // if it contains an internal key that isn't derived by the backing - // wallet (e.g. NUMS key) but it should still be recognized as a key - // being relevant for the local wallet (e.g. show assets received on - // this key in the asset list and balances). + // transfer comes in later on. InsertScriptKey(ctx context.Context, scriptKey asset.ScriptKey, - declareAsKnown bool) error + keyType asset.ScriptKeyType) error } // KeyRing is used to create script and internal keys for Taproot Asset @@ -401,7 +397,12 @@ func (b *Book) NewAddressWithKeys(ctx context.Context, addrVersion Version, if err != nil { return nil, fmt.Errorf("unable to insert internal key: %w", err) } - err = b.cfg.Store.InsertScriptKey(ctx, scriptKey, true) + + // We might not know the type of script key, if it was given to us + // through an RPC call. So we make a guess here. + keyType := scriptKey.DetermineType() + + err = b.cfg.Store.InsertScriptKey(ctx, scriptKey, keyType) if err != nil { return nil, fmt.Errorf("unable to insert script key: %w", err) } @@ -438,9 +439,9 @@ func (b *Book) IsLocalKey(ctx context.Context, // InsertScriptKey inserts an address related script key into the database. func (b *Book) InsertScriptKey(ctx context.Context, scriptKey asset.ScriptKey, - declareAsKnown bool) error { + keyType asset.ScriptKeyType) error { - return b.cfg.Store.InsertScriptKey(ctx, scriptKey, declareAsKnown) + return b.cfg.Store.InsertScriptKey(ctx, scriptKey, keyType) } // NextInternalKey derives then inserts an internal key into the database to @@ -475,7 +476,7 @@ func (b *Book) NextScriptKey(ctx context.Context, } scriptKey := asset.NewScriptKeyBip86(keyDesc) - err = b.cfg.Store.InsertScriptKey(ctx, scriptKey, true) + err = b.cfg.Store.InsertScriptKey(ctx, scriptKey, asset.ScriptKeyBip86) if err != nil { return asset.ScriptKey{}, err } diff --git a/asset/asset.go b/asset/asset.go index d37925c8af..4a20723fc4 100644 --- a/asset/asset.go +++ b/asset/asset.go @@ -108,6 +108,50 @@ const ( EncodeSegwit ) +// ScriptKeyType denotes the type of script key used for an asset. This type is +// serialized to the database, so we don't use iota for the values to ensure +// they don't change by accident. +type ScriptKeyType uint8 + +const ( + // ScriptKeyUnknown is the default script key type used for assets that + // we don't know the type of. This should only be stored for assets + // where we don't know the internal key of the script key (e.g. for + // imported proofs). + ScriptKeyUnknown ScriptKeyType = 0 + + // ScriptKeyBip86 is the script key type used for assets that use the + // BIP86 style tweak (e.g. an empty tweak). + ScriptKeyBip86 ScriptKeyType = 1 + + // ScriptKeyScriptPathExternal is the script key type used for assets + // that use a script path that is defined by an external application. + // Keys with script paths are normally not shown in asset balances and + // by default aren't used for coin selection unless specifically + // requested. + ScriptKeyScriptPathExternal ScriptKeyType = 2 + + // ScriptKeyBurn is the script key type used for assets that are burned + // and not spendable. + ScriptKeyBurn ScriptKeyType = 3 + + // ScriptKeyTombstone is the script key type used for assets that are + // not spendable and have been marked as tombstones. This is only the + // case for zero-value assets that result from a non-interactive (TAP + // address) send where no change was left over. The script key used for + // this is a NUMS key that is not spendable. + ScriptKeyTombstone ScriptKeyType = 4 + + // ScriptKeyScriptPathChannel is the script key type used for assets + // that use a script path that is somehow related to Taproot Asset + // Channels. That means the script key is either a funding key + // (OP_TRUE), a commitment output key (to_local, to_remote, htlc), or a + // HTLC second-level transaction output key. + // Keys related to channels are not shown in asset balances (unless + // specifically requested) and are _never_ used for coin selection. + ScriptKeyScriptPathChannel ScriptKeyType = 5 +) + var ( // ZeroPrevID is the blank prev ID used for genesis assets and also // asset split leaves. @@ -1005,14 +1049,8 @@ type TweakedScriptKey struct { // public key. If this is nil, then a BIP-0086 tweak is assumed. Tweak []byte - // DeclaredKnown indicates that this script key has been explicitly - // declared as being important to the local wallet, even if it might not - // be fully known to the local wallet. This could perhaps also be named - // "imported", though that might imply that the corresponding private - // key was also somehow imported and available. The only relevance this - // flag has is that assets with a declared key are shown in the asset - // list/balance. - DeclaredKnown bool + // Type is the type of script key that is being used. + Type ScriptKeyType } // IsEqual returns true is this tweaked script key is exactly equivalent to the @@ -1083,12 +1121,9 @@ func (s *ScriptKey) IsEqual(otherScriptKey *ScriptKey) bool { // the local wallet or was explicitly declared to be known by using the // DeclareScriptKey RPC. Knowing the key conceptually means the key belongs to // the local wallet or is at least known by a software that operates on the -// local wallet. The DeclaredAsKnown flag is never serialized in proofs, so this -// is never explicitly set for keys foreign to the local wallet. Therefore, if -// this method returns true for a script key, it means the asset with the script -// key will be shown in the wallet balance. +// local wallet. func (s *ScriptKey) DeclaredAsKnown() bool { - return s.TweakedScriptKey != nil && s.TweakedScriptKey.DeclaredKnown + return s.TweakedScriptKey != nil && s.Type != ScriptKeyUnknown } // HasScriptPath returns true if we know the internals of the script key and @@ -1098,15 +1133,55 @@ func (s *ScriptKey) HasScriptPath() bool { return s.TweakedScriptKey != nil && len(s.TweakedScriptKey.Tweak) > 0 } +// DetermineType attempts to determine the type of the script key based on the +// information available. This method will only return ScriptKeyUnknown if the +// following condition is met: +// - The script key doesn't have a script path, but the final Taproot output +// key doesn't match a BIP-0086 key derived from the internal key. This will +// be the case for "foreign" script keys we import from proofs, where we set +// the internal key to the same key as the tweaked script key (because we +// don't know the internal key, as it's not part of the proof encoding). +func (s *ScriptKey) DetermineType() ScriptKeyType { + // If we have an explicit script key type set, we can return that. + if s.TweakedScriptKey != nil && + s.TweakedScriptKey.Type != ScriptKeyUnknown { + + return s.TweakedScriptKey.Type + } + + // If there is a known tweak, then we know that this is a script path + // key. We never return the channel type, since those keys should always + // be declared properly, and we never should need to guess their type. + if s.HasScriptPath() { + return ScriptKeyScriptPathExternal + } + + // Is it the known NUMS key? Then this is a tombstone output. + if s.PubKey != nil && s.PubKey.IsEqual(NUMSPubKey) { + return ScriptKeyTombstone + } + + // Do we know the internal key? Then we can check whether it is a + // BIP-0086 key. + if s.PubKey != nil && s.TweakedScriptKey != nil && + s.TweakedScriptKey.RawKey.PubKey != nil { + + bip86 := NewScriptKeyBip86(s.TweakedScriptKey.RawKey) + if bip86.PubKey.IsEqual(s.PubKey) { + return ScriptKeyBip86 + } + } + + return ScriptKeyUnknown +} + // NewScriptKey constructs a ScriptKey with only the publicly available // information. This resulting key may or may not have a tweak applied to it. func NewScriptKey(key *btcec.PublicKey) ScriptKey { // Since we'll never query lnd for a tweaked key, it doesn't matter if // we lose the parity information here. And this will only ever be // serialized on chain in a 32-bit representation as well. - key, _ = schnorr.ParsePubKey( - schnorr.SerializePubKey(key), - ) + key, _ = schnorr.ParsePubKey(schnorr.SerializePubKey(key)) return ScriptKey{ PubKey: key, } @@ -1118,9 +1193,7 @@ func NewScriptKey(key *btcec.PublicKey) ScriptKey { func NewScriptKeyBip86(rawKey keychain.KeyDescriptor) ScriptKey { // Tweak the script key BIP-0086 style (such that we only commit to the // internal key when signing). - tweakedPubKey := txscript.ComputeTaprootKeyNoScript( - rawKey.PubKey, - ) + tweakedPubKey := txscript.ComputeTaprootKeyNoScript(rawKey.PubKey) // Since we'll never query lnd for a tweaked key, it doesn't matter if // we lose the parity information here. And this will only ever be @@ -1133,6 +1206,7 @@ func NewScriptKeyBip86(rawKey keychain.KeyDescriptor) ScriptKey { PubKey: tweakedPubKey, TweakedScriptKey: &TweakedScriptKey{ RawKey: rawKey, + Type: ScriptKeyBip86, }, } } @@ -1526,7 +1600,7 @@ func (a *Asset) Copy() *Asset { if a.ScriptKey.TweakedScriptKey != nil { assetCopy.ScriptKey.TweakedScriptKey = &TweakedScriptKey{ - DeclaredKnown: a.ScriptKey.DeclaredKnown, + Type: a.ScriptKey.Type, } assetCopy.ScriptKey.RawKey = a.ScriptKey.RawKey diff --git a/asset/generators.go b/asset/generators.go index 2af47d0a14..858c84e079 100644 --- a/asset/generators.go +++ b/asset/generators.go @@ -71,9 +71,11 @@ var ( }) TweakedScriptKeyGen = rapid.Custom(func(t *rapid.T) TweakedScriptKey { return TweakedScriptKey{ - RawKey: KeyDescGen.Draw(t, "raw_key"), - Tweak: HashBytesGen.Draw(t, "tweak"), - DeclaredKnown: rapid.Bool().Draw(t, "declared_known"), + RawKey: KeyDescGen.Draw(t, "raw_key"), + Tweak: HashBytesGen.Draw(t, "tweak"), + Type: ScriptKeyType( + rapid.Int16().Draw(t, "script_key_type"), + ), } }) ScriptKeyGen = rapid.Custom(func(t *rapid.T) ScriptKey { diff --git a/cmd/commands/assets.go b/cmd/commands/assets.go index f22faf1cb6..069f3f8407 100644 --- a/cmd/commands/assets.go +++ b/cmd/commands/assets.go @@ -14,8 +14,48 @@ import ( "github.com/lightninglabs/taproot-assets/taprpc/mintrpc" "github.com/lightningnetwork/lnd/lnwallet/chainfee" "github.com/urfave/cli" + "golang.org/x/exp/maps" ) +var ( + // nolint:lll + scriptKeyTypeMap = map[string]taprpc.ScriptKeyType{ + "unknown": taprpc.ScriptKeyType_SCRIPT_KEY_UNKNOWN, + "bip86": taprpc.ScriptKeyType_SCRIPT_KEY_BIP86, + "script-path": taprpc.ScriptKeyType_SCRIPT_KEY_SCRIPT_PATH_EXTERNAL, + "burn": taprpc.ScriptKeyType_SCRIPT_KEY_BURN, + "tombstone": taprpc.ScriptKeyType_SCRIPT_KEY_TOMBSTONE, + "channel": taprpc.ScriptKeyType_SCRIPT_KEY_CHANNEL, + } +) + +// parseScriptKeyType parses the script key type query from the command line +// context. If the user didn't specify a script key type, the "show all" query +// type is returned. +func parseScriptKeyType(c *cli.Context) (*taprpc.ScriptKeyTypeQuery, error) { + allScriptKeysQuery := &taprpc.ScriptKeyTypeQuery{ + Type: &taprpc.ScriptKeyTypeQuery_AllTypes{ + AllTypes: true, + }, + } + + if !c.IsSet(scriptKeyTypeName) || c.String(scriptKeyTypeName) == "" { + return allScriptKeysQuery, nil + } + + scriptKeyType, ok := scriptKeyTypeMap[c.String(scriptKeyTypeName)] + if !ok { + return nil, fmt.Errorf("script key type '%v' is unknown", + c.String(scriptKeyTypeName)) + } + + return &taprpc.ScriptKeyTypeQuery{ + Type: &taprpc.ScriptKeyTypeQuery_ExplicitType{ + ExplicitType: scriptKeyType, + }, + }, nil +} + var assetsCommands = []cli.Command{ { Name: "assets", @@ -64,6 +104,7 @@ var ( skipProofCourierPingCheckName = "skip-proof-courier-ping-check" assetAmountName = "amount" burnOverrideConfirmationName = "override_confirmation_destroy_assets" + scriptKeyTypeName = "script_key_type" ) var mintAssetCommand = cli.Command{ @@ -666,6 +707,12 @@ var listAssetsCommand = cli.Command{ Usage: "include freshly minted and not yet confirmed " + "assets in the list", }, + cli.StringFlag{ + Name: scriptKeyTypeName, + Usage: "filter assets by the type of script key they " + + "use; possible values are: " + + strings.Join(maps.Keys(scriptKeyTypeMap), ", "), + }, }, Action: listAssets, } @@ -677,15 +724,22 @@ func listAssets(ctx *cli.Context) error { // TODO(roasbeef): need to reverse txid + scriptKeyQuery, err := parseScriptKeyType(ctx) + if err != nil { + return fmt.Errorf("unable to parse script key type: %w", err) + } + resp, err := client.ListAssets(ctxc, &taprpc.ListAssetRequest{ WithWitness: ctx.Bool(assetShowWitnessName), IncludeSpent: ctx.Bool(assetShowSpentName), IncludeLeased: ctx.Bool(assetShowLeasedName), IncludeUnconfirmedMints: ctx.Bool(assetShowUnconfMintsName), + ScriptKeyType: scriptKeyQuery, }) if err != nil { return fmt.Errorf("unable to list assets: %w", err) } + printRespJSON(resp) return nil } @@ -695,7 +749,19 @@ var listUtxosCommand = cli.Command{ ShortName: "u", Usage: "list all utxos", Description: "list all utxos managing assets", - Action: listUtxos, + Flags: []cli.Flag{ + cli.BoolFlag{ + Name: assetShowLeasedName, + Usage: "include leased assets in the list", + }, + cli.StringFlag{ + Name: scriptKeyTypeName, + Usage: "filter assets by the type of script key they " + + "use; possible values are: " + + strings.Join(maps.Keys(scriptKeyTypeMap), ", "), + }, + }, + Action: listUtxos, } func listUtxos(ctx *cli.Context) error { @@ -703,10 +769,19 @@ func listUtxos(ctx *cli.Context) error { client, cleanUp := getClient(ctx) defer cleanUp() - resp, err := client.ListUtxos(ctxc, &taprpc.ListUtxosRequest{}) + scriptKeyQuery, err := parseScriptKeyType(ctx) + if err != nil { + return fmt.Errorf("unable to parse script key type: %w", err) + } + + resp, err := client.ListUtxos(ctxc, &taprpc.ListUtxosRequest{ + IncludeLeased: ctx.Bool(assetShowLeasedName), + ScriptKeyType: scriptKeyQuery, + }) if err != nil { return fmt.Errorf("unable to list utxos: %w", err) } + printRespJSON(resp) return nil } @@ -758,6 +833,12 @@ var listAssetBalancesCommand = cli.Command{ "balance query against. Must be used " + "together with --by_group", }, + cli.StringFlag{ + Name: scriptKeyTypeName, + Usage: "filter assets by the type of script key they " + + "use; possible values are: " + + strings.Join(maps.Keys(scriptKeyTypeMap), ", "), + }, }, } @@ -766,10 +847,14 @@ func listAssetBalances(ctx *cli.Context) error { client, cleanUp := getClient(ctx) defer cleanUp() - var err error + scriptKeyQuery, err := parseScriptKeyType(ctx) + if err != nil { + return fmt.Errorf("unable to parse script key type: %w", err) + } req := &taprpc.ListBalancesRequest{ IncludeLeased: ctx.Bool(assetIncludeLeasedName), + ScriptKeyType: scriptKeyQuery, } if !ctx.Bool(groupByGroupName) { diff --git a/docs/examples/basic-price-oracle/go.mod b/docs/examples/basic-price-oracle/go.mod index 5dce9e481c..f9daefa4f2 100644 --- a/docs/examples/basic-price-oracle/go.mod +++ b/docs/examples/basic-price-oracle/go.mod @@ -13,13 +13,13 @@ replace ( require ( github.com/lightninglabs/taproot-assets v0.5.0-rc1 github.com/sirupsen/logrus v1.9.3 - google.golang.org/grpc v1.59.0 + google.golang.org/grpc v1.64.1 ) require ( dario.cat/mergo v1.0.1 // indirect github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 // indirect - github.com/Microsoft/go-winio v0.6.1 // indirect + github.com/Microsoft/go-winio v0.6.2 // indirect github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5 // indirect github.com/aead/chacha20 v0.0.0-20180709150244-8b13a72661da // indirect github.com/aead/siphash v1.0.1 // indirect @@ -51,9 +51,10 @@ require ( github.com/decred/dcrd/lru v1.1.2 // indirect github.com/docker/cli v28.0.1+incompatible // indirect github.com/docker/docker v28.0.1+incompatible // indirect - github.com/docker/go-connections v0.4.0 // indirect + github.com/docker/go-connections v0.5.0 // indirect github.com/docker/go-units v0.5.0 // indirect github.com/dustin/go-humanize v1.0.1 // indirect + github.com/felixge/httpsnoop v1.0.4 // indirect github.com/fergusstrange/embedded-postgres v1.25.0 // indirect github.com/go-errors/errors v1.0.1 // indirect github.com/go-logr/logr v1.4.2 // indirect @@ -71,7 +72,7 @@ require ( github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 // indirect github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 // indirect github.com/grpc-ecosystem/grpc-gateway v1.16.0 // indirect - github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 // indirect + github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0 // indirect github.com/hashicorp/errwrap v1.1.0 // indirect github.com/hashicorp/go-multierror v1.1.1 // indirect github.com/jackc/chunkreader/v2 v2.0.1 // indirect @@ -120,7 +121,7 @@ require ( github.com/modern-go/reflect2 v1.0.2 // indirect github.com/ncruces/go-strftime v0.1.9 // indirect github.com/opencontainers/go-digest v1.0.0 // indirect - github.com/opencontainers/image-spec v1.0.2 // indirect + github.com/opencontainers/image-spec v1.1.0 // indirect github.com/opencontainers/runc v1.2.0 // indirect github.com/ory/dockertest/v3 v3.10.0 // indirect github.com/pkg/errors v0.9.1 // indirect @@ -151,31 +152,31 @@ require ( 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/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.46.1 // indirect + go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.49.0 // indirect go.opentelemetry.io/otel v1.35.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.20.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.35.0 // indirect go.opentelemetry.io/otel/sdk v1.35.0 // indirect go.opentelemetry.io/otel/trace v1.35.0 // indirect - go.opentelemetry.io/proto/otlp v1.0.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/crypto v0.36.0 // indirect golang.org/x/exp v0.0.0-20240325151524-a685a6edb6d8 // indirect - golang.org/x/mod v0.17.0 // indirect + golang.org/x/mod v0.21.0 // indirect golang.org/x/net v0.38.0 // indirect golang.org/x/sync v0.12.0 // indirect golang.org/x/sys v0.31.0 // indirect golang.org/x/term v0.30.0 // indirect golang.org/x/text v0.23.0 // indirect - golang.org/x/time v0.3.0 // indirect - golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d // indirect - google.golang.org/genproto v0.0.0-20231016165738-49dd2c1f3d0b // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20231016165738-49dd2c1f3d0b // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20231030173426-d783a09b4405 // indirect - google.golang.org/protobuf v1.33.0 // indirect + golang.org/x/time v0.5.0 // indirect + golang.org/x/tools v0.24.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/protobuf v1.34.2 // indirect gopkg.in/errgo.v1 v1.0.1 // indirect gopkg.in/macaroon-bakery.v2 v2.1.0 // indirect gopkg.in/macaroon.v2 v2.1.0 // indirect diff --git a/docs/examples/basic-price-oracle/go.sum b/docs/examples/basic-price-oracle/go.sum index 0c8b266eca..14ad4b6c3d 100644 --- a/docs/examples/basic-price-oracle/go.sum +++ b/docs/examples/basic-price-oracle/go.sum @@ -13,17 +13,12 @@ cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKV cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= -cloud.google.com/go v0.110.10 h1:LXy9GEO+timppncPIAZoOj3l58LIU9k+kn48AN7IO3Y= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= -cloud.google.com/go/compute v1.23.3 h1:6sVlXXBmbd7jNX0Ipq0trII3e4n1/MsADLK6a+aiVlk= -cloud.google.com/go/compute v1.23.3/go.mod h1:VCgBUoMnIVIR0CscqQiPJLAG25E3ZRZMzcFZeQ+h8CI= -cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY= -cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= @@ -45,8 +40,8 @@ github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03 github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/Masterminds/semver/v3 v3.1.1 h1:hLg3sBzpNErnxhQtUy/mmLR2I9foDujNK030IGemrRc= github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= -github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= -github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= +github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= +github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= github.com/NebulousLabs/fastrand v0.0.0-20181203155948-6fb6489aac4e h1:n+DcnTNkQnHlwpsrHoQtkrJIO7CBx029fw6oR4vIob4= github.com/NebulousLabs/fastrand v0.0.0-20181203155948-6fb6489aac4e/go.mod h1:Bdzq+51GR4/0DIhaICZEOm+OHvXGwwB2trKZ8B4Y6eQ= github.com/NebulousLabs/go-upnp v0.0.0-20180202185039-29b680b06c82 h1:MG93+PZYs9PyEsj/n5/haQu2gK0h4tUtSy9ejtMwWa0= @@ -131,8 +126,6 @@ github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5P github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/cncf/xds/go v0.0.0-20231109132714-523115ebc101 h1:7To3pQ+pZo0i3dsWEbinPNFs5gPSBOsJtx3wTT94VBY= -github.com/cncf/xds/go v0.0.0-20231109132714-523115ebc101/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cockroachdb/apd v1.1.0 h1:3LFP3629v+1aKXU5Q37mxmRxX/pIu1nijXydLShEq5I= github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ= github.com/cockroachdb/datadriven v1.0.2 h1:H9MtNqVoVhvd9nCBwOyDjUEdZCREqbIdCJD93PBm/jA= @@ -171,8 +164,8 @@ github.com/docker/cli v28.0.1+incompatible h1:g0h5NQNda3/CxIsaZfH4Tyf6vpxFth7PYl github.com/docker/cli v28.0.1+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= github.com/docker/docker v28.0.1+incompatible h1:FCHjSRdXhNRFjlHMTv4jUNlIBbTeRjrWfeFuJp7jpo0= github.com/docker/docker v28.0.1+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= -github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= +github.com/docker/go-connections v0.5.0 h1:USnMq7hx7gwdVZq1L49hLXaFtUdTADjXGp+uj1Br63c= +github.com/docker/go-connections v0.5.0/go.mod h1:ov60Kzw0kKElRwhNs9UlUHAE/F9Fe6GLaXnqyDdmEXc= github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= @@ -181,8 +174,6 @@ github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymF github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/envoyproxy/protoc-gen-validate v1.0.2 h1:QkIBuU5k+x7/QXPvPPnWXWlCdaBFApVqftFV6k087DA= -github.com/envoyproxy/protoc-gen-validate v1.0.2/go.mod h1:GpiZQP3dDbg4JouG/NNS7QWXpgx6x8QiMKdmN72jogE= github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/fergusstrange/embedded-postgres v1.25.0 h1:sa+k2Ycrtz40eCRPOzI7Ry7TtkWXXJ+YRsxpKMDhxK0= @@ -230,8 +221,6 @@ github.com/golang-jwt/jwt/v4 v4.5.2/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w github.com/golang-migrate/migrate/v4 v4.17.0 h1:rd40H3QXU0AA4IoLllFcEAEo9dYKRHYND2gB4p7xcaU= github.com/golang-migrate/migrate/v4 v4.17.0/go.mod h1:+Cp2mtLP4/aXDTKb9wmXYitdrNx2HGs45rbWAo6OsKM= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/glog v1.1.2 h1:DVjP2PbBOzHyzA+dn3WhHIq4NdVu3Q+pvivFICf/7fo= -github.com/golang/glog v1.1.2/go.mod h1:zR+okUeTbrL6EL3xHUDxZuEtGv04p5shwip1+mL/rLQ= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -301,8 +290,8 @@ github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 h1:Ovs26xHkKqVztRpIrF/92Bcuy github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 h1:YBftPWNWd4WwGqtY2yeZL2ef8rHAxPBD8KFhJpmcqms= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0/go.mod h1:YN5jB8ie0yfIUg6VvR9Kz84aCaG7AsGZnLjhHbUqwPg= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0 h1:bkypFPDjIYGfCYD5mRBvpqxfYX1YCS1PXdKYWi8FsN0= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0/go.mod h1:P+Lt/0by1T8bfcF3z737NnSbmxQAppXMRziHUxPOC8k= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I= github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= @@ -524,8 +513,8 @@ github.com/onsi/gomega v1.26.0 h1:03cDLK28U6hWvCAns6NeydX3zIm4SF3ci69ulidS32Q= github.com/onsi/gomega v1.26.0/go.mod h1:r+zV744Re+DiYCIPRlYOTxn0YkOLcAnW8k1xXdMPGhM= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= -github.com/opencontainers/image-spec v1.0.2 h1:9yCKha/T5XdGtO0q9Q9a6T5NUCsTn/DrBg0D7ufOcFM= -github.com/opencontainers/image-spec v1.0.2/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= +github.com/opencontainers/image-spec v1.1.0 h1:8SG7/vwALn54lVB/0yZ/MMwhFrPYtpEHQb2IpWsCzug= +github.com/opencontainers/image-spec v1.1.0/go.mod h1:W4s4sFTMaBeK1BQLXbG4AdM2szdn85PY75RI83NrTrM= github.com/opencontainers/runc v1.2.0 h1:qke7ZVCmJcKrJVY2iHJVC+0kql9uYdkusOPsQOOeBw4= github.com/opencontainers/runc v1.2.0/go.mod h1:/PXzF0h531HTMsYQnmxXkBD7YaGShm/2zcRB79dksUc= github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= @@ -648,14 +637,14 @@ go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= 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/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.46.1 h1:SpGay3w+nEwMpfVnbqOLH5gY52/foP8RE8UzTZ1pdSE= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.46.1/go.mod h1:4UoMYEZOC0yN/sPGH76KPkkU7zgiEWYWL9vwmbnTJPE= +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.35.0 h1:xKWKPxrxB6OtMCbmMY021CqC45J+3Onta9MqjhnusiQ= go.opentelemetry.io/otel v1.35.0/go.mod h1:UEqy8Zp11hpkUrL73gSlELM0DupHoiq72dR+Zqel/+Y= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.20.0 h1:DeFD0VgTZ+Cj6hxravYYZE2W4GlneVH81iAOPjZkzk8= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.20.0/go.mod h1:GijYcYmNpX1KazD5JmWGsi4P7dDTTTnfv1UbGn84MnU= +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.35.0 h1:0znxYu2SNyuMSQT4Y9WDWej0VpcsxkuklLa4/siN90M= @@ -664,8 +653,8 @@ go.opentelemetry.io/otel/sdk v1.35.0 h1:iPctf8iprVySXSKJffSS79eOjl9pvxV9ZqOWT0Qe go.opentelemetry.io/otel/sdk v1.35.0/go.mod h1:+ga1bZliga3DxJ3CQGg3updiaAJoNECOgJREo9KHGQg= go.opentelemetry.io/otel/trace v1.35.0 h1:dPpEfJu1sDIqruz7BHFG3c7528f6ddfSWfFDVt/xgMs= go.opentelemetry.io/otel/trace v1.35.0/go.mod h1:WUk7DtFp1Aw2MkvqGdwiXYDZZNvA/1J8o6xRXLrIkyc= -go.opentelemetry.io/proto/otlp v1.0.0 h1:T0TX0tmXU8a3CbNXzEKGeU5mIVOdf0oykP+u2lIVU/I= -go.opentelemetry.io/proto/otlp v1.0.0/go.mod h1:Sy6pihPLfYHkr3NkUbEhGHFhINUSI/v80hjKIs5JXpM= +go.opentelemetry.io/proto/otlp v1.3.1 h1:TrMUixzpM0yuc/znrFTP9MMRh8trP93mkCiDVeXrui0= +go.opentelemetry.io/proto/otlp v1.3.1/go.mod h1:0X1WI4de4ZsLrrJNLAQbFeLCm3T7yBkR0XqQ7niQU+8= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= @@ -736,8 +725,8 @@ golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzB golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.17.0 h1:zY54UmvipHiNd+pm+m0x9KhZ9hl1/7QNMyxXbc6ICqA= -golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/mod v0.21.0 h1:vvrHzRwRfVKSiLrG+d4FMl/Qi4ukBCE6kZlTUkDYRT0= +golang.org/x/mod v0.21.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY= 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= @@ -788,8 +777,6 @@ golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4Iltr golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.14.0 h1:P0Vrf/2538nmC0H+pEQ3MNFRRnVR7RlqyVw+bvm26z0= -golang.org/x/oauth2 v0.14.0/go.mod h1:lAtNWgaWfL4cm7j2OV8TxGi9Qb7ECORx8DktCY74OwM= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -880,8 +867,8 @@ golang.org/x/text v0.23.0/go.mod h1:/BLNzu4aZCJ1+kcD0DNRotWKage4q2rGVAg4o22unh4= 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= -golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= -golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= +golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= @@ -931,8 +918,8 @@ golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.6-0.20210726203631-07bc1bf47fb2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d h1:vU5i/LfpvrRCpgM/VPfJLg5KjxD3E+hfT1SH+d9zLwg= -golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= +golang.org/x/tools v0.24.0 h1:J1shsA93PJUEVaUSaay7UXAyE8aimq3GW0pjlolpa24= +golang.org/x/tools v0.24.0/go.mod h1:YhNqVBIfWHdzvTLs0d8LCuMhkKUgSUKldakyV7W/WDQ= 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= @@ -961,8 +948,6 @@ google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7 google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= -google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= @@ -993,12 +978,12 @@ google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7Fc google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20231016165738-49dd2c1f3d0b h1:+YaDE2r2OG8t/z5qmsh7Y+XXwCbvadxxZ0YY6mTdrVA= -google.golang.org/genproto v0.0.0-20231016165738-49dd2c1f3d0b/go.mod h1:CgAqfJo+Xmu0GwA0411Ht3OU3OntXwsGmrmjI8ioGXI= -google.golang.org/genproto/googleapis/api v0.0.0-20231016165738-49dd2c1f3d0b h1:CIC2YMXmIhYw6evmhPxBKJ4fmLbOFtXQN/GV3XOZR8k= -google.golang.org/genproto/googleapis/api v0.0.0-20231016165738-49dd2c1f3d0b/go.mod h1:IBQ646DjkDkvUIsVq/cc03FUFQ9wbZu7yE396YcL870= -google.golang.org/genproto/googleapis/rpc v0.0.0-20231030173426-d783a09b4405 h1:AB/lmRny7e2pLhFEYIbl5qkDAUt2h0ZRO4wGPhZf+ik= -google.golang.org/genproto/googleapis/rpc v0.0.0-20231030173426-d783a09b4405/go.mod h1:67X1fPuzjcrkymZzZV1vvkFeTn2Rvc6lYF9MYFGCcwE= +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/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= @@ -1012,8 +997,8 @@ google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3Iji google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= -google.golang.org/grpc v1.59.0 h1:Z5Iec2pjwb+LEOqzpB2MR12/eKFhDPhuqW91O+4bwUk= -google.golang.org/grpc v1.59.0/go.mod h1:aUPDwccQo6OTjy7Hct4AfBPD1GptF4fyUjIkQ9YtF98= +google.golang.org/grpc v1.64.1 h1:LKtvyfbX3UGVPFcGqJ9ItpVWW6oN/2XqTxfAnwRRXiA= +google.golang.org/grpc v1.64.1/go.mod h1:hiQF4LFZelK2WKaP6W0L92zGHtiQdZxk8CrSdvyjeP0= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20160105164936-4f90aeace3a2/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= diff --git a/go.mod b/go.mod index 2aeced3f2d..39ff080360 100644 --- a/go.mod +++ b/go.mod @@ -20,7 +20,7 @@ require ( github.com/golang-migrate/migrate/v4 v4.17.0 github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 github.com/grpc-ecosystem/go-grpc-middleware/providers/prometheus v1.0.0-rc.0 - github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 + 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 @@ -43,9 +43,9 @@ require ( golang.org/x/net v0.38.0 golang.org/x/sync v0.12.0 golang.org/x/term v0.30.0 - golang.org/x/time v0.3.0 - google.golang.org/grpc v1.59.0 - google.golang.org/protobuf v1.33.0 + golang.org/x/time v0.5.0 + google.golang.org/grpc v1.64.1 + google.golang.org/protobuf v1.34.2 gopkg.in/macaroon-bakery.v2 v2.1.0 gopkg.in/macaroon.v2 v2.1.0 modernc.org/sqlite v1.34.5 @@ -55,7 +55,7 @@ require ( require ( dario.cat/mergo v1.0.1 // indirect github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 // indirect - github.com/Microsoft/go-winio v0.6.1 // indirect + github.com/Microsoft/go-winio v0.6.2 // indirect github.com/NebulousLabs/fastrand v0.0.0-20181203155948-6fb6489aac4e // indirect github.com/NebulousLabs/go-upnp v0.0.0-20180202185039-29b680b06c82 // indirect github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5 // indirect @@ -80,10 +80,9 @@ require ( github.com/decred/dcrd/lru v1.1.2 // indirect github.com/docker/cli v28.0.1+incompatible // indirect github.com/docker/docker v28.0.1+incompatible // indirect - github.com/docker/go-connections v0.4.0 // indirect + github.com/docker/go-connections v0.5.0 // indirect github.com/docker/go-units v0.5.0 // indirect github.com/dustin/go-humanize v1.0.1 // indirect - github.com/felixge/httpsnoop v1.0.4 // indirect github.com/fergusstrange/embedded-postgres v1.25.0 // indirect github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect @@ -144,7 +143,7 @@ require ( github.com/mwitkow/grpc-proxy v0.0.0-20230212185441-f345521cb9c9 // indirect github.com/ncruces/go-strftime v0.1.9 // indirect github.com/opencontainers/go-digest v1.0.0 // indirect - github.com/opencontainers/image-spec v1.0.2 // indirect + github.com/opencontainers/image-spec v1.1.0 // indirect github.com/opencontainers/runc v1.2.0 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect @@ -176,25 +175,25 @@ require ( 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/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.46.1 // indirect + go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.49.0 // indirect go.opentelemetry.io/otel v1.35.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.20.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.35.0 // indirect go.opentelemetry.io/otel/sdk v1.35.0 // indirect go.opentelemetry.io/otel/trace v1.35.0 // indirect - go.opentelemetry.io/proto/otlp v1.0.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/crypto v0.36.0 // indirect - golang.org/x/mod v0.17.0 // indirect + golang.org/x/mod v0.21.0 // indirect golang.org/x/sys v0.31.0 // indirect golang.org/x/text v0.23.0 // indirect - golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d // indirect - google.golang.org/genproto v0.0.0-20231016165738-49dd2c1f3d0b // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20231016165738-49dd2c1f3d0b // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20231030173426-d783a09b4405 // indirect + golang.org/x/tools v0.24.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 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 @@ -208,4 +207,8 @@ require ( // We want to format raw bytes as hex instead of base64. The forked version // allows us to specify that as an option. -replace google.golang.org/protobuf => github.com/lightninglabs/protobuf-go-hex-display v1.33.0-hex-display +replace google.golang.org/protobuf => github.com/lightninglabs/protobuf-go-hex-display v1.34.2-hex-display + +// We are using a fork of the migration library with custom functionality that +// 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 diff --git a/go.sum b/go.sum index 11f2834f3b..940affa896 100644 --- a/go.sum +++ b/go.sum @@ -13,17 +13,12 @@ cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKV cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= -cloud.google.com/go v0.110.10 h1:LXy9GEO+timppncPIAZoOj3l58LIU9k+kn48AN7IO3Y= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= -cloud.google.com/go/compute v1.23.3 h1:6sVlXXBmbd7jNX0Ipq0trII3e4n1/MsADLK6a+aiVlk= -cloud.google.com/go/compute v1.23.3/go.mod h1:VCgBUoMnIVIR0CscqQiPJLAG25E3ZRZMzcFZeQ+h8CI= -cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY= -cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= @@ -47,8 +42,8 @@ github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= github.com/Masterminds/semver/v3 v3.2.0 h1:3MEsd0SM6jqZojhjLWWeBY+Kcjy9i6MQAeY7YgDP83g= github.com/Masterminds/semver/v3 v3.2.0/go.mod h1:qvl/7zhW3nngYb5+80sSMF+FG2BjYrf8m9wsX0PNOMQ= -github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= -github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= +github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= +github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= github.com/NebulousLabs/fastrand v0.0.0-20181203155948-6fb6489aac4e h1:n+DcnTNkQnHlwpsrHoQtkrJIO7CBx029fw6oR4vIob4= github.com/NebulousLabs/fastrand v0.0.0-20181203155948-6fb6489aac4e/go.mod h1:Bdzq+51GR4/0DIhaICZEOm+OHvXGwwB2trKZ8B4Y6eQ= github.com/NebulousLabs/go-upnp v0.0.0-20180202185039-29b680b06c82 h1:MG93+PZYs9PyEsj/n5/haQu2gK0h4tUtSy9ejtMwWa0= @@ -137,8 +132,6 @@ github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDk github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20231109132714-523115ebc101 h1:7To3pQ+pZo0i3dsWEbinPNFs5gPSBOsJtx3wTT94VBY= -github.com/cncf/xds/go v0.0.0-20231109132714-523115ebc101/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cockroachdb/apd v1.1.0 h1:3LFP3629v+1aKXU5Q37mxmRxX/pIu1nijXydLShEq5I= github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ= github.com/cockroachdb/datadriven v1.0.2 h1:H9MtNqVoVhvd9nCBwOyDjUEdZCREqbIdCJD93PBm/jA= @@ -171,16 +164,16 @@ github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0/go.mod h1:v57UDF4pDQJcEfFUCRop3 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= -github.com/dhui/dktest v0.4.0 h1:z05UmuXZHO/bgj/ds2bGMBu8FI4WA+Ag/m3ghL+om7M= -github.com/dhui/dktest v0.4.0/go.mod h1:v/Dbz1LgCBOi2Uki2nUqLBGa83hWBGFMu5MrgMDCc78= +github.com/dhui/dktest v0.4.5 h1:uUfYBIVREmj/Rw6MvgmqNAYzTiKOHJak+enB5Di73MM= +github.com/dhui/dktest v0.4.5/go.mod h1:tmcyeHDKagvlDrz7gDKq4UAJOLIfVZYkfD5OnHDwcCo= github.com/distribution/reference v0.6.0 h1:0IXCQ5g4/QMHHkarYzh5l+u8T3t73zM5QvfrDyIgxBk= github.com/distribution/reference v0.6.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E= github.com/docker/cli v28.0.1+incompatible h1:g0h5NQNda3/CxIsaZfH4Tyf6vpxFth7PYl3hgCPOKzs= github.com/docker/cli v28.0.1+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= github.com/docker/docker v28.0.1+incompatible h1:FCHjSRdXhNRFjlHMTv4jUNlIBbTeRjrWfeFuJp7jpo0= github.com/docker/docker v28.0.1+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= -github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= +github.com/docker/go-connections v0.5.0 h1:USnMq7hx7gwdVZq1L49hLXaFtUdTADjXGp+uj1Br63c= +github.com/docker/go-connections v0.5.0/go.mod h1:ov60Kzw0kKElRwhNs9UlUHAE/F9Fe6GLaXnqyDdmEXc= github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= @@ -192,8 +185,6 @@ github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.m github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/envoyproxy/protoc-gen-validate v1.0.2 h1:QkIBuU5k+x7/QXPvPPnWXWlCdaBFApVqftFV6k087DA= -github.com/envoyproxy/protoc-gen-validate v1.0.2/go.mod h1:GpiZQP3dDbg4JouG/NNS7QWXpgx6x8QiMKdmN72jogE= github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/fergusstrange/embedded-postgres v1.25.0 h1:sa+k2Ycrtz40eCRPOzI7Ry7TtkWXXJ+YRsxpKMDhxK0= @@ -260,12 +251,8 @@ github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang-jwt/jwt/v4 v4.5.2 h1:YtQM7lnr8iZ+j5q71MGKkNw9Mn7AjHM68uc9g5fXeUI= github.com/golang-jwt/jwt/v4 v4.5.2/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= -github.com/golang-migrate/migrate/v4 v4.17.0 h1:rd40H3QXU0AA4IoLllFcEAEo9dYKRHYND2gB4p7xcaU= -github.com/golang-migrate/migrate/v4 v4.17.0/go.mod h1:+Cp2mtLP4/aXDTKb9wmXYitdrNx2HGs45rbWAo6OsKM= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/glog v0.0.0-20210429001901-424d2337a529/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/glog v1.1.2 h1:DVjP2PbBOzHyzA+dn3WhHIq4NdVu3Q+pvivFICf/7fo= -github.com/golang/glog v1.1.2/go.mod h1:zR+okUeTbrL6EL3xHUDxZuEtGv04p5shwip1+mL/rLQ= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -344,8 +331,8 @@ github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgf github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= github.com/grpc-ecosystem/grpc-gateway/v2 v2.5.0/go.mod h1:r1hZAcvfFXuYmcKyCJI9wlyOPIZUJl6FCB8Cpca/NLE= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 h1:YBftPWNWd4WwGqtY2yeZL2ef8rHAxPBD8KFhJpmcqms= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0/go.mod h1:YN5jB8ie0yfIUg6VvR9Kz84aCaG7AsGZnLjhHbUqwPg= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0 h1:bkypFPDjIYGfCYD5mRBvpqxfYX1YCS1PXdKYWi8FsN0= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0/go.mod h1:P+Lt/0by1T8bfcF3z737NnSbmxQAppXMRziHUxPOC8k= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I= github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= @@ -494,12 +481,14 @@ github.com/lightninglabs/lightning-node-connect/hashmailrpc v1.0.2 h1:Er1miPZD2X github.com/lightninglabs/lightning-node-connect/hashmailrpc v1.0.2/go.mod h1:antQGRDRJiuyQF6l+k6NECCSImgCpwaZapATth2Chv4= github.com/lightninglabs/lndclient v0.19.0-4 h1:U+koisg716/i51kf5ENI5+9a1joXcPXeJYl3q0s4/co= github.com/lightninglabs/lndclient v0.19.0-4/go.mod h1:LP3FM3JGBdvOX8Lum9x1r7q54oiftoqaq4EYhtpp/fk= +github.com/lightninglabs/migrate/v4 v4.18.2-9023d66a-fork-pr-2 h1:eFjp1dIB2BhhQp/THKrjLdlYuPugO9UU4kDqu91OX/Q= +github.com/lightninglabs/migrate/v4 v4.18.2-9023d66a-fork-pr-2/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/cache v1.1.2 h1:C9DY/DAPaPxbFC+xNNEI/z1SJY9GS3shmlu5hIQ798g= github.com/lightninglabs/neutrino/cache v1.1.2/go.mod h1:XJNcgdOw1LQnanGjw8Vj44CvguYA25IMKjWFZczwZuo= -github.com/lightninglabs/protobuf-go-hex-display v1.33.0-hex-display h1:Y2WiPkBS/00EiEg0qp0FhehxnQfk3vv8U6Xt3nN+rTY= -github.com/lightninglabs/protobuf-go-hex-display v1.33.0-hex-display/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +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.20240712235311-98bd56499dfb h1:yfM05S8DXKhuCBp5qSMZdtSwvJ+GFzl94KbXMNB1JDY= github.com/lightningnetwork/lightning-onion v1.2.1-0.20240712235311-98bd56499dfb/go.mod h1:c0kvRShutpj3l6B9WtTsNTBUtjSmjZXbJd9ZBRQOSKI= github.com/lightningnetwork/lnd v0.19.0-beta.rc2.0.20250423092132-a35ace7371af h1:+t8N7kmI7YVu7Hzv8pPiMVCTjnSRi/qOxbAkXa5rn+0= @@ -582,8 +571,8 @@ github.com/onsi/gomega v1.26.0 h1:03cDLK28U6hWvCAns6NeydX3zIm4SF3ci69ulidS32Q= github.com/onsi/gomega v1.26.0/go.mod h1:r+zV744Re+DiYCIPRlYOTxn0YkOLcAnW8k1xXdMPGhM= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= -github.com/opencontainers/image-spec v1.0.2 h1:9yCKha/T5XdGtO0q9Q9a6T5NUCsTn/DrBg0D7ufOcFM= -github.com/opencontainers/image-spec v1.0.2/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= +github.com/opencontainers/image-spec v1.1.0 h1:8SG7/vwALn54lVB/0yZ/MMwhFrPYtpEHQb2IpWsCzug= +github.com/opencontainers/image-spec v1.1.0/go.mod h1:W4s4sFTMaBeK1BQLXbG4AdM2szdn85PY75RI83NrTrM= github.com/opencontainers/runc v1.2.0 h1:qke7ZVCmJcKrJVY2iHJVC+0kql9uYdkusOPsQOOeBw4= github.com/opencontainers/runc v1.2.0/go.mod h1:/PXzF0h531HTMsYQnmxXkBD7YaGShm/2zcRB79dksUc= github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= @@ -720,14 +709,14 @@ go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= 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/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.46.1 h1:SpGay3w+nEwMpfVnbqOLH5gY52/foP8RE8UzTZ1pdSE= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.46.1/go.mod h1:4UoMYEZOC0yN/sPGH76KPkkU7zgiEWYWL9vwmbnTJPE= +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.35.0 h1:xKWKPxrxB6OtMCbmMY021CqC45J+3Onta9MqjhnusiQ= go.opentelemetry.io/otel v1.35.0/go.mod h1:UEqy8Zp11hpkUrL73gSlELM0DupHoiq72dR+Zqel/+Y= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.20.0 h1:DeFD0VgTZ+Cj6hxravYYZE2W4GlneVH81iAOPjZkzk8= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.20.0/go.mod h1:GijYcYmNpX1KazD5JmWGsi4P7dDTTTnfv1UbGn84MnU= +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.35.0 h1:0znxYu2SNyuMSQT4Y9WDWej0VpcsxkuklLa4/siN90M= @@ -737,8 +726,8 @@ go.opentelemetry.io/otel/sdk v1.35.0/go.mod h1:+ga1bZliga3DxJ3CQGg3updiaAJoNECOg go.opentelemetry.io/otel/trace v1.35.0 h1:dPpEfJu1sDIqruz7BHFG3c7528f6ddfSWfFDVt/xgMs= go.opentelemetry.io/otel/trace v1.35.0/go.mod h1:WUk7DtFp1Aw2MkvqGdwiXYDZZNvA/1J8o6xRXLrIkyc= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= -go.opentelemetry.io/proto/otlp v1.0.0 h1:T0TX0tmXU8a3CbNXzEKGeU5mIVOdf0oykP+u2lIVU/I= -go.opentelemetry.io/proto/otlp v1.0.0/go.mod h1:Sy6pihPLfYHkr3NkUbEhGHFhINUSI/v80hjKIs5JXpM= +go.opentelemetry.io/proto/otlp v1.3.1 h1:TrMUixzpM0yuc/znrFTP9MMRh8trP93mkCiDVeXrui0= +go.opentelemetry.io/proto/otlp v1.3.1/go.mod h1:0X1WI4de4ZsLrrJNLAQbFeLCm3T7yBkR0XqQ7niQU+8= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= @@ -813,8 +802,8 @@ golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzB golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.17.0 h1:zY54UmvipHiNd+pm+m0x9KhZ9hl1/7QNMyxXbc6ICqA= -golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/mod v0.21.0 h1:vvrHzRwRfVKSiLrG+d4FMl/Qi4ukBCE6kZlTUkDYRT0= +golang.org/x/mod v0.21.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY= 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= @@ -871,8 +860,6 @@ golang.org/x/oauth2 v0.0.0-20210413134643-5e61552d6c78/go.mod h1:KelEdhl1UZF7XfJ golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210615190721-d04028783cf1/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.14.0 h1:P0Vrf/2538nmC0H+pEQ3MNFRRnVR7RlqyVw+bvm26z0= -golang.org/x/oauth2 v0.14.0/go.mod h1:lAtNWgaWfL4cm7j2OV8TxGi9Qb7ECORx8DktCY74OwM= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -971,8 +958,8 @@ golang.org/x/text v0.23.0/go.mod h1:/BLNzu4aZCJ1+kcD0DNRotWKage4q2rGVAg4o22unh4= 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= -golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= -golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= +golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= @@ -1025,8 +1012,8 @@ golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.6-0.20210726203631-07bc1bf47fb2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d h1:vU5i/LfpvrRCpgM/VPfJLg5KjxD3E+hfT1SH+d9zLwg= -golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= +golang.org/x/tools v0.24.0 h1:J1shsA93PJUEVaUSaay7UXAyE8aimq3GW0pjlolpa24= +golang.org/x/tools v0.24.0/go.mod h1:YhNqVBIfWHdzvTLs0d8LCuMhkKUgSUKldakyV7W/WDQ= 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= @@ -1055,8 +1042,6 @@ google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7 google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= -google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= @@ -1091,12 +1076,12 @@ google.golang.org/genproto v0.0.0-20200806141610-86f49bd18e98/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210401141331-865547bb08e2/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= google.golang.org/genproto v0.0.0-20210617175327-b9e0b3197ced/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= -google.golang.org/genproto v0.0.0-20231016165738-49dd2c1f3d0b h1:+YaDE2r2OG8t/z5qmsh7Y+XXwCbvadxxZ0YY6mTdrVA= -google.golang.org/genproto v0.0.0-20231016165738-49dd2c1f3d0b/go.mod h1:CgAqfJo+Xmu0GwA0411Ht3OU3OntXwsGmrmjI8ioGXI= -google.golang.org/genproto/googleapis/api v0.0.0-20231016165738-49dd2c1f3d0b h1:CIC2YMXmIhYw6evmhPxBKJ4fmLbOFtXQN/GV3XOZR8k= -google.golang.org/genproto/googleapis/api v0.0.0-20231016165738-49dd2c1f3d0b/go.mod h1:IBQ646DjkDkvUIsVq/cc03FUFQ9wbZu7yE396YcL870= -google.golang.org/genproto/googleapis/rpc v0.0.0-20231030173426-d783a09b4405 h1:AB/lmRny7e2pLhFEYIbl5qkDAUt2h0ZRO4wGPhZf+ik= -google.golang.org/genproto/googleapis/rpc v0.0.0-20231030173426-d783a09b4405/go.mod h1:67X1fPuzjcrkymZzZV1vvkFeTn2Rvc6lYF9MYFGCcwE= +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/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= @@ -1115,8 +1100,8 @@ google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAG google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= -google.golang.org/grpc v1.59.0 h1:Z5Iec2pjwb+LEOqzpB2MR12/eKFhDPhuqW91O+4bwUk= -google.golang.org/grpc v1.59.0/go.mod h1:aUPDwccQo6OTjy7Hct4AfBPD1GptF4fyUjIkQ9YtF98= +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/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= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= diff --git a/itest/assertions.go b/itest/assertions.go index bd208c5d4b..e190449202 100644 --- a/itest/assertions.go +++ b/itest/assertions.go @@ -46,6 +46,20 @@ var ( batchFrozen = mintrpc.BatchState_BATCH_STATE_FROZEN batchFinalized = mintrpc.BatchState_BATCH_STATE_FINALIZED + + allScriptKeysQuery = &taprpc.ScriptKeyTypeQuery{ + Type: &taprpc.ScriptKeyTypeQuery_AllTypes{ + AllTypes: true, + }, + } + + groupBalancesByAssetID = &taprpc.ListBalancesRequest_AssetId{ + AssetId: true, + } + + groupBalancesByGroupKey = &taprpc.ListBalancesRequest_GroupKey{ + GroupKey: true, + } ) // tapClient is an interface that covers all currently available RPC interfaces @@ -1336,7 +1350,8 @@ func AssertBalanceByID(t *testing.T, client taprpc.TaprootAssetsClient, GroupBy: &taprpc.ListBalancesRequest_AssetId{ AssetId: true, }, - AssetFilter: id, + AssetFilter: id, + ScriptKeyType: allScriptKeysQuery, }, ) require.NoError(t, err) @@ -1902,7 +1917,9 @@ func AssertAssetsMinted(t *testing.T, tapClient commands.RpcClientsBundle, ) listRespConfirmed, err := tapClient.ListAssets( - ctxt, &taprpc.ListAssetRequest{}, + ctxt, &taprpc.ListAssetRequest{ + ScriptKeyType: allScriptKeysQuery, + }, ) require.NoError(t, err) confirmedAssets := GroupAssetsByName(listRespConfirmed.Assets) @@ -2001,7 +2018,7 @@ func AssertGenesisOutput(t *testing.T, output *taprpc.ManagedUtxo, require.Equal(t, expectedMerkleRoot[:], output.MerkleRoot) } -func AssertAssetBalances(t *testing.T, client taprpc.TaprootAssetsClient, +func AssertMintedAssetBalances(t *testing.T, client taprpc.TaprootAssetsClient, simpleAssets, issuableAssets []*taprpc.Asset, includeLeased bool) { t.Helper() @@ -2012,12 +2029,9 @@ func AssertAssetBalances(t *testing.T, client taprpc.TaprootAssetsClient, // First, we'll ensure that we're able to get the balances of all the // assets grouped by their asset IDs. - balanceReq := &taprpc.ListBalancesRequest_AssetId{ - AssetId: true, - } assetIDBalances, err := client.ListBalances( ctxt, &taprpc.ListBalancesRequest{ - GroupBy: balanceReq, + GroupBy: groupBalancesByAssetID, IncludeLeased: includeLeased, }, ) @@ -2058,20 +2072,17 @@ func AssertAssetBalances(t *testing.T, client taprpc.TaprootAssetsClient, require.NoError(t, err) var totalAssetListBalance uint64 - for _, asset := range assetList.Assets { - totalAssetListBalance += asset.Amount + for _, a := range assetList.Assets { + totalAssetListBalance += a.Amount } require.Equal(t, totalBalance, totalAssetListBalance) // We'll also ensure that we're able to get the balance by key group // for all the assets that have one specified. - groupBalanceReq := &taprpc.ListBalancesRequest_GroupKey{ - GroupKey: true, - } assetGroupBalances, err := client.ListBalances( ctxt, &taprpc.ListBalancesRequest{ - GroupBy: groupBalanceReq, + GroupBy: groupBalancesByGroupKey, }, ) require.NoError(t, err) @@ -2080,19 +2091,311 @@ func AssertAssetBalances(t *testing.T, client taprpc.TaprootAssetsClient, t, len(issuableAssets), len(assetGroupBalances.AssetGroupBalances), ) +} - for _, balance := range assetGroupBalances.AssetBalances { - for _, rpcAsset := range issuableAssets { - if balance.AssetGenesis.Name == rpcAsset.AssetGenesis.Name { - require.Equal( - t, balance.Balance, rpcAsset.Amount, - ) - require.Equal( - t, balance.AssetGenesis, - rpcAsset.AssetGenesis, - ) +type balanceConfig struct { + assetID []byte + groupKey []byte + groupedAssetBalance uint64 + numAssetUtxos uint32 + numAnchorUtxos uint32 + includeLeased bool + allScriptKeyTypes bool + scriptKeyType *asset.ScriptKeyType + scriptKey []byte +} + +type BalanceOption func(*balanceConfig) + +func WithAssetID(assetID []byte) BalanceOption { + return func(c *balanceConfig) { + c.assetID = assetID + } +} + +func WithGroupKey(groupKey []byte) BalanceOption { + return func(c *balanceConfig) { + c.groupKey = groupKey + } +} + +func WithGroupedAssetBalance(groupedAssetBalance uint64) BalanceOption { + return func(c *balanceConfig) { + c.groupedAssetBalance = groupedAssetBalance + } +} + +func WithNumUtxos(numAssetUtxos uint32) BalanceOption { + return func(c *balanceConfig) { + c.numAssetUtxos = numAssetUtxos + } +} + +func WithNumAnchorUtxos(numAnchorUtxos uint32) BalanceOption { + return func(c *balanceConfig) { + c.numAnchorUtxos = numAnchorUtxos + } +} + +func WithIncludeLeased() BalanceOption { + return func(c *balanceConfig) { + c.includeLeased = true + } +} + +func WithAllScriptKeyTypes() BalanceOption { + return func(c *balanceConfig) { + c.allScriptKeyTypes = true + } +} + +func WithScriptKeyType(scriptKeyType asset.ScriptKeyType) BalanceOption { + return func(c *balanceConfig) { + c.scriptKeyType = &scriptKeyType + } +} + +func WithScriptKey(scriptKey []byte) BalanceOption { + return func(c *balanceConfig) { + c.scriptKey = scriptKey + + if len(scriptKey) == 33 { + xOnlyKey, _ := schnorr.ParsePubKey(scriptKey[1:]) + c.scriptKey = xOnlyKey.SerializeCompressed() + } + } +} + +func AssertBalances(t *testing.T, client taprpc.TaprootAssetsClient, + balance uint64, opts ...BalanceOption) { + + t.Helper() + + config := &balanceConfig{} + for _, opt := range opts { + opt(config) + } + + var rpcTypeQuery *taprpc.ScriptKeyTypeQuery + switch { + case config.allScriptKeyTypes: + rpcTypeQuery = &taprpc.ScriptKeyTypeQuery{ + Type: &taprpc.ScriptKeyTypeQuery_AllTypes{ + AllTypes: true, + }, + } + + case config.scriptKeyType != nil: + rpcTypeQuery = &taprpc.ScriptKeyTypeQuery{ + Type: &taprpc.ScriptKeyTypeQuery_ExplicitType{ + ExplicitType: taprpc.MarshalScriptKeyType( + *config.scriptKeyType, + ), + }, + } + } + + balanceSum := func(resp *taprpc.ListBalancesResponse, + group bool) uint64 { + + var totalBalance uint64 + + if group { + for _, currentBalance := range resp.AssetGroupBalances { + totalBalance += currentBalance.Balance + } + } else { + for _, currentBalance := range resp.AssetBalances { + totalBalance += currentBalance.Balance + } + } + + return totalBalance + } + + ctxb := context.Background() + ctxt, cancel := context.WithTimeout(ctxb, defaultWaitTimeout) + defer cancel() + + // First, we'll ensure that we're able to get the balances of all the + // assets grouped by their asset IDs. + assetIDBalances, err := client.ListBalances( + ctxt, &taprpc.ListBalancesRequest{ + GroupBy: groupBalancesByAssetID, + IncludeLeased: config.includeLeased, + ScriptKeyType: rpcTypeQuery, + AssetFilter: config.assetID, + GroupKeyFilter: config.groupKey, + }, + ) + require.NoError(t, err) + + // Spent assets (burns/tombstones) are never included in the balance, + // even if we specifically query for their type. So we skip the balance + // check in that case. We also skip if we're looking for a specific + // script key. + checkBalance := (config.scriptKeyType == nil || + (*config.scriptKeyType != asset.ScriptKeyBurn && + *config.scriptKeyType != asset.ScriptKeyTombstone)) && + len(config.scriptKey) == 0 + if checkBalance { + require.Equal( + t, balance, balanceSum(assetIDBalances, false), + "asset balance, wanted %d, got: %v", balance, + toJSON(t, assetIDBalances), + ) + } + + // Next, we do the same but grouped by group keys (if requested, since + // this only returns the balances for actually grouped assets). + if config.groupedAssetBalance > 0 { + assetGroupBalances, err := client.ListBalances( + ctxt, &taprpc.ListBalancesRequest{ + GroupBy: groupBalancesByGroupKey, + IncludeLeased: config.includeLeased, + ScriptKeyType: rpcTypeQuery, + AssetFilter: config.assetID, + GroupKeyFilter: config.groupKey, + }, + ) + require.NoError(t, err) + + // Spent assets (burns/tombstones) are never included in the + // balance, even if we specifically query for their type. So we + // skip the balance check in that case. + if checkBalance { + require.Equalf( + t, config.groupedAssetBalance, + balanceSum(assetGroupBalances, true), + "grouped balance, wanted %d, got: %v", balance, + toJSON(t, assetGroupBalances), + ) + } + } + + // Finally, we assert that the sum of all assets queried with the given + // query parameters matches the expected balance. + assetList, err := client.ListAssets(ctxt, &taprpc.ListAssetRequest{ + IncludeLeased: config.includeLeased, + ScriptKeyType: rpcTypeQuery, + }) + require.NoError(t, err) + + var ( + totalBalance uint64 + numUtxos uint32 + ) + for _, a := range assetList.Assets { + if len(config.assetID) > 0 { + if !bytes.Equal( + a.AssetGenesis.AssetId, config.assetID, + ) { + + continue + } + } + + if len(config.groupKey) > 0 { + if a.AssetGroup == nil { + continue + } + + if !bytes.Equal( + a.AssetGroup.TweakedGroupKey, config.groupKey, + ) { + + continue + } + } + + if len(config.scriptKey) > 0 { + if !bytes.Equal(a.ScriptKey, config.scriptKey) { + continue } } + + totalBalance += a.Amount + numUtxos++ + } + require.Equalf( + t, balance, totalBalance, "ListAssets balance, wanted %d, "+ + "got: %v", balance, toJSON(t, assetList), + ) + + // The number of UTXOs means asset outputs in this case. We check the + // BTC-level UTXOs below as well, but that's just to make sure the + // output of that RPC lists the same assets. + if config.numAssetUtxos > 0 { + require.Equal( + t, config.numAssetUtxos, numUtxos, "ListAssets num "+ + "asset utxos", + ) + } + + utxoList, err := client.ListUtxos(ctxt, &taprpc.ListUtxosRequest{ + IncludeLeased: config.includeLeased, + ScriptKeyType: rpcTypeQuery, + }) + require.NoError(t, err) + + // Make sure the ListUtxos call returns the same number of (asset) UTXOs + // as the ListAssets call. + var numAnchorUtxos uint32 + totalBalance = 0 + numUtxos = 0 + for _, btcUtxo := range utxoList.ManagedUtxos { + numAnchorUtxos++ + for _, assetUtxo := range btcUtxo.Assets { + if len(config.assetID) > 0 { + if !bytes.Equal( + assetUtxo.AssetGenesis.AssetId, + config.assetID, + ) { + + continue + } + } + + if len(config.groupKey) > 0 { + if assetUtxo.AssetGroup == nil { + continue + } + + if !bytes.Equal( + assetUtxo.AssetGroup.TweakedGroupKey, + config.groupKey, + ) { + + continue + } + } + + if len(config.scriptKey) > 0 { + if !bytes.Equal( + assetUtxo.ScriptKey, config.scriptKey, + ) { + + continue + } + } + + totalBalance += assetUtxo.Amount + numUtxos++ + } + } + require.Equal(t, balance, totalBalance, "ListUtxos balance") + + if config.numAnchorUtxos > 0 { + require.Equal( + t, config.numAnchorUtxos, numAnchorUtxos, "num anchor "+ + "utxos", + ) + } + if config.numAssetUtxos > 0 { + require.Equal( + t, config.numAssetUtxos, numUtxos, "ListUtxos num "+ + "asset utxos", + ) } } @@ -2198,6 +2501,7 @@ func assertNumAssetOutputs(t *testing.T, client taprpc.TaprootAssetsClient, resp, err := client.ListAssets(ctxt, &taprpc.ListAssetRequest{ IncludeLeased: true, + ScriptKeyType: allScriptKeysQuery, }) require.NoError(t, err) diff --git a/itest/assets_test.go b/itest/assets_test.go index 31b14f36fa..f0f6b9aacc 100644 --- a/itest/assets_test.go +++ b/itest/assets_test.go @@ -109,9 +109,14 @@ func testMintAssets(t *harnessTest) { // Now that all our assets have been issued, we'll use the balance // calls to ensure that we're able to retrieve the proper balance for // them all. - AssertAssetBalances( + AssertMintedAssetBalances( t.t, t.tapd, rpcSimpleAssets, rpcIssuableAssets, false, ) + AssertBalances( + t.t, t.tapd, 10002, WithNumUtxos(4), WithNumAnchorUtxos(2), + WithGroupedAssetBalance(5001), + WithScriptKeyType(asset.ScriptKeyBip86), + ) // Check that we can retrieve the group keys for the issuable assets. assertGroups(t.t, t.tapd, issuableAssets) @@ -241,7 +246,9 @@ func transferAssetProofs(t *harnessTest, src, dst *tapdHarness, } listResp, err := dst.ListAssets( - ctxt, &taprpc.ListAssetRequest{}, + ctxt, &taprpc.ListAssetRequest{ + ScriptKeyType: allScriptKeysQuery, + }, ) require.NoError(t.t, err) @@ -448,7 +455,7 @@ func testMintAssetsWithTapscriptSibling(t *harnessTest) { rpcIssuableAssets := MintAssetsConfirmBatch( t.t, t.lndHarness.Miner().Client, t.tapd, issuableAssets, ) - AssertAssetBalances( + AssertMintedAssetBalances( t.t, t.tapd, rpcSimpleAssets, rpcIssuableAssets, false, ) @@ -651,17 +658,12 @@ func testAssetBalances(t *harnessTest) { rpcSimpleAssets := MintAssetsConfirmBatch( t.t, t.lndHarness.Miner().Client, t.tapd, simpleAssets, ) - rpcIssuableAssets := MintAssetsConfirmBatch( - t.t, t.lndHarness.Miner().Client, t.tapd, issuableAssets, - ) targetAsset := rpcSimpleAssets[0] // Now that all our assets have been issued, we'll use the balance // calls to ensure that we're able to retrieve the proper balance for // them all. - AssertAssetBalances( - t.t, t.tapd, rpcSimpleAssets, rpcIssuableAssets, false, - ) + AssertMintedAssetBalances(t.t, t.tapd, rpcSimpleAssets, nil, false) // Check chain anchor for the target asset. out, err := wire.NewOutPointFromString( @@ -814,33 +816,32 @@ func testAssetBalances(t *harnessTest) { if tt.expectError { require.ErrorContains(t.t, err, tt.expectedErrMsg) - } else { - require.NoError(t.t, err) + continue + } - // With a transaction funding should have led to a - // lease on the simple assets, we'll use the balance - // calls to ensure that we're able to retrieve the - // proper balances. - rpcEmptyAssets := []*taprpc.Asset{} - AssertAssetBalances( - t.t, t.tapd, rpcEmptyAssets, rpcIssuableAssets, - false, - ) - AssertAssetBalances( - t.t, t.tapd, rpcSimpleAssets, rpcIssuableAssets, - true, - ) + require.NoError(t.t, err) - // Unlock the input if provided so it can be reused. - for _, input := range tt.inputs { - _, err = aliceTapd.RemoveUTXOLease( - ctxb, - &wrpc.RemoveUTXOLeaseRequest{ - Outpoint: input.Outpoint, - }, - ) - require.NoError(t.t, err) - } + // With a transaction funding should have led to a lease on the + // simple assets, we'll use the balance calls to ensure that + // we're able to retrieve the proper balances. + AssertBalances( + t.t, t.tapd, 0, WithAssetID(targetAssetGenesis.AssetId), + WithNumAnchorUtxos(0), + ) + AssertBalances( + t.t, t.tapd, 5000, WithIncludeLeased(), WithNumUtxos(1), + WithAssetID(targetAssetGenesis.AssetId), + WithNumAnchorUtxos(1), + ) + + // Unlock the input if provided so it can be reused. + for _, input := range tt.inputs { + _, err = aliceTapd.RemoveUTXOLease( + ctxb, &wrpc.RemoveUTXOLeaseRequest{ + Outpoint: input.Outpoint, + }, + ) + require.NoError(t.t, err) } } } diff --git a/itest/burn_test.go b/itest/burn_test.go index ec65142a58..8718559358 100644 --- a/itest/burn_test.go +++ b/itest/burn_test.go @@ -157,9 +157,10 @@ 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( - ctxt, &taprpc.ListAssetRequest{IncludeSpent: true}, - ) + allAssets, err := t.tapd.ListAssets(ctxt, &taprpc.ListAssetRequest{ + IncludeSpent: true, + ScriptKeyType: allScriptKeysQuery, + }) require.NoError(t.t, err) AssertAssetStateByScriptKey( t.t, allAssets.Assets, burnedAsset.ScriptKey, @@ -168,6 +169,10 @@ func testBurnAssets(t *harnessTest) { AssetScriptKeyIsLocalCheck(false), AssetScriptKeyIsBurnCheck(true), ) + AssertBalances( + t.t, t.tapd, burnAmt, WithNumUtxos(1), WithNumAnchorUtxos(1), + WithScriptKeyType(asset.ScriptKeyBurn), + ) // And now our asset balance should have been decreased by the burned // amount. @@ -225,6 +230,12 @@ func testBurnAssets(t *harnessTest) { ) AssertSendEventsComplete(t.t, fullSendAddr.ScriptKey, sendEvents) + AssertBalances( + t.t, t.tapd, burnAmt+simpleCollectible.Amount, + WithNumUtxos(2), WithNumAnchorUtxos(2), + WithScriptKeyType(asset.ScriptKeyBurn), + ) + // Test case 4: Burn assets from multiple inputs. This will select the // two largest inputs we have, the one over 1500 we sent above and the // 1200 from the initial fan out transfer. @@ -257,6 +268,12 @@ func testBurnAssets(t *harnessTest) { simpleAsset.Amount-burnAmt-multiBurnAmt, ) + AssertBalances( + t.t, t.tapd, burnAmt+simpleCollectible.Amount+multiBurnAmt, + WithNumUtxos(3), WithNumAnchorUtxos(3), + WithScriptKeyType(asset.ScriptKeyBurn), + ) + resp, err := t.tapd.ListAssets(ctxt, &taprpc.ListAssetRequest{ IncludeSpent: true, }) @@ -293,6 +310,13 @@ func testBurnAssets(t *harnessTest) { t.t, t.tapd, simpleGroupGen.AssetId, simpleGroup.Amount-burnAmt, ) + AssertBalances( + t.t, t.tapd, + burnAmt+simpleCollectible.Amount+multiBurnAmt+burnAmt, + WithNumUtxos(4), WithNumAnchorUtxos(4), + WithScriptKeyType(asset.ScriptKeyBurn), + ) + burns = AssertNumBurns(t.t, t.tapd, 4, nil) var groupBurn *taprpc.AssetBurn for _, b := range burns { @@ -345,6 +369,13 @@ func testBurnAssets(t *harnessTest) { ) AssertBalanceByID(t.t, t.tapd, simpleGroupCollectGen.AssetId, 0) + AssertBalances( + t.t, t.tapd, + burnAmt+simpleCollectible.Amount+multiBurnAmt+burnAmt+1, + WithNumUtxos(5), WithNumAnchorUtxos(5), + WithScriptKeyType(asset.ScriptKeyBurn), + ) + // We now perform some queries to test the filters of the ListBurns // call. @@ -454,9 +485,10 @@ func testBurnGroupedAssets(t *harnessTest) { // Ensure that the burnt asset has the correct state. burnedAsset := burnResp.BurnProof.Asset - allAssets, err := t.tapd.ListAssets( - ctxb, &taprpc.ListAssetRequest{IncludeSpent: true}, - ) + allAssets, err := t.tapd.ListAssets(ctxb, &taprpc.ListAssetRequest{ + IncludeSpent: true, + ScriptKeyType: allScriptKeysQuery, + }) require.NoError(t.t, err) AssertAssetStateByScriptKey( t.t, allAssets.Assets, burnedAsset.ScriptKey, diff --git a/itest/full_value_split_test.go b/itest/full_value_split_test.go index 8b2645797b..8c3f9517eb 100644 --- a/itest/full_value_split_test.go +++ b/itest/full_value_split_test.go @@ -3,6 +3,7 @@ package itest import ( "context" + "github.com/lightninglabs/taproot-assets/asset" "github.com/lightninglabs/taproot-assets/taprpc" "github.com/lightninglabs/taproot-assets/taprpc/mintrpc" "github.com/stretchr/testify/require" @@ -11,7 +12,7 @@ import ( // testFullValueSend tests that we can properly send the full value of a // normal asset. func testFullValueSend(t *harnessTest) { - // First, we'll make an normal assets with enough units to allow us to + // 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, @@ -37,13 +38,39 @@ func testFullValueSend(t *harnessTest) { require.NoError(t.t, secondTapd.stop(!*noDelete)) }() + // Run the test scenario with the normal asset. runFullValueSendTests( ctxt, t, t.tapd, secondTapd, genInfo, mintedAsset, 0, 1, ) + + // After the first run, we should've sent everything to Bob. But Alice + // should have two zero-value tombstones in her wallet. + AssertBalances( + t.t, t.tapd, 0, WithScriptKeyType(asset.ScriptKeyTombstone), + WithNumUtxos(2), WithNumAnchorUtxos(2), + ) + AssertBalances( + t.t, secondTapd, mintedAsset.Amount, + WithScriptKeyType(asset.ScriptKeyBip86), WithNumUtxos(1), + WithNumAnchorUtxos(1), + ) + + // Run the same scenario with the grouped asset. runFullValueSendTests( ctxt, t, t.tapd, secondTapd, groupGenInfo, mintedGroupAsset, 1, 2, ) + + // Alice should have one more zero-value tombstones in her wallet. + AssertBalances( + t.t, t.tapd, 0, WithScriptKeyType(asset.ScriptKeyTombstone), + WithNumUtxos(3), WithNumAnchorUtxos(3), + ) + AssertBalances( + t.t, secondTapd, mintedAsset.Amount+mintedGroupAsset.Amount, + WithScriptKeyType(asset.ScriptKeyBip86), WithNumUtxos(2), + WithNumAnchorUtxos(2), + ) } // runFullValueSendTests runs the full value send tests for a single asset. @@ -124,7 +151,9 @@ func runFullValueSendTests(ctxt context.Context, t *harnessTest, alice, // zero-value transfers. and Bob should have 1. The main node should // show a balance of zero, and Bob should hold the total asset supply. AssertTransfer(t.t, alice, runIdx*2, numRuns*2, []uint64{0, fullAmount}) - AssertTransfer(t.t, alice, runIdx*2+1, numRuns*2, []uint64{0, fullAmount}) + AssertTransfer( + t.t, alice, runIdx*2+1, numRuns*2, []uint64{0, fullAmount}, + ) AssertBalanceByID(t.t, alice, genInfo.AssetId, 0) AssertTransfer(t.t, bob, runIdx, numRuns, []uint64{0, fullAmount}) diff --git a/itest/psbt_test.go b/itest/psbt_test.go index 753832a72d..4712905e1b 100644 --- a/itest/psbt_test.go +++ b/itest/psbt_test.go @@ -85,6 +85,10 @@ func testPsbtScriptHashLockSend(t *harnessTest) { ctxt, t, alice, bob, numUnits, genInfo, mintedAsset, bobScriptKey, bobInternalKey, tapscript, rootHash, ) + AssertBalances( + t.t, bob, numUnits, WithNumUtxos(1), WithNumAnchorUtxos(1), + WithScriptKeyType(asset.ScriptKeyScriptPathExternal), + ) // Now try to send back those assets using the PSBT flow. aliceAddr, err := alice.NewAddr(ctxb, &taprpc.NewAddrRequest{ @@ -152,6 +156,11 @@ func testPsbtScriptHashLockSend(t *harnessTest) { assetsJSON, err := formatProtoJSON(aliceAssets) require.NoError(t.t, err) t.Logf("Got alice assets: %s", assetsJSON) + + AssertBalances( + t.t, alice, mintedAsset.Amount-numUnits/2, WithNumUtxos(2), + WithNumAnchorUtxos(2), WithScriptKeyType(asset.ScriptKeyBip86), + ) } // testPsbtScriptCheckSigSend tests that we can properly send assets with a sig @@ -205,6 +214,11 @@ func testPsbtScriptCheckSigSend(t *harnessTest) { bobScriptKey, bobInternalKey, tapscript, rootHash, ) + AssertBalances( + t.t, bob, numUnits, WithNumUtxos(1), WithNumAnchorUtxos(1), + WithScriptKeyType(asset.ScriptKeyScriptPathExternal), + ) + // Now try to send back those assets using the PSBT flow. aliceAddr, err := alice.NewAddr(ctxb, &taprpc.NewAddrRequest{ AssetId: genInfo.AssetId, @@ -274,6 +288,11 @@ func testPsbtScriptCheckSigSend(t *harnessTest) { assetsJSON, err := formatProtoJSON(aliceAssets) require.NoError(t.t, err) t.Logf("Got alice assets: %s", assetsJSON) + + AssertBalances( + t.t, alice, mintedAsset.Amount-numUnits/2, WithNumUtxos(2), + WithNumAnchorUtxos(2), WithScriptKeyType(asset.ScriptKeyBip86), + ) } // testPsbtNormalInteractiveFullValueSend tests that we can properly send normal @@ -874,7 +893,9 @@ func runPsbtInteractiveSplitSendTest(ctxt context.Context, t *harnessTest, ) senderAssets, err := sender.ListAssets( - ctxt, &taprpc.ListAssetRequest{}, + ctxt, &taprpc.ListAssetRequest{ + ScriptKeyType: allScriptKeysQuery, + }, ) require.NoError(t.t, err) @@ -898,7 +919,9 @@ func runPsbtInteractiveSplitSendTest(ctxt context.Context, t *harnessTest, require.Len(t.t, senderAssets.Assets, numSenderAssets) receiverAssets, err := receiver.ListAssets( - ctxt, &taprpc.ListAssetRequest{}, + ctxt, &taprpc.ListAssetRequest{ + ScriptKeyType: allScriptKeysQuery, + }, ) require.NoError(t.t, err) require.Len(t.t, receiverAssets.Assets, numReceiverAssets) @@ -1226,13 +1249,17 @@ func testPsbtInteractiveTapscriptSibling(t *harnessTest) { ) senderAssets, err := alice.ListAssets( - ctxt, &taprpc.ListAssetRequest{}, + ctxt, &taprpc.ListAssetRequest{ + ScriptKeyType: allScriptKeysQuery, + }, ) require.NoError(t.t, err) require.Len(t.t, senderAssets.Assets, 1) receiverAssets, err := bob.ListAssets( - ctxt, &taprpc.ListAssetRequest{}, + ctxt, &taprpc.ListAssetRequest{ + ScriptKeyType: allScriptKeysQuery, + }, ) require.NoError(t.t, err) require.Len(t.t, receiverAssets.Assets, 1) @@ -1402,13 +1429,17 @@ func testPsbtMultiSend(t *harnessTest) { ) senderAssets, err := sender.ListAssets( - ctxt, &taprpc.ListAssetRequest{}, + ctxt, &taprpc.ListAssetRequest{ + ScriptKeyType: allScriptKeysQuery, + }, ) require.NoError(t.t, err) require.Len(t.t, senderAssets.Assets, 4) receiverAssets, err := receiver.ListAssets( - ctxt, &taprpc.ListAssetRequest{}, + ctxt, &taprpc.ListAssetRequest{ + ScriptKeyType: allScriptKeysQuery, + }, ) require.NoError(t.t, err) require.Len(t.t, receiverAssets.Assets, 2) diff --git a/itest/send_test.go b/itest/send_test.go index 1a7b037d8b..8ffb9786b4 100644 --- a/itest/send_test.go +++ b/itest/send_test.go @@ -1757,6 +1757,10 @@ func testSendMultipleCoins(t *harnessTest) { ) AssertNonInteractiveRecvComplete(t.t, t.tapd, 5) AssertSendEventsComplete(t.t, addrs[0].ScriptKey, sendEvents) + AssertBalances( + t.t, t.tapd, rpcAssets[0].Amount, WithNumUtxos(numParts), + WithNumAnchorUtxos(numParts), + ) // Next, we'll attempt to complete 5 parallel transfers with distinct // addresses from our main node to Bob. @@ -1809,6 +1813,14 @@ func testSendMultipleCoins(t *harnessTest) { for idx, events := range addrSendEvents { AssertSendEventsComplete(t.t, bobAddrs[idx].ScriptKey, events) } + + // Finally, we make sure that both the sender and receiver have the + // correct number of asset units and UTXOs in their wallets. + AssertBalances(t.t, t.tapd, 0, WithNumAnchorUtxos(0)) + AssertBalances( + t.t, secondTapd, unitsPerPart*numParts, WithNumUtxos(numParts), + WithNumAnchorUtxos(numParts), + ) } // testSendNoCourierUniverseImport tests that we can send assets to a node that diff --git a/itest/utils.go b/itest/utils.go index aaa63b1ff0..ba31b79d84 100644 --- a/itest/utils.go +++ b/itest/utils.go @@ -449,6 +449,7 @@ func FinalizeBatchUnconfirmed(t *testing.T, minerClient *rpcclient.Client, listRespUnconfirmed, err := tapClient.ListAssets( ctxt, &taprpc.ListAssetRequest{ IncludeUnconfirmedMints: true, + ScriptKeyType: allScriptKeysQuery, }, ) require.NoError(t, err) diff --git a/rpcserver.go b/rpcserver.go index a3bfbb3ede..ce57c8a73a 100644 --- a/rpcserver.go +++ b/rpcserver.go @@ -1010,7 +1010,7 @@ func (r *rpcServer) checkBalanceOverflow(ctx context.Context, case assetID != nil: // Retrieve the current asset balance. balances, err := r.cfg.AssetStore.QueryBalancesByAsset( - ctx, assetID, true, + ctx, assetID, true, fn.None[asset.ScriptKeyType](), ) if err != nil { return fmt.Errorf("unable to query asset balance: %w", @@ -1026,7 +1026,7 @@ func (r *rpcServer) checkBalanceOverflow(ctx context.Context, case groupPubKey != nil: // Retrieve the current balance of the group. balances, err := r.cfg.AssetStore.QueryAssetBalancesByGroup( - ctx, groupPubKey, true, + ctx, groupPubKey, true, fn.None[asset.ScriptKeyType](), ) if err != nil { return fmt.Errorf("unable to query group balance: %w", @@ -1060,9 +1060,8 @@ func (r *rpcServer) ListAssets(ctx context.Context, } constraints := tapfreighter.CommitmentConstraints{ - MinAmt: req.MinAmount, - MaxAmt: req.MaxAmount, - CoinSelectType: tapsend.DefaultCoinSelectType, + MinAmt: req.MinAmount, + MaxAmt: req.MaxAmount, } if len(req.GroupKey) > 0 { @@ -1105,9 +1104,18 @@ func (r *rpcServer) ListAssets(ctx context.Context, filters.AnchorPoint = outPoint } + scriptKeyType, includeSpent, err := taprpc.ParseScriptKeyTypeQuery( + req.ScriptKeyType, + ) + if err != nil { + return nil, fmt.Errorf("unable to parse script key type "+ + "query: %w", err) + } + filters.ScriptKeyType = scriptKeyType + rpcAssets, err := r.fetchRpcAssets( - ctx, req.WithWitness, req.IncludeSpent, req.IncludeLeased, - filters, + ctx, req.WithWitness, req.IncludeSpent || includeSpent, + req.IncludeLeased, filters, ) if err != nil { @@ -1225,11 +1233,12 @@ func (r *rpcServer) MarshalChainAsset(ctx context.Context, a asset.ChainAsset, } func (r *rpcServer) listBalancesByAsset(ctx context.Context, - assetID *asset.ID, includeLeased bool) (*taprpc.ListBalancesResponse, + assetID *asset.ID, includeLeased bool, + skt fn.Option[asset.ScriptKeyType]) (*taprpc.ListBalancesResponse, error) { balances, err := r.cfg.AssetStore.QueryBalancesByAsset( - ctx, assetID, includeLeased, + ctx, assetID, includeLeased, skt, ) if err != nil { return nil, fmt.Errorf("unable to list balances: %w", err) @@ -1260,11 +1269,12 @@ func (r *rpcServer) listBalancesByAsset(ctx context.Context, } func (r *rpcServer) listBalancesByGroupKey(ctx context.Context, - groupKey *btcec.PublicKey, - includeLeased bool) (*taprpc.ListBalancesResponse, error) { + groupKey *btcec.PublicKey, includeLeased bool, + skt fn.Option[asset.ScriptKeyType]) (*taprpc.ListBalancesResponse, + error) { balances, err := r.cfg.AssetStore.QueryAssetBalancesByGroup( - ctx, groupKey, includeLeased, + ctx, groupKey, includeLeased, skt, ) if err != nil { return nil, fmt.Errorf("unable to list balances: %w", err) @@ -1299,8 +1309,22 @@ func (r *rpcServer) listBalancesByGroupKey(ctx context.Context, func (r *rpcServer) ListUtxos(ctx context.Context, req *taprpc.ListUtxosRequest) (*taprpc.ListUtxosResponse, error) { + scriptKeyType, includeSpent, err := taprpc.ParseScriptKeyTypeQuery( + req.ScriptKeyType, + ) + if err != nil { + return nil, fmt.Errorf("unable to parse script key type "+ + "query: %w", err) + } + + filters := &tapdb.AssetQueryFilters{ + CommitmentConstraints: tapfreighter.CommitmentConstraints{ + ScriptKeyType: scriptKeyType, + }, + } + rpcAssets, err := r.fetchRpcAssets( - ctx, false, false, req.IncludeLeased, nil, + ctx, false, includeSpent, req.IncludeLeased, filters, ) if err != nil { return nil, err @@ -1402,6 +1426,14 @@ func (r *rpcServer) ListGroups(ctx context.Context, func (r *rpcServer) ListBalances(ctx context.Context, req *taprpc.ListBalancesRequest) (*taprpc.ListBalancesResponse, error) { + scriptKeyType, _, err := taprpc.ParseScriptKeyTypeQuery( + req.ScriptKeyType, + ) + if err != nil { + return nil, fmt.Errorf("unable to parse script key type "+ + "query: %w", err) + } + switch groupBy := req.GroupBy.(type) { case *taprpc.ListBalancesRequest_AssetId: if !groupBy.AssetId { @@ -1418,7 +1450,9 @@ func (r *rpcServer) ListBalances(ctx context.Context, copy(assetID[:], req.AssetFilter) } - return r.listBalancesByAsset(ctx, assetID, req.IncludeLeased) + return r.listBalancesByAsset( + ctx, assetID, req.IncludeLeased, scriptKeyType, + ) case *taprpc.ListBalancesRequest_GroupKey: if !groupBy.GroupKey { @@ -1436,7 +1470,7 @@ func (r *rpcServer) ListBalances(ctx context.Context, } return r.listBalancesByGroupKey( - ctx, groupKey, req.IncludeLeased, + ctx, groupKey, req.IncludeLeased, scriptKeyType, ) default: @@ -2175,7 +2209,7 @@ func (r *rpcServer) FundVirtualPsbt(ctx context.Context, req *wrpc.FundVirtualPsbtRequest) (*wrpc.FundVirtualPsbtResponse, error) { - coinSelectType, err := unmarshalCoinSelectType(req.CoinSelectType) + scriptKeyType, err := unmarshalCoinSelectType(req.CoinSelectType) if err != nil { return nil, fmt.Errorf("error parsing coin select type: %w", err) @@ -2202,7 +2236,7 @@ func (r *rpcServer) FundVirtualPsbt(ctx context.Context, "recipients: %w", err) } - desc.CoinSelectType = coinSelectType + desc.ScriptKeyType = scriptKeyType fundedVPkt, err = r.cfg.AssetWallet.FundPacket(ctx, desc, vPkt) if err != nil { return nil, fmt.Errorf("error funding packet: %w", err) @@ -2272,7 +2306,7 @@ func (r *rpcServer) FundVirtualPsbt(ctx context.Context, } fundedVPkt, err = r.cfg.AssetWallet.FundAddressSend( - ctx, coinSelectType, prevIDs, addr, + ctx, scriptKeyType, prevIDs, addr, ) if err != nil { return nil, fmt.Errorf("error funding address send: "+ @@ -2321,23 +2355,24 @@ func (r *rpcServer) FundVirtualPsbt(ctx context.Context, return response, nil } -// unmarshalCoinSelectType converts an RPC select type into a native one. +// unmarshalCoinSelectType converts an RPC select type into a script key type +// that can be used to select the appropriate inputs. func unmarshalCoinSelectType( - coinSelectType wrpc.CoinSelectType) (tapsend.CoinSelectType, error) { + coinSelectType wrpc.CoinSelectType) (fn.Option[asset.ScriptKeyType], + error) { switch coinSelectType { - case wrpc.CoinSelectType_COIN_SELECT_DEFAULT: - return tapsend.DefaultCoinSelectType, nil + case wrpc.CoinSelectType_COIN_SELECT_DEFAULT, + wrpc.CoinSelectType_COIN_SELECT_SCRIPT_TREES_ALLOWED: - case wrpc.CoinSelectType_COIN_SELECT_BIP86_ONLY: - return tapsend.Bip86Only, nil + return fn.None[asset.ScriptKeyType](), nil - case wrpc.CoinSelectType_COIN_SELECT_SCRIPT_TREES_ALLOWED: - return tapsend.ScriptTreesAllowed, nil + case wrpc.CoinSelectType_COIN_SELECT_BIP86_ONLY: + return fn.Some(asset.ScriptKeyBip86), nil default: - return 0, fmt.Errorf("unknown coin select type: %d", - coinSelectType) + return fn.None[asset.ScriptKeyType](), fmt.Errorf("unknown "+ + "coin select type: %d", coinSelectType) } } @@ -8154,7 +8189,20 @@ func (r *rpcServer) DeclareScriptKey(ctx context.Context, err) } - err = r.cfg.TapAddrBook.InsertScriptKey(ctx, *scriptKey, true) + // Because we've been given the key over the RPC interface, we can't be + // 100% sure of the type, if it wasn't declared. But we can make a + // best-effort guess based on the fields the user has set. This is a + // no-op if the type is already set. + scriptKey.Type = scriptKey.DetermineType() + + // The user is declaring the key, so they should know what type it is. + // So if they didn't set it, and it wasn't an obvious one, we'll require + // them to set it. + if scriptKey.Type == asset.ScriptKeyUnknown { + return nil, fmt.Errorf("script key type must be set") + } + + err = r.cfg.TapAddrBook.InsertScriptKey(ctx, *scriptKey, scriptKey.Type) if err != nil { return nil, fmt.Errorf("error inserting script key: %w", err) } diff --git a/tapcfg/server.go b/tapcfg/server.go index 4970f49a9f..b2f5449a6d 100644 --- a/tapcfg/server.go +++ b/tapcfg/server.go @@ -27,13 +27,6 @@ import ( "github.com/lightningnetwork/lnd/signal" ) -// databaseBackend is an interface that contains all methods our different -// database backends implement. -type databaseBackend interface { - tapdb.BatchedQuerier - WithTx(tx *sql.Tx) *sqlc.Queries -} - // genServerConfig generates a server config from the given tapd config. // // NOTE: The RPCConfig and SignalInterceptor fields must be set by the caller @@ -44,7 +37,7 @@ func genServerConfig(cfg *Config, cfgLogger btclog.Logger, var ( err error - db databaseBackend + db tapdb.DatabaseBackend dbType sqlc.BackendType ) diff --git a/tapchannel/aux_closer.go b/tapchannel/aux_closer.go index f474e1b0da..20f633fae5 100644 --- a/tapchannel/aux_closer.go +++ b/tapchannel/aux_closer.go @@ -560,12 +560,6 @@ func (a *AuxChanCloser) ShutdownBlob( return none, err } - err = a.cfg.AddrBook.InsertScriptKey(ctx, newKey, true) - if err != nil { - return none, fmt.Errorf("error declaring script key: "+ - "%w", err) - } - scriptKeys[assetID] = *newKey.PubKey } diff --git a/tapchannel/aux_funding_controller.go b/tapchannel/aux_funding_controller.go index 61a9c7e40a..e2fc9830e9 100644 --- a/tapchannel/aux_funding_controller.go +++ b/tapchannel/aux_funding_controller.go @@ -797,7 +797,7 @@ func (f *FundingController) fundVirtualPacket(ctx context.Context, fundDesc := &tapsend.FundingDescriptor{ AssetSpecifier: specifier, Amount: amt, - CoinSelectType: tapsend.Bip86Only, + ScriptKeyType: fn.Some(asset.ScriptKeyBip86), DistinctSpecifier: true, } diff --git a/tapchannel/aux_sweeper.go b/tapchannel/aux_sweeper.go index 6460719d7a..7d5a233a78 100644 --- a/tapchannel/aux_sweeper.go +++ b/tapchannel/aux_sweeper.go @@ -1264,7 +1264,9 @@ func (a *AuxSweeper) importCommitScriptKeys(req lnwallet.ResolutionReq) error { ctxb := context.Background() for _, key := range keysToImport { - err := a.cfg.AddrBook.InsertScriptKey(ctxb, key, true) + err := a.cfg.AddrBook.InsertScriptKey( + ctxb, key, asset.ScriptKeyScriptPathChannel, + ) if err != nil { return fmt.Errorf("unable to insert script "+ "key: %w", err) @@ -1296,7 +1298,9 @@ func (a *AuxSweeper) importOutputScriptKeys(desc tapscriptSweepDescs) error { log.Debugf("Importing script_keys=%v", limitSpewer.Sdump(scriptKey)) - return a.cfg.AddrBook.InsertScriptKey(ctxb, scriptKey, true) + return a.cfg.AddrBook.InsertScriptKey( + ctxb, scriptKey, asset.ScriptKeyScriptPathChannel, + ) } if err := importScriptKey(desc.firstLevel); err != nil { @@ -1489,7 +1493,9 @@ func (a *AuxSweeper) importCommitTx(req lnwallet.ResolutionReq, // the asset will be materialized in the asset table and show up in the // balance correctly. ctxb := context.Background() - err := a.cfg.AddrBook.InsertScriptKey(ctxb, fundingScriptKey, true) + err := a.cfg.AddrBook.InsertScriptKey( + ctxb, fundingScriptKey, asset.ScriptKeyScriptPathChannel, + ) if err != nil { return fmt.Errorf("unable to insert script key: %w", err) } diff --git a/tapchannel/commitment.go b/tapchannel/commitment.go index 9f23b7b2fe..21854aaf67 100644 --- a/tapchannel/commitment.go +++ b/tapchannel/commitment.go @@ -1494,7 +1494,9 @@ func deriveFundingScriptKey(ctx context.Context, addrBook address.Storage, // We'll also need to import the funding script key into the wallet so // the asset will be materialized in the asset table and show up in the // balance correctly. - err := addrBook.InsertScriptKey(ctx, fundingScriptKey, true) + err := addrBook.InsertScriptKey( + ctx, fundingScriptKey, asset.ScriptKeyScriptPathChannel, + ) if err != nil { return asset.ScriptKey{}, fmt.Errorf("unable to insert script "+ "key: %w", err) diff --git a/tapdb/addrs.go b/tapdb/addrs.go index 2db2af5f2c..563de00772 100644 --- a/tapdb/addrs.go +++ b/tapdb/addrs.go @@ -268,6 +268,9 @@ func (t *TapAddressBook) InsertAddrs(ctx context.Context, InternalKeyID: rawScriptKeyID, TweakedScriptKey: addr.ScriptKey.SerializeCompressed(), Tweak: addr.ScriptKeyTweak.Tweak, + KeyType: sqlInt16( + addr.ScriptKeyTweak.Type, + ), }) if err != nil { return fmt.Errorf("unable to insert script "+ @@ -404,22 +407,13 @@ func (t *TapAddressBook) QueryAddrs(ctx context.Context, } } - rawScriptKey, err := btcec.ParsePubKey( - addr.RawScriptKey, + scriptKey, err := parseScriptKey( + addr.InternalKey, addr.ScriptKey, ) if err != nil { return fmt.Errorf("unable to decode "+ "script key: %w", err) } - rawScriptKeyDesc := keychain.KeyDescriptor{ - KeyLocator: keychain.KeyLocator{ - Family: keychain.KeyFamily( - addr.ScriptKeyFamily, - ), - Index: uint32(addr.ScriptKeyIndex), - }, - PubKey: rawScriptKey, - } internalKey, err := btcec.ParsePubKey(addr.RawTaprootKey) if err != nil { @@ -436,11 +430,6 @@ func (t *TapAddressBook) QueryAddrs(ctx context.Context, PubKey: internalKey, } - scriptKey, err := btcec.ParsePubKey(addr.TweakedScriptKey) - if err != nil { - return err - } - taprootOutputKey, err := schnorr.ParsePubKey( addr.TaprootOutputKey, ) @@ -467,8 +456,8 @@ func (t *TapAddressBook) QueryAddrs(ctx context.Context, tapAddr, err := address.New( address.Version(addr.Version), assetGenesis, - groupKey, groupWitness, - *scriptKey, *internalKey, uint64(addr.Amount), + groupKey, groupWitness, *scriptKey.PubKey, + *internalKey, uint64(addr.Amount), tapscriptSibling, t.params, *proofCourierAddr, address.WithAssetVersion( asset.Version(addr.AssetVersion), @@ -478,16 +467,9 @@ func (t *TapAddressBook) QueryAddrs(ctx context.Context, return fmt.Errorf("unable to make addr: %w", err) } - declaredKnown := extractBool( - addr.ScriptKeyDeclaredKnown, - ) addrs = append(addrs, address.AddrWithKeyInfo{ - Tap: tapAddr, - ScriptKeyTweak: asset.TweakedScriptKey{ - RawKey: rawScriptKeyDesc, - Tweak: addr.ScriptKeyTweak, - DeclaredKnown: declaredKnown, - }, + Tap: tapAddr, + ScriptKeyTweak: *scriptKey.TweakedScriptKey, InternalKeyDesc: internalKeyDesc, TaprootOutputKey: *taprootOutputKey, CreationTime: addr.CreationTime.UTC(), @@ -571,21 +553,7 @@ func fetchAddr(ctx context.Context, db AddrBook, params *address.ChainParams, } } - rawScriptKey, err := btcec.ParsePubKey(dbAddr.RawScriptKey) - if err != nil { - return nil, fmt.Errorf("unable to decode script key: %w", err) - } - scriptKeyDesc := keychain.KeyDescriptor{ - KeyLocator: keychain.KeyLocator{ - Family: keychain.KeyFamily( - dbAddr.ScriptKeyFamily, - ), - Index: uint32(dbAddr.ScriptKeyIndex), - }, - PubKey: rawScriptKey, - } - - scriptKey, err := btcec.ParsePubKey(dbAddr.TweakedScriptKey) + scriptKey, err := parseScriptKey(dbAddr.InternalKey, dbAddr.ScriptKey) if err != nil { return nil, fmt.Errorf("unable to decode script key: %w", err) } @@ -622,8 +590,9 @@ func fetchAddr(ctx context.Context, db AddrBook, params *address.ChainParams, tapAddr, err := address.New( address.Version(dbAddr.Version), genesis, groupKey, - groupWitness, *scriptKey, *internalKey, uint64(dbAddr.Amount), - tapscriptSibling, params, *proofCourierAddr, + groupWitness, *scriptKey.PubKey, *internalKey, + uint64(dbAddr.Amount), tapscriptSibling, params, + *proofCourierAddr, address.WithAssetVersion(asset.Version(dbAddr.AssetVersion)), ) if err != nil { @@ -631,14 +600,8 @@ func fetchAddr(ctx context.Context, db AddrBook, params *address.ChainParams, } return &address.AddrWithKeyInfo{ - Tap: tapAddr, - ScriptKeyTweak: asset.TweakedScriptKey{ - RawKey: scriptKeyDesc, - Tweak: dbAddr.ScriptKeyTweak, - DeclaredKnown: extractBool( - dbAddr.ScriptKeyDeclaredKnown, - ), - }, + Tap: tapAddr, + ScriptKeyTweak: *scriptKey.TweakedScriptKey, InternalKeyDesc: internalKeyDesc, TaprootOutputKey: *taprootOutputKey, CreationTime: dbAddr.CreationTime.UTC(), @@ -689,7 +652,7 @@ func (t *TapAddressBook) InsertInternalKey(ctx context.Context, // it can be recognized as belonging to the wallet when a transfer comes in // later on. func (t *TapAddressBook) InsertScriptKey(ctx context.Context, - scriptKey asset.ScriptKey, declaredKnown bool) error { + scriptKey asset.ScriptKey, keyType asset.ScriptKeyType) error { var writeTxOpts AddrBookTxOptions return t.db.ExecTx(ctx, &writeTxOpts, func(q AddrBook) error { @@ -705,7 +668,7 @@ func (t *TapAddressBook) InsertScriptKey(ctx context.Context, InternalKeyID: internalKeyID, TweakedScriptKey: scriptKey.PubKey.SerializeCompressed(), Tweak: scriptKey.Tweak, - DeclaredKnown: sqlBool(declaredKnown), + KeyType: sqlInt16(keyType), }) return err }) diff --git a/tapdb/addrs_test.go b/tapdb/addrs_test.go index c3e306ace9..b700dd4d8a 100644 --- a/tapdb/addrs_test.go +++ b/tapdb/addrs_test.go @@ -3,7 +3,6 @@ package tapdb import ( "context" "database/sql" - "fmt" "math/rand" "testing" "time" @@ -660,39 +659,13 @@ func randScriptKey(t *testing.T) asset.ScriptKey { return scriptKey } -// insertScriptKeyWithNull is a helper function that inserts a script key with a -// a NULL value for declared known. We use this so we can insert a NULL vs an -// actual value. It is identical to the InsertScriptKey. -func insertScriptKeyWithNull(ctx context.Context, key asset.ScriptKey, -) func(AddrBook) error { - - return func(q AddrBook) error { - internalKeyID, err := insertInternalKey( - ctx, q, key.RawKey, - ) - if err != nil { - return fmt.Errorf("error inserting internal key: %w", - err) - } - - _, err = q.UpsertScriptKey(ctx, NewScriptKey{ - InternalKeyID: internalKeyID, - TweakedScriptKey: key.PubKey.SerializeCompressed(), - Tweak: key.Tweak, - DeclaredKnown: sql.NullBool{ - Valid: false, - }, - }) - return err - } -} - func assertKeyKnowledge(t *testing.T, ctx context.Context, - addrBook *TapAddressBook, scriptKey asset.ScriptKey, known bool) { + addrBook *TapAddressBook, scriptKey asset.ScriptKey, + keyType asset.ScriptKeyType) { dbScriptKey, err := addrBook.FetchScriptKey(ctx, scriptKey.PubKey) require.NoError(t, err) - require.Equal(t, known, dbScriptKey.DeclaredKnown) + require.Equal(t, keyType, dbScriptKey.Type) } func assertTweak(t *testing.T, ctx context.Context, addrBook *TapAddressBook, @@ -703,9 +676,9 @@ func assertTweak(t *testing.T, ctx context.Context, addrBook *TapAddressBook, require.Equal(t, tweak, dbScriptKey.Tweak) } -// TestScriptKeyKnownUpsert tests that we can insert a script key, then insert -// it again declared as known. -func TestScriptKeyKnownUpsert(t *testing.T) { +// TestScriptKeyTweakUpsert tests that we can insert a script key, then insert +// it again when we know the tweak for it. +func TestScriptKeyTweakUpsert(t *testing.T) { t.Parallel() // First, make a new addr book instance we'll use in the test below. @@ -714,61 +687,47 @@ func TestScriptKeyKnownUpsert(t *testing.T) { ctx := context.Background() - // In this test, we insert the known field as false, and make sure we - // can flip it back to true. - t.Run("false_to_true", func(t *testing.T) { - known := false + // In this test, we insert the tweak as NULL, and make sure we overwrite + // it with an actual value again later. + t.Run("null_to_value", func(t *testing.T) { scriptKey := randScriptKey(t) + scriptKey.Tweak = nil // We'll insert a random script key into the database. We won't - // declare it as known though. - err := addrBook.InsertScriptKey(ctx, scriptKey, known) - require.NoError(t, err) - - // We'll fetch the script key and confirm that it's not known. - assertKeyKnowledge(t, ctx, addrBook, scriptKey, known) - - known = true - - // We'll now insert it again, but this time declare it as known. - err = addrBook.InsertScriptKey(ctx, scriptKey, known) - require.NoError(t, err) - - // We'll fetch the script key and confirm that it's known. - assertKeyKnowledge(t, ctx, addrBook, scriptKey, known) - }) - - // In this test, we insert a NULL value, and make sure that it can still - // be set to true. - t.Run("null_to_true", func(t *testing.T) { - known := false - scriptKey := randScriptKey(t) - - // We'll lift the internal routine of InsertScriptKey so we can - // insert an actual NULL here. - err := addrBook.db.ExecTx( - ctx, &AddrBookTxOptions{}, - insertScriptKeyWithNull(ctx, scriptKey), + // declare it as known though, and it doesn't have the tweak. + err := addrBook.InsertScriptKey( + ctx, scriptKey, asset.ScriptKeyUnknown, ) require.NoError(t, err) // We'll fetch the script key and confirm that it's not known. - assertKeyKnowledge(t, ctx, addrBook, scriptKey, known) + assertKeyKnowledge( + t, ctx, addrBook, scriptKey, asset.ScriptKeyUnknown, + ) + assertTweak(t, ctx, addrBook, scriptKey, nil) - known = true + randTweak := test.RandBytes(32) + scriptKey.Tweak = randTweak - // We'll now insert it again, but this time declare it as known. - err = addrBook.InsertScriptKey(ctx, scriptKey, known) + // We'll now insert it again, but this time declare it as known + // and also know the tweak. + err = addrBook.InsertScriptKey( + ctx, scriptKey, asset.ScriptKeyScriptPathExternal, + ) require.NoError(t, err) // We'll fetch the script key and confirm that it's known. - assertKeyKnowledge(t, ctx, addrBook, scriptKey, known) + assertKeyKnowledge( + t, ctx, addrBook, scriptKey, + asset.ScriptKeyScriptPathExternal, + ) + assertTweak(t, ctx, addrBook, scriptKey, randTweak) }) } -// TestScriptKeyTweakUpsert tests that we can insert a script key, then insert -// it again when we know the tweak for it. -func TestScriptKeyTweakUpsert(t *testing.T) { +// TestScriptKeyTypeUpsert tests that we can insert a script key, then insert +// it again when we know the type for it. +func TestScriptKeyTypeUpsert(t *testing.T) { t.Parallel() // First, make a new addr book instance we'll use in the test below. @@ -777,33 +736,35 @@ func TestScriptKeyTweakUpsert(t *testing.T) { ctx := context.Background() - // In this test, we insert the tweak as NULL, and make sure we overwrite - // it with an actual value again later. + // In this test, we insert the type as unknown, and make sure we + // overwrite it with an actual value again later. t.Run("null_to_value", func(t *testing.T) { - known := false scriptKey := randScriptKey(t) scriptKey.Tweak = nil - // We'll insert a random script key into the database. We won't - // declare it as known though, and it doesn't have the tweak. - err := addrBook.InsertScriptKey(ctx, scriptKey, known) + // We'll insert a random script key into the database. It is + // declared as known, but doesn't have a known type. + err := addrBook.InsertScriptKey( + ctx, scriptKey, asset.ScriptKeyUnknown, + ) require.NoError(t, err) // We'll fetch the script key and confirm that it's not known. - assertKeyKnowledge(t, ctx, addrBook, scriptKey, known) + assertKeyKnowledge( + t, ctx, addrBook, scriptKey, asset.ScriptKeyUnknown, + ) assertTweak(t, ctx, addrBook, scriptKey, nil) - known = true - randTweak := test.RandBytes(32) - scriptKey.Tweak = randTweak - // We'll now insert it again, but this time declare it as known // and also know the tweak. - err = addrBook.InsertScriptKey(ctx, scriptKey, known) + err = addrBook.InsertScriptKey( + ctx, scriptKey, asset.ScriptKeyBip86, + ) require.NoError(t, err) // We'll fetch the script key and confirm that it's known. - assertKeyKnowledge(t, ctx, addrBook, scriptKey, known) - assertTweak(t, ctx, addrBook, scriptKey, randTweak) + assertKeyKnowledge( + t, ctx, addrBook, scriptKey, asset.ScriptKeyBip86, + ) }) } diff --git a/tapdb/asset_minting.go b/tapdb/asset_minting.go index 075ebc0c72..5d5f74e224 100644 --- a/tapdb/asset_minting.go +++ b/tapdb/asset_minting.go @@ -268,7 +268,7 @@ var ( // fails. ErrBindBatchTx = errors.New("unable to bind batch tx") - // ErrEcodePsbt is returned when serializing a PSBT fails. + // ErrEncodePsbt is returned when serializing a PSBT fails. ErrEncodePsbt = errors.New("unable to encode psbt") ) @@ -737,15 +737,15 @@ func fetchAssetSeedlings(ctx context.Context, q PendingAssetStore, PubKey: scriptKeyInternalPub, } scriptKeyTweak := dbSeedling.ScriptKeyTweak - declaredKnown := extractBool( - dbSeedling.ScriptKeyDeclaredKnown, + scriptType := extractSqlInt16[asset.ScriptKeyType]( + dbSeedling.ScriptKeyType, ) seedling.ScriptKey = asset.ScriptKey{ PubKey: tweakedScriptKey, TweakedScriptKey: &asset.TweakedScriptKey{ - RawKey: scriptKeyRawKey, - Tweak: scriptKeyTweak, - DeclaredKnown: declaredKnown, + RawKey: scriptKeyRawKey, + Tweak: scriptKeyTweak, + Type: scriptType, }, } } @@ -853,35 +853,12 @@ func fetchAssetSprouts(ctx context.Context, q PendingAssetStore, for i, sprout := range dbSprout { // First, we'll decode the script key which very asset must // specify, and populate the key locator information - tweakedScriptKey, err := btcec.ParsePubKey( - sprout.TweakedScriptKey, + scriptKey, err := parseScriptKey( + sprout.InternalKey, sprout.ScriptKey, ) if err != nil { - return nil, err - } - - internalScriptKey, err := btcec.ParsePubKey( - sprout.ScriptKeyRaw, - ) - if err != nil { - return nil, err - } - - scriptKeyDesc := keychain.KeyDescriptor{ - PubKey: internalScriptKey, - KeyLocator: keychain.KeyLocator{ - Index: uint32(sprout.ScriptKeyIndex), - Family: keychain.KeyFamily(sprout.ScriptKeyFam), - }, - } - declaredKnown := extractBool(sprout.ScriptKeyDeclaredKnown) - scriptKey := asset.ScriptKey{ - PubKey: tweakedScriptKey, - TweakedScriptKey: &asset.TweakedScriptKey{ - RawKey: scriptKeyDesc, - Tweak: sprout.Tweak, - DeclaredKnown: declaredKnown, - }, + return nil, fmt.Errorf("unable to decode script key: "+ + "%w", err) } // Not all assets have a key group, so we only need to diff --git a/tapdb/asset_minting_test.go b/tapdb/asset_minting_test.go index 4f71cfd2ab..0c59de0b0b 100644 --- a/tapdb/asset_minting_test.go +++ b/tapdb/asset_minting_test.go @@ -1143,7 +1143,9 @@ func TestCommitBatchChainActions(t *testing.T) { // We'll now query for the set of balances to ensure they all line up // with the assets we just created, including the group genesis asset. - assetBalances, err := confAssets.QueryBalancesByAsset(ctx, nil, false) + assetBalances, err := confAssets.QueryBalancesByAsset( + ctx, nil, false, fn.None[asset.ScriptKeyType](), + ) require.NoError(t, err) require.Equal(t, numSeedlings+1, len(assetBalances)) @@ -1165,7 +1167,7 @@ func TestCommitBatchChainActions(t *testing.T) { } numKeyGroups := fn.Reduce(mintedAssets, keyGroupSumReducer) assetBalancesByGroup, err := confAssets.QueryAssetBalancesByGroup( - ctx, nil, false, + ctx, nil, false, fn.None[asset.ScriptKeyType](), ) require.NoError(t, err) require.Equal(t, numKeyGroups, len(assetBalancesByGroup)) diff --git a/tapdb/assets_common.go b/tapdb/assets_common.go index e8b4d2239d..1b3eda95e7 100644 --- a/tapdb/assets_common.go +++ b/tapdb/assets_common.go @@ -134,7 +134,7 @@ var ( // exactly 32 bytes. ErrTapscriptRootSize = errors.New("tapscript root invalid: wrong size") - // ErrFetchGenesisAsset is returned when fetching the database ID for an + // ErrFetchGenesisID is returned when fetching the database ID for an // asset genesis fails. ErrFetchGenesisID = errors.New("unable to fetch genesis asset") ) @@ -424,6 +424,7 @@ func upsertScriptKey(ctx context.Context, scriptKey asset.ScriptKey, InternalKeyID: rawScriptKeyID, TweakedScriptKey: scriptKey.PubKey.SerializeCompressed(), Tweak: scriptKey.Tweak, + KeyType: sqlInt16(scriptKey.Type), }) if err != nil { return 0, fmt.Errorf("%w: %w", ErrUpsertScriptKey, err) @@ -455,6 +456,7 @@ func upsertScriptKey(ctx context.Context, scriptKey asset.ScriptKey, scriptKeyID, err = q.UpsertScriptKey(ctx, NewScriptKey{ InternalKeyID: rawScriptKeyID, TweakedScriptKey: scriptKey.PubKey.SerializeCompressed(), + KeyType: sqlInt16(asset.ScriptKeyUnknown), }) if err != nil { return 0, fmt.Errorf("%w: %w", ErrUpsertScriptKey, err) @@ -485,26 +487,61 @@ func fetchScriptKey(ctx context.Context, q FetchScriptKeyStore, return nil, err } - rawKey, err := btcec.ParsePubKey(dbKey.RawKey) + scriptKey, err := parseScriptKey(dbKey.InternalKey, dbKey.ScriptKey) if err != nil { - return nil, fmt.Errorf("unable to parse raw key: %w", err) + return nil, err } - scriptKey := &asset.TweakedScriptKey{ - Tweak: dbKey.Tweak, - RawKey: keychain.KeyDescriptor{ - PubKey: rawKey, - KeyLocator: keychain.KeyLocator{ - Family: keychain.KeyFamily( - dbKey.KeyFamily, + return scriptKey.TweakedScriptKey, nil +} + +// parseScriptKey maps a script key and internal key from the database into a +// ScriptKey struct. Both the internal raw public key and the tweaked public key +// must be set and valid. +func parseScriptKey(ik sqlc.InternalKey, sk sqlc.ScriptKey) (asset.ScriptKey, + error) { + + var emptyKey asset.ScriptKey + if len(sk.TweakedScriptKey) == 0 { + return emptyKey, fmt.Errorf("tweaked script key is empty") + } + + if len(ik.RawKey) == 0 { + return emptyKey, fmt.Errorf("internal raw key is empty") + } + + var ( + locator = keychain.KeyLocator{ + Index: uint32(ik.KeyIndex), + Family: keychain.KeyFamily(ik.KeyFamily), + } + result = asset.ScriptKey{ + TweakedScriptKey: &asset.TweakedScriptKey{ + RawKey: keychain.KeyDescriptor{ + KeyLocator: locator, + }, + Tweak: sk.Tweak, + Type: extractSqlInt16[asset.ScriptKeyType]( + sk.KeyType, ), - Index: uint32(dbKey.KeyIndex), }, - }, - DeclaredKnown: extractBool(dbKey.DeclaredKnown), + } + err error + ) + + result.PubKey, err = btcec.ParsePubKey(sk.TweakedScriptKey) + if err != nil { + return emptyKey, fmt.Errorf("error parsing tweaked script "+ + "key: %w", err) + } + + result.RawKey.PubKey, err = btcec.ParsePubKey(ik.RawKey) + if err != nil { + return emptyKey, fmt.Errorf("error parsing internal raw "+ + "key: %w", err) } - return scriptKey, nil + return result, nil } // FetchGenesisStore houses the methods related to fetching genesis assets. diff --git a/tapdb/assets_store.go b/tapdb/assets_store.go index 894f2467c2..d6ff8214bd 100644 --- a/tapdb/assets_store.go +++ b/tapdb/assets_store.go @@ -23,8 +23,6 @@ import ( "github.com/lightninglabs/taproot-assets/tapdb/sqlc" "github.com/lightninglabs/taproot-assets/tapfreighter" "github.com/lightninglabs/taproot-assets/tappsbt" - "github.com/lightninglabs/taproot-assets/tapscript" - "github.com/lightninglabs/taproot-assets/tapsend" "github.com/lightningnetwork/lnd/clock" "github.com/lightningnetwork/lnd/keychain" ) @@ -624,8 +622,8 @@ func parseAssetWitness(input AssetWitness) (asset.Witness, error) { // dbAssetsToChainAssets maps a set of confirmed assets in the database, and // the witnesses of those assets to a set of normal ChainAsset structs needed // by a higher level application. -func (a *AssetStore) dbAssetsToChainAssets(dbAssets []ConfirmedAsset, - witnesses assetWitnesses) ([]*asset.ChainAsset, error) { +func dbAssetsToChainAssets(dbAssets []ConfirmedAsset, witnesses assetWitnesses, + dbClock clock.Clock) ([]*asset.ChainAsset, error) { chainAssets := make([]*asset.ChainAsset, len(dbAssets)) for i := range dbAssets { @@ -633,16 +631,12 @@ func (a *AssetStore) dbAssetsToChainAssets(dbAssets []ConfirmedAsset, // First, we'll decode the script key which every asset must // specify, and populate the key locator information. - rawScriptKeyPub, err := btcec.ParsePubKey(sprout.ScriptKeyRaw) + scriptKey, err := parseScriptKey( + sprout.InternalKey, sprout.ScriptKey, + ) if err != nil { - return nil, err - } - rawScriptKeyDesc := keychain.KeyDescriptor{ - PubKey: rawScriptKeyPub, - KeyLocator: keychain.KeyLocator{ - Index: uint32(sprout.ScriptKeyIndex), - Family: keychain.KeyFamily(sprout.ScriptKeyFam), - }, + return nil, fmt.Errorf("unable to decode script key: "+ + "%w", err) } // Not all assets have a key group, so we only need to @@ -726,20 +720,6 @@ func (a *AssetStore) dbAssetsToChainAssets(dbAssets []ConfirmedAsset, amount = 1 } - scriptKeyPub, err := btcec.ParsePubKey(sprout.TweakedScriptKey) - if err != nil { - return nil, err - } - declaredKnown := extractBool(sprout.ScriptKeyDeclaredKnown) - scriptKey := asset.ScriptKey{ - PubKey: scriptKeyPub, - TweakedScriptKey: &asset.TweakedScriptKey{ - RawKey: rawScriptKeyDesc, - Tweak: sprout.ScriptKeyTweak, - DeclaredKnown: declaredKnown, - }, - } - assetSprout, err := asset.New( assetGenesis, amount, lockTime, relativeLocktime, scriptKey, groupKey, @@ -753,7 +733,9 @@ func (a *AssetStore) dbAssetsToChainAssets(dbAssets []ConfirmedAsset, // We cannot use 0 as the amount when creating a new asset with // the New function above. But if this is a tombstone asset, we // actually have to set the amount to 0. - if scriptKeyPub.IsEqual(asset.NUMSPubKey) && sprout.Amount == 0 { + if scriptKey.PubKey.IsEqual(asset.NUMSPubKey) && + sprout.Amount == 0 { + assetSprout.Amount = 0 } @@ -845,7 +827,7 @@ func (a *AssetStore) dbAssetsToChainAssets(dbAssets []ConfirmedAsset, owner := sprout.AnchorLeaseOwner expiry := sprout.AnchorLeaseExpiry if len(owner) > 0 && expiry.Valid && - expiry.Time.UTC().After(a.clock.Now().UTC()) { + expiry.Time.UTC().After(dbClock.Now().UTC()) { copy(chainAssets[i].AnchorLeaseOwner[:], owner) chainAssets[i].AnchorLeaseExpiry = &expiry.Time @@ -913,13 +895,11 @@ func (a *AssetStore) constraintsToDbFilter( assetFilter.AssetIDFilter = nil } - switch query.CoinSelectType { - case tapsend.ScriptTreesAllowed: - assetFilter.Bip86ScriptKeysOnly = false - - default: - assetFilter.Bip86ScriptKeysOnly = true - } + // The fn.None option means we don't restrict on script key type + // at all. + query.ScriptKeyType.WhenSome(func(t asset.ScriptKeyType) { + assetFilter.ScriptKeyType = sqlInt16(t) + }) } return assetFilter, nil @@ -1006,8 +986,8 @@ type AssetQueryFilters struct { // QueryBalancesByAsset queries the balances for assets or alternatively // for a selected one that matches the passed asset ID filter. func (a *AssetStore) QueryBalancesByAsset(ctx context.Context, - assetID *asset.ID, - includeLeased bool) (map[asset.ID]AssetBalance, error) { + assetID *asset.ID, includeLeased bool, + skt fn.Option[asset.ScriptKeyType]) (map[asset.ID]AssetBalance, error) { // We'll now map the application level filtering to the type of // filtering our database query understands. @@ -1020,12 +1000,23 @@ func (a *AssetStore) QueryBalancesByAsset(ctx context.Context, // We exclude the assets that are specifically used for funding custom // channels. The balance of those assets is reported through lnd channel - // balance. Those assets are identified by the funding script tree for a - // custom channel asset-level script key. - excludeKey := asset.NewScriptKey( - tapscript.NewChannelFundingScriptTree().TaprootKey, + // balance. Those assets are identified by the specific script key type + // for channel keys. We exclude them unless explicitly queried for. + assetBalancesFilter.ExcludeScriptKeyType = sqlInt16( + asset.ScriptKeyScriptPathChannel, ) - assetBalancesFilter.ExcludeKey = excludeKey.PubKey.SerializeCompressed() + + // The fn.None option means we don't restrict on script key type at all. + skt.WhenSome(func(t asset.ScriptKeyType) { + assetBalancesFilter.ScriptKeyType = sqlInt16(t) + + // If the user explicitly wants to see the channel related asset + // balances, we need to set the exclude type to NULL. + if t == asset.ScriptKeyScriptPathChannel { + nullValue := sql.NullInt16{} + assetBalancesFilter.ExcludeScriptKeyType = nullValue + } + }) // By default, we only show assets that are not leased. if !includeLeased { @@ -1086,9 +1077,9 @@ func (a *AssetStore) QueryBalancesByAsset(ctx context.Context, // QueryAssetBalancesByGroup queries the asset balances for asset groups or // alternatively for a selected one that matches the passed filter. func (a *AssetStore) QueryAssetBalancesByGroup(ctx context.Context, - groupKey *btcec.PublicKey, - includeLeased bool) (map[asset.SerializedKey]AssetGroupBalance, - error) { + groupKey *btcec.PublicKey, includeLeased bool, + skt fn.Option[asset.ScriptKeyType]) ( + map[asset.SerializedKey]AssetGroupBalance, error) { // We'll now map the application level filtering to the type of // filtering our database query understands. @@ -1101,12 +1092,23 @@ func (a *AssetStore) QueryAssetBalancesByGroup(ctx context.Context, // We exclude the assets that are specifically used for funding custom // channels. The balance of those assets is reported through lnd channel - // balance. Those assets are identified by the funding script tree for a - // custom channel asset-level script key. - excludeKey := asset.NewScriptKey( - tapscript.NewChannelFundingScriptTree().TaprootKey, + // balance. Those assets are identified by the specific script key type + // for channel keys. We exclude them unless explicitly queried for. + assetBalancesFilter.ExcludeScriptKeyType = sqlInt16( + asset.ScriptKeyScriptPathChannel, ) - assetBalancesFilter.ExcludeKey = excludeKey.PubKey.SerializeCompressed() + + // The fn.None option means we don't restrict on script key type at all. + skt.WhenSome(func(t asset.ScriptKeyType) { + assetBalancesFilter.ScriptKeyType = sqlInt16(t) + + // If the user explicitly wants to see the channel related asset + // balances, we need to set the exclude type to NULL. + if t == asset.ScriptKeyScriptPathChannel { + nullValue := sql.NullInt16{} + assetBalancesFilter.ExcludeScriptKeyType = nullValue + } + }) // By default, we only show assets that are not leased. if !includeLeased { @@ -1251,7 +1253,7 @@ func (a *AssetStore) FetchAllAssets(ctx context.Context, includeSpent, return nil, dbErr } - return a.dbAssetsToChainAssets(dbAssets, assetWitnesses) + return dbAssetsToChainAssets(dbAssets, assetWitnesses, a.clock) } // FetchManagedUTXOs fetches all UTXOs we manage. @@ -1519,8 +1521,8 @@ func locatorToProofQuery(locator proof.Locator) (FetchAssetProof, error) { // the FileArchiver. // // NOTE: This implements the proof.Archiver interface. -func (a *AssetStore) FetchIssuanceProof(ctx context.Context, id asset.ID, - anchorOutpoint wire.OutPoint) (proof.Blob, error) { +func (a *AssetStore) FetchIssuanceProof(_ context.Context, _ asset.ID, + _ wire.OutPoint) (proof.Blob, error) { return nil, proof.ErrProofNotFound } @@ -1963,7 +1965,9 @@ func (a *AssetStore) queryChainAssets(ctx context.Context, q ActiveAssetsStore, if err != nil { return nil, err } - matchingAssets, err := a.dbAssetsToChainAssets(dbAssets, assetWitnesses) + matchingAssets, err := dbAssetsToChainAssets( + dbAssets, assetWitnesses, a.clock, + ) if err != nil { return nil, err } @@ -2687,10 +2691,14 @@ func insertAssetTransferOutput(ctx context.Context, q ActiveAssetsStore, scriptInternalKey := keychain.KeyDescriptor{ PubKey: output.ScriptKey.PubKey, } - var tweak []byte + var ( + tweak []byte + scriptKeyType sql.NullInt16 + ) if output.ScriptKey.TweakedScriptKey != nil { scriptInternalKey = output.ScriptKey.RawKey tweak = output.ScriptKey.Tweak + scriptKeyType = sqlInt16(output.ScriptKey.Type) } scriptInternalKeyID, err := q.UpsertInternalKey(ctx, InternalKey{ RawKey: scriptInternalKey.PubKey.SerializeCompressed(), @@ -2705,6 +2713,7 @@ func insertAssetTransferOutput(ctx context.Context, q ActiveAssetsStore, InternalKeyID: scriptInternalKeyID, TweakedScriptKey: output.ScriptKey.PubKey.SerializeCompressed(), Tweak: tweak, + KeyType: scriptKeyType, }) if err != nil { return fmt.Errorf("unable to insert script key: %w", err) @@ -2787,29 +2796,14 @@ func fetchAssetTransferOutputs(ctx context.Context, q ActiveAssetsStore, "key: %w", err) } - scriptKey, err := btcec.ParsePubKey(dbOut.ScriptKeyBytes) + scriptKey, err := parseScriptKey( + dbOut.InternalKey, dbOut.ScriptKey, + ) if err != nil { return nil, fmt.Errorf("unable to decode script key: "+ "%w", err) } - rawScriptKey, err := btcec.ParsePubKey( - dbOut.ScriptKeyRawKeyBytes, - ) - if err != nil { - return nil, fmt.Errorf("unable to decode raw script "+ - "key: %w", err) - } - - scriptKeyLocator := keychain.KeyLocator{ - Family: keychain.KeyFamily( - dbOut.ScriptKeyFamily, - ), - Index: uint32( - dbOut.ScriptKeyIndex, - ), - } - var splitRootHash mssmt.NodeHash copy(splitRootHash[:], dbOut.SplitCommitmentRootHash) @@ -2824,7 +2818,6 @@ func fetchAssetTransferOutputs(ctx context.Context, q ActiveAssetsStore, err) } - declaredKnown := extractBool(dbOut.ScriptKeyDeclaredKnown) outputAnchor := tapfreighter.Anchor{ Value: btcutil.Amount( dbOut.AnchorValue, @@ -2876,19 +2869,9 @@ func fetchAssetTransferOutputs(ctx context.Context, q ActiveAssetsStore, LockTime: uint64(dbOut.LockTime.Int32), RelativeLockTime: uint64(dbOut.RelativeLockTime.Int32), AssetVersion: asset.Version(dbOut.AssetVersion), - ScriptKey: asset.ScriptKey{ - PubKey: scriptKey, - TweakedScriptKey: &asset.TweakedScriptKey{ - RawKey: keychain.KeyDescriptor{ - PubKey: rawScriptKey, - KeyLocator: scriptKeyLocator, - }, - Tweak: dbOut.ScriptKeyTweak, - DeclaredKnown: declaredKnown, - }, - }, - ScriptKeyLocal: dbOut.ScriptKeyLocal, - WitnessData: witnessData, + ScriptKey: scriptKey, + ScriptKeyLocal: dbOut.ScriptKeyLocal, + WitnessData: witnessData, SplitCommitmentRoot: mssmt.NewComputedNode( splitRootHash, uint64(dbOut.SplitCommitmentRootValue.Int64), @@ -3167,13 +3150,14 @@ func (a *AssetStore) LogAnchorTxConfirm(ctx context.Context, "witness: %w", err) } - scriptPubKey, err := btcec.ParsePubKey( - out.ScriptKeyBytes, + fullScriptKey, err := parseScriptKey( + out.InternalKey, out.ScriptKey, ) if err != nil { return fmt.Errorf("unable to decode script "+ "key: %w", err) } + scriptPubKey := fullScriptKey.PubKey isNumsKey := scriptPubKey.IsEqual(asset.NUMSPubKey) isTombstone := isNumsKey && @@ -3181,7 +3165,7 @@ func (a *AssetStore) LogAnchorTxConfirm(ctx context.Context, out.OutputType == int16(tappsbt.TypeSplitRoot) isBurn := !isNumsKey && len(witnessData) > 0 && asset.IsBurnKey(scriptPubKey, witnessData[0]) - isKnown := extractBool(out.ScriptKeyDeclaredKnown) + isKnown := fullScriptKey.Type != asset.ScriptKeyUnknown skipAssetCreation := !isTombstone && !isBurn && !out.ScriptKeyLocal && !isKnown @@ -3235,7 +3219,7 @@ func (a *AssetStore) LogAnchorTxConfirm(ctx context.Context, } params := ApplyPendingOutput{ - ScriptKeyID: out.ScriptKeyID, + ScriptKeyID: out.ScriptKey.ScriptKeyID, AnchorUtxoID: sqlInt64( out.AnchorUtxoID, ), @@ -3277,7 +3261,7 @@ func (a *AssetStore) LogAnchorTxConfirm(ctx context.Context, if !ok { return fmt.Errorf("no proof found for output "+ "with script key %x", - out.ScriptKeyBytes) + scriptPubKey.SerializeCompressed()) } localProofKeys = append(localProofKeys, outKey) diff --git a/tapdb/assets_store_test.go b/tapdb/assets_store_test.go index bcc5ccf87d..25b8ab19ea 100644 --- a/tapdb/assets_store_test.go +++ b/tapdb/assets_store_test.go @@ -11,6 +11,7 @@ import ( "time" "github.com/btcsuite/btcd/btcec/v2" + "github.com/btcsuite/btcd/btcec/v2/schnorr" "github.com/btcsuite/btcd/chaincfg/chainhash" "github.com/btcsuite/btcd/txscript" "github.com/btcsuite/btcd/wire" @@ -24,7 +25,6 @@ import ( "github.com/lightninglabs/taproot-assets/tapdb/sqlc" "github.com/lightninglabs/taproot-assets/tapfreighter" "github.com/lightninglabs/taproot-assets/tapscript" - "github.com/lightninglabs/taproot-assets/tapsend" "github.com/lightningnetwork/lnd/input" "github.com/lightningnetwork/lnd/keychain" "github.com/stretchr/testify/require" @@ -730,12 +730,6 @@ func filterMaxAmt(amt uint64) filterOpt { } } -func filterCoinSelectType(typ tapsend.CoinSelectType) filterOpt { - return func(f *AssetQueryFilters) { - f.CoinSelectType = typ - } -} - func filterDistinctSpecifier() filterOpt { return func(f *AssetQueryFilters) { f.DistinctSpecifier = true @@ -760,6 +754,12 @@ func filterScriptKey(key *asset.ScriptKey) filterOpt { } } +func filterScriptKeyType(keyType asset.ScriptKeyType) filterOpt { + return func(f *AssetQueryFilters) { + f.ScriptKeyType = fn.Some(keyType) + } +} + // TestFetchAllAssets tests that the different AssetQueryFilters work as // expected. func TestFetchAllAssets(t *testing.T) { @@ -889,14 +889,12 @@ func TestFetchAllAssets(t *testing.T) { name: "min amount", filter: makeFilter( filterMinAmt(12), - filterCoinSelectType(tapsend.ScriptTreesAllowed), ), numAssets: 2, }, { name: "min amount, include spent", filter: makeFilter( filterMinAmt(12), - filterCoinSelectType(tapsend.ScriptTreesAllowed), ), includeSpent: true, numAssets: 4, @@ -904,7 +902,6 @@ func TestFetchAllAssets(t *testing.T) { name: "min amount, include leased", filter: makeFilter( filterMinAmt(12), - filterCoinSelectType(tapsend.ScriptTreesAllowed), ), includeLeased: true, numAssets: 5, @@ -912,7 +909,6 @@ func TestFetchAllAssets(t *testing.T) { name: "min amount, include leased, include spent", filter: makeFilter( filterMinAmt(12), - filterCoinSelectType(tapsend.ScriptTreesAllowed), ), includeLeased: true, includeSpent: true, @@ -921,14 +917,12 @@ func TestFetchAllAssets(t *testing.T) { name: "max amount", filter: makeFilter( filterMaxAmt(100), - filterCoinSelectType(tapsend.ScriptTreesAllowed), ), numAssets: 6, }, { name: "max amount, include spent", filter: makeFilter( filterMaxAmt(100), - filterCoinSelectType(tapsend.ScriptTreesAllowed), ), includeSpent: true, numAssets: 7, @@ -936,7 +930,6 @@ func TestFetchAllAssets(t *testing.T) { name: "max amount, include leased", filter: makeFilter( filterMaxAmt(100), - filterCoinSelectType(tapsend.ScriptTreesAllowed), ), includeLeased: true, numAssets: 8, @@ -944,7 +937,6 @@ func TestFetchAllAssets(t *testing.T) { name: "max amount, include leased, include spent", filter: makeFilter( filterMaxAmt(100), - filterCoinSelectType(tapsend.ScriptTreesAllowed), ), includeLeased: true, includeSpent: true, @@ -953,7 +945,6 @@ func TestFetchAllAssets(t *testing.T) { name: "default min height, include spent", filter: makeFilter( filterAnchorHeight(500), - filterCoinSelectType(tapsend.ScriptTreesAllowed), ), includeSpent: true, numAssets: 8, @@ -961,14 +952,12 @@ func TestFetchAllAssets(t *testing.T) { name: "specific height", filter: makeFilter( filterAnchorHeight(512), - filterCoinSelectType(tapsend.ScriptTreesAllowed), ), numAssets: 0, }, { name: "specific height, include spent", filter: makeFilter( filterAnchorHeight(502), - filterCoinSelectType(tapsend.ScriptTreesAllowed), ), includeSpent: true, numAssets: 3, @@ -976,21 +965,19 @@ func TestFetchAllAssets(t *testing.T) { name: "script key with tapscript", filter: makeFilter( filterMinAmt(100), - filterCoinSelectType(tapsend.Bip86Only), + filterScriptKeyType(asset.ScriptKeyBip86), ), numAssets: 0, }, { name: "query by script key", filter: makeFilter( filterScriptKey(scriptKeyWithScript), - filterCoinSelectType(tapsend.ScriptTreesAllowed), ), numAssets: 1, }, { name: "query by script key, include leased", filter: makeFilter( filterScriptKey(scriptKeyWithScript), - filterCoinSelectType(tapsend.ScriptTreesAllowed), ), includeLeased: true, numAssets: 2, @@ -1022,7 +1009,6 @@ func TestFetchAllAssets(t *testing.T) { name: "query by anchor point", filter: makeFilter( filterAnchorPoint(&assetGen.anchorPoints[0]), - filterCoinSelectType(tapsend.ScriptTreesAllowed), ), numAssets: 3, }} @@ -2944,11 +2930,11 @@ func TestQueryAssetBalances(t *testing.T) { // At first, none of the assets should be leased. includeLeased := false balances, err := assetsStore.QueryBalancesByAsset( - ctx, nil, includeLeased, + ctx, nil, includeLeased, fn.None[asset.ScriptKeyType](), ) require.NoError(t, err) balancesByGroup, err := assetsStore.QueryAssetBalancesByGroup( - ctx, nil, includeLeased, + ctx, nil, includeLeased, fn.None[asset.ScriptKeyType](), ) require.NoError(t, err) require.Len(t, balances, numAssets) @@ -2984,14 +2970,14 @@ func TestQueryAssetBalances(t *testing.T) { // Only two assets should be returned that is not leased. unleasedBalances, err := assetsStore.QueryBalancesByAsset( - ctx, nil, includeLeased, + ctx, nil, includeLeased, fn.None[asset.ScriptKeyType](), ) require.NoError(t, err) require.Len(t, unleasedBalances, numAssets-2) // Only one group should be returned that is not leased. unleasedBalancesByGroup, err := assetsStore.QueryAssetBalancesByGroup( - ctx, nil, includeLeased, + ctx, nil, includeLeased, fn.None[asset.ScriptKeyType](), ) require.NoError(t, err) require.Len(t, unleasedBalancesByGroup, numGroups-1) @@ -3014,12 +3000,12 @@ func TestQueryAssetBalances(t *testing.T) { // the same results as when the assets where unleased. includeLeased = true includeLeasedBalances, err := assetsStore.QueryBalancesByAsset( - ctx, nil, includeLeased, + ctx, nil, includeLeased, fn.None[asset.ScriptKeyType](), ) require.NoError(t, err) require.Len(t, includeLeasedBalances, numAssets) includeLeasedBalByGroup, err := assetsStore.QueryAssetBalancesByGroup( - ctx, nil, includeLeased, + ctx, nil, includeLeased, fn.None[asset.ScriptKeyType](), ) require.NoError(t, err) require.Len(t, includeLeasedBalByGroup, len(assetGen.groupKeys)) @@ -3049,23 +3035,33 @@ func TestQueryAssetBalancesCustomChannelFunding(t *testing.T) { const numGroups = 1 assetGen := newAssetGenerator(t, numAssets, numGroups) - fundingScriptKey := asset.NewScriptKey( - tapscript.NewChannelFundingScriptTree().TaprootKey, + fundingKey := tapscript.NewChannelFundingScriptTree() + xOnlyKey, _ := schnorr.ParsePubKey( + schnorr.SerializePubKey(fundingKey.TaprootKey), ) + fundingScriptKey := asset.ScriptKey{ + PubKey: xOnlyKey, + TweakedScriptKey: &asset.TweakedScriptKey{ + RawKey: keychain.KeyDescriptor{ + PubKey: fundingKey.InternalKey, + }, + Type: asset.ScriptKeyScriptPathChannel, + }, + } assetDesc := []assetDesc{ { assetGen: assetGen.assetGens[0], anchorPoint: assetGen.anchorPoints[0], keyGroup: assetGen.groupKeys[0], - amt: 4, + amt: 8, scriptKey: &fundingScriptKey, }, { assetGen: assetGen.assetGens[1], anchorPoint: assetGen.anchorPoints[1], keyGroup: assetGen.groupKeys[0], - amt: 4, + amt: 12, }, } assetGen.genAssets(t, assetsStore, assetDesc) @@ -3073,11 +3069,11 @@ func TestQueryAssetBalancesCustomChannelFunding(t *testing.T) { // Hit both balance queries, they should return the same result. includeLeased := false balances, err := assetsStore.QueryBalancesByAsset( - ctx, nil, includeLeased, + ctx, nil, includeLeased, fn.None[asset.ScriptKeyType](), ) require.NoError(t, err) balancesByGroup, err := assetsStore.QueryAssetBalancesByGroup( - ctx, nil, includeLeased, + ctx, nil, includeLeased, fn.None[asset.ScriptKeyType](), ) require.NoError(t, err) require.Len(t, balances, numAssets-1) @@ -3096,4 +3092,31 @@ func TestQueryAssetBalancesCustomChannelFunding(t *testing.T) { balanceByGroupSum += balance.Balance } require.Equal(t, assetDesc[1].amt, balanceByGroupSum) + + // If we explicitly query for channel related script keys, we should get + // just those assets. + balances, err = assetsStore.QueryBalancesByAsset( + ctx, nil, includeLeased, + fn.Some(asset.ScriptKeyScriptPathChannel), + ) + require.NoError(t, err) + balancesByGroup, err = assetsStore.QueryAssetBalancesByGroup( + ctx, nil, includeLeased, + fn.Some(asset.ScriptKeyScriptPathChannel), + ) + require.NoError(t, err) + require.Len(t, balances, numAssets-1) + require.Len(t, balancesByGroup, numAssets-1) + + balanceSum = uint64(0) + for _, balance := range balances { + balanceSum += balance.Balance + } + require.Equal(t, assetDesc[0].amt, balanceSum) + + balanceByGroupSum = uint64(0) + for _, balance := range balancesByGroup { + balanceByGroupSum += balance.Balance + } + require.Equal(t, assetDesc[0].amt, balanceByGroupSum) } diff --git a/tapdb/migrations.go b/tapdb/migrations.go index b9e9c588f2..8f13ec7ac7 100644 --- a/tapdb/migrations.go +++ b/tapdb/migrations.go @@ -2,6 +2,7 @@ package tapdb import ( "bytes" + "database/sql" "errors" "fmt" "io" @@ -14,6 +15,7 @@ import ( "github.com/golang-migrate/migrate/v4/database" "github.com/golang-migrate/migrate/v4/source/httpfs" "github.com/lightninglabs/taproot-assets/fn" + "github.com/lightninglabs/taproot-assets/tapdb/sqlc" ) const ( @@ -22,9 +24,16 @@ const ( // daemon. // // NOTE: This MUST be updated when a new migration is added. - LatestMigrationVersion = 32 + LatestMigrationVersion = 34 ) +// DatabaseBackend is an interface that contains all methods our different +// Database backends implement. +type DatabaseBackend interface { + BatchedQuerier + WithTx(tx *sql.Tx) *sqlc.Queries +} + // MigrationTarget is a functional option that can be passed to applyMigrations // to specify a target version to migrate to. `currentDbVersion` is the current // (migration) version of the database, or None if unknown. @@ -58,13 +67,16 @@ var ( // migrationOption is a functional option that can be passed to migrate related // methods to modify their behavior. type migrateOptions struct { - latestVersion fn.Option[uint] + latestVersion fn.Option[uint] + postStepCallbacks map[uint]migrate.PostStepCallback } // defaultMigrateOptions returns a new migrateOptions instance with default // settings. func defaultMigrateOptions() *migrateOptions { - return &migrateOptions{} + return &migrateOptions{ + postStepCallbacks: make(map[uint]migrate.PostStepCallback), + } } // MigrateOpt is a functional option that can be passed to migrate related @@ -79,6 +91,21 @@ func WithLatestVersion(version uint) MigrateOpt { } } +// WithPostStepCallbacks is an option that can be used to set a map of +// PostStepCallback functions that can be used to execute a Golang based +// migration step after a SQL based migration step has been executed. The key is +// the migration version and the value is the callback function that should be +// run _after_ the step was executed (but before the version is marked as +// cleanly executed). An error returned from the callback will cause the +// migration to fail and the step to be marked as dirty. +func WithPostStepCallbacks( + postStepCallbacks map[uint]migrate.PostStepCallback) MigrateOpt { + + return func(o *migrateOptions) { + o.postStepCallbacks = postStepCallbacks + } +} + // migrationLogger is a logger that wraps the passed btclog.Logger so it can be // used to log migrations. type migrationLogger struct { @@ -133,6 +160,7 @@ func applyMigrations(fs fs.FS, driver database.Driver, path, dbName string, // above. sqlMigrate, err := migrate.NewWithInstance( "migrations", migrateFileServer, dbName, driver, + migrate.WithPostStepCallbacks(opts.postStepCallbacks), ) if err != nil { return err diff --git a/tapdb/migrations_test.go b/tapdb/migrations_test.go index bb0eba0d06..0696b3c5e7 100644 --- a/tapdb/migrations_test.go +++ b/tapdb/migrations_test.go @@ -2,6 +2,7 @@ package tapdb import ( "context" + "encoding/hex" "fmt" "os" "path/filepath" @@ -555,3 +556,117 @@ func TestMigration31(t *testing.T) { "constraint", ) } + +// TestMigration33 tests that the Golang based post migration check for the +// script key type detection works as expected. It verifies that the script key +// types are detected correctly and that the migration to version 31 works as +// expected. +func TestMigration33(t *testing.T) { + ctx := context.Background() + + db := NewTestDBWithVersion(t, 32) + + // We need to insert some test data that will be affected by the + // migration number 31. + InsertTestdata(t, db.BaseDB, "migrations_test_00033_dummy_data.sql") + + // And now that we have test data inserted, we can migrate to the latest + // version. + err := db.ExecuteMigrations(TargetLatest, WithPostStepCallbacks( + makePostStepCallbacks(db, postMigrationChecks), + )) + require.NoError(t, err) + + // The migration should have de-duplicated the assets, so we should now + // only have two valid/distinct assets with two witnesses and one proof + // each. So we're just asserting the expected state _after_ the + // migration has run. + unknownKey, _ := hex.DecodeString( + "039c571fffcac1a1a7cd3372bd202ad8562f28e48b90f8a4eb714eca062f" + + "576ee6", + ) + unknownScriptKey, err := db.BaseDB.FetchScriptKeyByTweakedKey( + ctx, unknownKey, + ) + require.NoError(t, err) + require.Equal( + t, asset.ScriptKeyUnknown, extractSqlInt16[asset.ScriptKeyType]( + unknownScriptKey.ScriptKey.KeyType, + ), + ) + + bip86Key, _ := hex.DecodeString( + "029c571fffcac1a1a7cd3372bd202ad8562f28e48b90f8a4eb714eca062f" + + "576ee6", + ) + bip86ScriptKey, err := db.BaseDB.FetchScriptKeyByTweakedKey( + ctx, bip86Key, + ) + require.NoError(t, err) + require.EqualValues( + t, asset.ScriptKeyBip86, + extractSqlInt16[asset.ScriptKeyType]( + bip86ScriptKey.ScriptKey.KeyType, + ), + ) + + scriptedKey, _ := hex.DecodeString( + "03f9cdf1ff7c9fbb0ea3c8533cd7048994f41ea20a79764469c22aa18aa6" + + "696169", + ) + scriptedScriptKey, err := db.BaseDB.FetchScriptKeyByTweakedKey( + ctx, scriptedKey, + ) + require.NoError(t, err) + require.EqualValues( + t, asset.ScriptKeyScriptPathExternal, + extractSqlInt16[asset.ScriptKeyType]( + scriptedScriptKey.ScriptKey.KeyType, + ), + ) + + tombstoneKey, _ := hex.DecodeString( + "027c79b9b26e463895eef5679d8558942c86c4ad2233adef01bc3e6d540b" + + "3653fe", + ) + tombstoneScriptKey, err := db.BaseDB.FetchScriptKeyByTweakedKey( + ctx, tombstoneKey, + ) + require.NoError(t, err) + require.EqualValues( + t, asset.ScriptKeyTombstone, + extractSqlInt16[asset.ScriptKeyType]( + tombstoneScriptKey.ScriptKey.KeyType, + ), + ) + + channelKey, _ := hex.DecodeString( + "0350aaeb166f4234650d84a2d8a130987aeaf6950206e0905401ee74ff3f" + + "8d18e6", + ) + channelScriptKey, err := db.BaseDB.FetchScriptKeyByTweakedKey( + ctx, channelKey, + ) + require.NoError(t, err) + require.EqualValues( + t, asset.ScriptKeyScriptPathChannel, + extractSqlInt16[asset.ScriptKeyType]( + channelScriptKey.ScriptKey.KeyType, + ), + ) + + burnKey, _ := hex.DecodeString( + "02248bca7dbb12dcf0b490263a1d521691691aa2541842b7472c83acac0e" + + "88443b", + ) + burnScriptKey, err := db.BaseDB.FetchScriptKeyByTweakedKey( + ctx, burnKey, + ) + require.NoError(t, err) + require.EqualValues( + t, asset.ScriptKeyBurn, + extractSqlInt16[asset.ScriptKeyType]( + burnScriptKey.ScriptKey.KeyType, + ), + ) +} diff --git a/tapdb/post_migration_checks.go b/tapdb/post_migration_checks.go new file mode 100644 index 0000000000..08ca986c1f --- /dev/null +++ b/tapdb/post_migration_checks.go @@ -0,0 +1,218 @@ +package tapdb + +import ( + "context" + "database/sql" + "fmt" + "time" + + "github.com/btcsuite/btcd/btcec/v2/schnorr" + "github.com/golang-migrate/migrate/v4" + "github.com/golang-migrate/migrate/v4/database" + "github.com/lightninglabs/taproot-assets/asset" + "github.com/lightninglabs/taproot-assets/fn" + "github.com/lightninglabs/taproot-assets/tapdb/sqlc" + "github.com/lightninglabs/taproot-assets/tapscript" + "github.com/lightningnetwork/lnd/clock" +) + +const ( + // Migration33ScriptKeyType is the version of the migration that + // introduces the script key type. + Migration33ScriptKeyType = 33 +) + +// postMigrationCheck is a function type for a function that performs a +// post-migration check on the database. +type postMigrationCheck func(context.Context, sqlc.Querier) error + +var ( + // postMigrationChecks is a map of functions that are run after the + // database migration with the version specified in the key has been + // applied. These functions are used to perform additional checks on the + // database state that are not fully expressible in SQL. + postMigrationChecks = map[uint]postMigrationCheck{ + Migration33ScriptKeyType: determineAndAssignScriptKeyType, + } +) + +// makePostStepCallbacks turns the post migration checks into a map of post +// step callbacks that can be used with the migrate package. The keys of the map +// are the migration versions, and the values are the callbacks that will be +// executed after the migration with the corresponding version is applied. +func makePostStepCallbacks(db DatabaseBackend, + checks map[uint]postMigrationCheck) map[uint]migrate.PostStepCallback { + + var ( + ctx = context.Background() + txDb = NewTransactionExecutor( + db, func(tx *sql.Tx) sqlc.Querier { + return db.WithTx(tx) + }, + ) + writeTxOpts AssetStoreTxOptions + ) + + postStepCallbacks := make(map[uint]migrate.PostStepCallback) + for version, check := range checks { + runCheck := func(m *migrate.Migration, q sqlc.Querier) error { + log.Infof("Running post-migration check for version %d", + version) + start := time.Now() + + err := check(ctx, q) + if err != nil { + return fmt.Errorf("post-migration "+ + "check failed for version %d: "+ + "%w", version, err) + } + + log.Infof("Post-migration check for version %d "+ + "completed in %v", version, time.Since(start)) + + return nil + } + + // We ignore the actual driver that's being returned here, since + // we use migrate.NewWithInstance() to create the migration + // instance from our already instantiated database backend that + // is also passed into this function. + postStepCallbacks[version] = func(m *migrate.Migration, + _ database.Driver) error { + + return txDb.ExecTx( + ctx, &writeTxOpts, func(q sqlc.Querier) error { + return runCheck(m, q) + }, + ) + } + } + + return postStepCallbacks +} + +// determineAndAssignScriptKeyType attempts to detect the type of the script +// keys that don't have a type set yet. +func determineAndAssignScriptKeyType(ctx context.Context, + q sqlc.Querier) error { + + defaultClock := clock.NewDefaultClock() + + log.Debugf("Detecting script key types") + + // We start by fetching all assets, even the spent ones. We then collect + // a list of the burn keys from the assets (because burn keys can only + // be calculated from the asset's witness). + assetFilter := QueryAssetFilters{ + Now: sql.NullTime{ + Time: defaultClock.Now().UTC(), + Valid: true, + }, + } + dbAssets, assetWitnesses, err := fetchAssetsWithWitness( + ctx, q, assetFilter, + ) + if err != nil { + return fmt.Errorf("error fetching assets: %w", err) + } + + chainAssets, err := dbAssetsToChainAssets( + dbAssets, assetWitnesses, defaultClock, + ) + if err != nil { + return fmt.Errorf("error converting assets: %w", err) + } + + burnAssets := fn.Filter(chainAssets, func(a *asset.ChainAsset) bool { + return a.IsBurn() + }) + burnKeys := make(map[asset.SerializedKey]struct{}) + for _, a := range burnAssets { + serializedKey := asset.ToSerialized(a.ScriptKey.PubKey) + burnKeys[serializedKey] = struct{}{} + } + + untypedKeys, err := q.FetchUnknownTypeScriptKeys(ctx) + if err != nil { + return fmt.Errorf("error fetching script keys: %w", err) + } + + channelFundingKey := asset.NewScriptKey( + tapscript.NewChannelFundingScriptTree().TaprootKey, + ).PubKey + + for _, k := range untypedKeys { + scriptKey, err := parseScriptKey(k.InternalKey, k.ScriptKey) + if err != nil { + return fmt.Errorf("error parsing script key: %w", err) + } + + // We ignore the parity bit when comparing it to other keys, as + // we generally don't know how it might be stored in the DB. + schnorrScriptKey, _ := schnorr.ParsePubKey( + schnorr.SerializePubKey(scriptKey.PubKey), + ) + + serializedKey := asset.ToSerialized(scriptKey.PubKey) + newType := asset.ScriptKeyUnknown + + if _, ok := burnKeys[serializedKey]; ok { + newType = asset.ScriptKeyBurn + } else { + assumedType := scriptKey.DetermineType() + + switch { + // If we're sure that a key is BIP-86 or the well-known + // NUMS (tombstone) key, we mark it as such. + case assumedType == asset.ScriptKeyBip86 || + assumedType == asset.ScriptKeyTombstone: + + newType = assumedType + + // Previous channel funding script keys (OP_TRUE) can + // be detected, since they are the same key. New, unique + // script keys for grouped asset channels are only + // introduced with the same version as this migration + // ships in, so they should be stored with the correct + // type already. + case assumedType == asset.ScriptKeyScriptPathExternal && + schnorrScriptKey.IsEqual(channelFundingKey): + + newType = asset.ScriptKeyScriptPathChannel + + // We'll want to not show scripted keys by default in + // the balances. So any key that is not a burn key and + // not a channel funding key, but has a script path, we + // mark as external script path. + case assumedType == asset.ScriptKeyScriptPathExternal: + newType = asset.ScriptKeyScriptPathExternal + } + } + + // If we weren't able to identify the key type, we can't do much + // more than log it. We won't update the key type, since + // "unknown" is already the default value. + if newType == asset.ScriptKeyUnknown { + log.Warnf("Unable to determine script key type for "+ + "key %x, internal key %x", serializedKey[:], + scriptKey.RawKey.PubKey.SerializeCompressed()) + + continue + } + + // If we were able to identify the key type, we update the key + // in the database. + _, err = q.UpsertScriptKey(ctx, NewScriptKey{ + InternalKeyID: k.InternalKey.KeyID, + TweakedScriptKey: k.ScriptKey.TweakedScriptKey, + Tweak: k.ScriptKey.Tweak, + KeyType: sqlInt16(newType), + }) + if err != nil { + return fmt.Errorf("error updating script key type: %w", + err) + } + } + + return nil +} diff --git a/tapdb/postgres.go b/tapdb/postgres.go index 12f91ad8fe..a069a9cbc0 100644 --- a/tapdb/postgres.go +++ b/tapdb/postgres.go @@ -131,7 +131,12 @@ func NewPostgresStore(cfg *PostgresConfig) (*PostgresStore, error) { // Now that the database is open, populate the database with our set of // schemas based on our embedded in-memory file system. if !cfg.SkipMigrations { - if err := s.ExecuteMigrations(TargetLatest); err != nil { + err := s.ExecuteMigrations( + TargetLatest, WithPostStepCallbacks( + makePostStepCallbacks(s, postMigrationChecks), + ), + ) + if err != nil { return nil, fmt.Errorf("error executing migrations: "+ "%w", err) } diff --git a/tapdb/sqlc/addrs.sql.go b/tapdb/sqlc/addrs.sql.go index bb595af291..1580332863 100644 --- a/tapdb/sqlc/addrs.sql.go +++ b/tapdb/sqlc/addrs.sql.go @@ -16,12 +16,8 @@ SELECT version, asset_version, genesis_asset_id, group_key, tapscript_sibling, taproot_output_key, amount, asset_type, creation_time, managed_from, proof_courier_addr, - script_keys.tweaked_script_key, - script_keys.tweak AS script_key_tweak, - script_keys.declared_known AS script_key_declared_known, - raw_script_keys.raw_key as raw_script_key, - raw_script_keys.key_family AS script_key_family, - raw_script_keys.key_index AS script_key_index, + script_keys.script_key_id, script_keys.internal_key_id, script_keys.tweaked_script_key, script_keys.tweak, script_keys.key_type, + raw_script_keys.key_id, raw_script_keys.raw_key, raw_script_keys.key_family, raw_script_keys.key_index, taproot_keys.raw_key AS raw_taproot_key, taproot_keys.key_family AS taproot_key_family, taproot_keys.key_index AS taproot_key_index @@ -36,26 +32,22 @@ WHERE taproot_output_key = $1 ` type FetchAddrByTaprootOutputKeyRow struct { - Version int16 - AssetVersion int16 - GenesisAssetID int64 - GroupKey []byte - TapscriptSibling []byte - TaprootOutputKey []byte - Amount int64 - AssetType int16 - CreationTime time.Time - ManagedFrom sql.NullTime - ProofCourierAddr []byte - TweakedScriptKey []byte - ScriptKeyTweak []byte - ScriptKeyDeclaredKnown sql.NullBool - RawScriptKey []byte - ScriptKeyFamily int32 - ScriptKeyIndex int32 - RawTaprootKey []byte - TaprootKeyFamily int32 - TaprootKeyIndex int32 + Version int16 + AssetVersion int16 + GenesisAssetID int64 + GroupKey []byte + TapscriptSibling []byte + TaprootOutputKey []byte + Amount int64 + AssetType int16 + CreationTime time.Time + ManagedFrom sql.NullTime + ProofCourierAddr []byte + ScriptKey ScriptKey + InternalKey InternalKey + RawTaprootKey []byte + TaprootKeyFamily int32 + TaprootKeyIndex int32 } func (q *Queries) FetchAddrByTaprootOutputKey(ctx context.Context, taprootOutputKey []byte) (FetchAddrByTaprootOutputKeyRow, error) { @@ -73,12 +65,15 @@ func (q *Queries) FetchAddrByTaprootOutputKey(ctx context.Context, taprootOutput &i.CreationTime, &i.ManagedFrom, &i.ProofCourierAddr, - &i.TweakedScriptKey, - &i.ScriptKeyTweak, - &i.ScriptKeyDeclaredKnown, - &i.RawScriptKey, - &i.ScriptKeyFamily, - &i.ScriptKeyIndex, + &i.ScriptKey.ScriptKeyID, + &i.ScriptKey.InternalKeyID, + &i.ScriptKey.TweakedScriptKey, + &i.ScriptKey.Tweak, + &i.ScriptKey.KeyType, + &i.InternalKey.KeyID, + &i.InternalKey.RawKey, + &i.InternalKey.KeyFamily, + &i.InternalKey.KeyIndex, &i.RawTaprootKey, &i.TaprootKeyFamily, &i.TaprootKeyIndex, @@ -207,12 +202,8 @@ SELECT version, asset_version, genesis_asset_id, group_key, tapscript_sibling, taproot_output_key, amount, asset_type, creation_time, managed_from, proof_courier_addr, - script_keys.tweaked_script_key, - script_keys.tweak AS script_key_tweak, - script_keys.declared_known AS script_key_declared_known, - raw_script_keys.raw_key AS raw_script_key, - raw_script_keys.key_family AS script_key_family, - raw_script_keys.key_index AS script_key_index, + script_keys.script_key_id, script_keys.internal_key_id, script_keys.tweaked_script_key, script_keys.tweak, script_keys.key_type, + raw_script_keys.key_id, raw_script_keys.raw_key, raw_script_keys.key_family, raw_script_keys.key_index, taproot_keys.raw_key AS raw_taproot_key, taproot_keys.key_family AS taproot_key_family, taproot_keys.key_index AS taproot_key_index @@ -240,26 +231,22 @@ type FetchAddrsParams struct { } type FetchAddrsRow struct { - Version int16 - AssetVersion int16 - GenesisAssetID int64 - GroupKey []byte - TapscriptSibling []byte - TaprootOutputKey []byte - Amount int64 - AssetType int16 - CreationTime time.Time - ManagedFrom sql.NullTime - ProofCourierAddr []byte - TweakedScriptKey []byte - ScriptKeyTweak []byte - ScriptKeyDeclaredKnown sql.NullBool - RawScriptKey []byte - ScriptKeyFamily int32 - ScriptKeyIndex int32 - RawTaprootKey []byte - TaprootKeyFamily int32 - TaprootKeyIndex int32 + Version int16 + AssetVersion int16 + GenesisAssetID int64 + GroupKey []byte + TapscriptSibling []byte + TaprootOutputKey []byte + Amount int64 + AssetType int16 + CreationTime time.Time + ManagedFrom sql.NullTime + ProofCourierAddr []byte + ScriptKey ScriptKey + InternalKey InternalKey + RawTaprootKey []byte + TaprootKeyFamily int32 + TaprootKeyIndex int32 } func (q *Queries) FetchAddrs(ctx context.Context, arg FetchAddrsParams) ([]FetchAddrsRow, error) { @@ -289,12 +276,15 @@ func (q *Queries) FetchAddrs(ctx context.Context, arg FetchAddrsParams) ([]Fetch &i.CreationTime, &i.ManagedFrom, &i.ProofCourierAddr, - &i.TweakedScriptKey, - &i.ScriptKeyTweak, - &i.ScriptKeyDeclaredKnown, - &i.RawScriptKey, - &i.ScriptKeyFamily, - &i.ScriptKeyIndex, + &i.ScriptKey.ScriptKeyID, + &i.ScriptKey.InternalKeyID, + &i.ScriptKey.TweakedScriptKey, + &i.ScriptKey.Tweak, + &i.ScriptKey.KeyType, + &i.InternalKey.KeyID, + &i.InternalKey.RawKey, + &i.InternalKey.KeyFamily, + &i.InternalKey.KeyIndex, &i.RawTaprootKey, &i.TaprootKeyFamily, &i.TaprootKeyIndex, diff --git a/tapdb/sqlc/assets.sql.go b/tapdb/sqlc/assets.sql.go index cc6a6cd84b..4fd0e0fe40 100644 --- a/tapdb/sqlc/assets.sql.go +++ b/tapdb/sqlc/assets.sql.go @@ -972,11 +972,9 @@ WITH genesis_info AS ( WHERE wit.gen_asset_id IN (SELECT gen_asset_id FROM genesis_info) ) SELECT - version, script_keys.tweak, script_keys.tweaked_script_key, - script_keys.declared_known AS script_key_declared_known, - internal_keys.raw_key AS script_key_raw, - internal_keys.key_family AS script_key_fam, - internal_keys.key_index AS script_key_index, + version, + script_keys.script_key_id, script_keys.internal_key_id, script_keys.tweaked_script_key, script_keys.tweak, script_keys.key_type, + internal_keys.key_id, internal_keys.raw_key, internal_keys.key_family, internal_keys.key_index, key_group_info.tapscript_root, key_group_info.witness_stack, key_group_info.tweaked_group_key, @@ -1002,30 +1000,26 @@ JOIN internal_keys ` type FetchAssetsForBatchRow struct { - Version int32 - Tweak []byte - TweakedScriptKey []byte - ScriptKeyDeclaredKnown sql.NullBool - ScriptKeyRaw []byte - ScriptKeyFam int32 - ScriptKeyIndex int32 - TapscriptRoot []byte - WitnessStack []byte - TweakedGroupKey []byte - GroupKeyRaw []byte - GroupKeyFamily sql.NullInt32 - GroupKeyIndex sql.NullInt32 - ScriptVersion int32 - Amount int64 - LockTime sql.NullInt32 - RelativeLockTime sql.NullInt32 - Spent bool - AssetID []byte - AssetTag string - AssetsMetum AssetsMetum - GenesisOutputIndex int32 - AssetType int16 - GenesisPrevOut []byte + Version int32 + ScriptKey ScriptKey + InternalKey InternalKey + TapscriptRoot []byte + WitnessStack []byte + TweakedGroupKey []byte + GroupKeyRaw []byte + GroupKeyFamily sql.NullInt32 + GroupKeyIndex sql.NullInt32 + ScriptVersion int32 + Amount int64 + LockTime sql.NullInt32 + RelativeLockTime sql.NullInt32 + Spent bool + AssetID []byte + AssetTag string + AssetsMetum AssetsMetum + GenesisOutputIndex int32 + AssetType int16 + GenesisPrevOut []byte } // We use a LEFT JOIN here as not every asset has a meta data entry. @@ -1044,12 +1038,15 @@ func (q *Queries) FetchAssetsForBatch(ctx context.Context, rawKey []byte) ([]Fet var i FetchAssetsForBatchRow if err := rows.Scan( &i.Version, - &i.Tweak, - &i.TweakedScriptKey, - &i.ScriptKeyDeclaredKnown, - &i.ScriptKeyRaw, - &i.ScriptKeyFam, - &i.ScriptKeyIndex, + &i.ScriptKey.ScriptKeyID, + &i.ScriptKey.InternalKeyID, + &i.ScriptKey.TweakedScriptKey, + &i.ScriptKey.Tweak, + &i.ScriptKey.KeyType, + &i.InternalKey.KeyID, + &i.InternalKey.RawKey, + &i.InternalKey.KeyFamily, + &i.InternalKey.KeyIndex, &i.TapscriptRoot, &i.WitnessStack, &i.TweakedGroupKey, @@ -1673,7 +1670,7 @@ func (q *Queries) FetchMintingBatchesByInverseState(ctx context.Context, batchSt } const FetchScriptKeyByTweakedKey = `-- name: FetchScriptKeyByTweakedKey :one -SELECT tweak, raw_key, key_family, key_index, declared_known +SELECT script_keys.script_key_id, script_keys.internal_key_id, script_keys.tweaked_script_key, script_keys.tweak, script_keys.key_type, internal_keys.key_id, internal_keys.raw_key, internal_keys.key_family, internal_keys.key_index FROM script_keys JOIN internal_keys ON script_keys.internal_key_id = internal_keys.key_id @@ -1681,22 +1678,23 @@ WHERE script_keys.tweaked_script_key = $1 ` type FetchScriptKeyByTweakedKeyRow struct { - Tweak []byte - RawKey []byte - KeyFamily int32 - KeyIndex int32 - DeclaredKnown sql.NullBool + ScriptKey ScriptKey + InternalKey InternalKey } func (q *Queries) FetchScriptKeyByTweakedKey(ctx context.Context, tweakedScriptKey []byte) (FetchScriptKeyByTweakedKeyRow, error) { row := q.db.QueryRowContext(ctx, FetchScriptKeyByTweakedKey, tweakedScriptKey) var i FetchScriptKeyByTweakedKeyRow err := row.Scan( - &i.Tweak, - &i.RawKey, - &i.KeyFamily, - &i.KeyIndex, - &i.DeclaredKnown, + &i.ScriptKey.ScriptKeyID, + &i.ScriptKey.InternalKeyID, + &i.ScriptKey.TweakedScriptKey, + &i.ScriptKey.Tweak, + &i.ScriptKey.KeyType, + &i.InternalKey.KeyID, + &i.InternalKey.RawKey, + &i.InternalKey.KeyFamily, + &i.InternalKey.KeyIndex, ) return i, err } @@ -1783,9 +1781,12 @@ SELECT seedling_id, asset_name, asset_type, asset_version, asset_supply, assets_meta.meta_id, assets_meta.meta_data_hash, assets_meta.meta_data_blob, assets_meta.meta_data_type, assets_meta.meta_decimal_display, assets_meta.meta_universe_commitments, assets_meta.meta_canonical_universes, assets_meta.meta_delegation_key, emission_enabled, batch_id, group_genesis_id, group_anchor_id, group_tapscript_root, + -- TODO(guggero): We should use sqlc.embed() for the script key and internal + -- key fields, but we can't because it's a LEFT JOIN. We should check if the + -- LEFT JOIN is actually necessary or if we always have keys for seedlings. script_keys.tweak AS script_key_tweak, script_keys.tweaked_script_key, - script_keys.declared_known AS script_key_declared_known, + script_keys.key_type AS script_key_type, internal_keys.raw_key AS script_key_raw, internal_keys.key_family AS script_key_fam, internal_keys.key_index AS script_key_index, @@ -1805,26 +1806,26 @@ WHERE asset_seedlings.batch_id in (SELECT batch_id FROM target_batch) ` type FetchSeedlingsForBatchRow struct { - SeedlingID int64 - AssetName string - AssetType int16 - AssetVersion int16 - AssetSupply int64 - AssetsMetum AssetsMetum - EmissionEnabled bool - BatchID int64 - GroupGenesisID sql.NullInt64 - GroupAnchorID sql.NullInt64 - GroupTapscriptRoot []byte - ScriptKeyTweak []byte - TweakedScriptKey []byte - ScriptKeyDeclaredKnown sql.NullBool - ScriptKeyRaw []byte - ScriptKeyFam sql.NullInt32 - ScriptKeyIndex sql.NullInt32 - GroupKeyRaw []byte - GroupKeyFam sql.NullInt32 - GroupKeyIndex sql.NullInt32 + SeedlingID int64 + AssetName string + AssetType int16 + AssetVersion int16 + AssetSupply int64 + AssetsMetum AssetsMetum + EmissionEnabled bool + BatchID int64 + GroupGenesisID sql.NullInt64 + GroupAnchorID sql.NullInt64 + GroupTapscriptRoot []byte + ScriptKeyTweak []byte + TweakedScriptKey []byte + ScriptKeyType sql.NullInt16 + ScriptKeyRaw []byte + ScriptKeyFam sql.NullInt32 + ScriptKeyIndex sql.NullInt32 + GroupKeyRaw []byte + GroupKeyFam sql.NullInt32 + GroupKeyIndex sql.NullInt32 } func (q *Queries) FetchSeedlingsForBatch(ctx context.Context, rawKey []byte) ([]FetchSeedlingsForBatchRow, error) { @@ -1857,7 +1858,7 @@ func (q *Queries) FetchSeedlingsForBatch(ctx context.Context, rawKey []byte) ([] &i.GroupTapscriptRoot, &i.ScriptKeyTweak, &i.TweakedScriptKey, - &i.ScriptKeyDeclaredKnown, + &i.ScriptKeyType, &i.ScriptKeyRaw, &i.ScriptKeyFam, &i.ScriptKeyIndex, @@ -1926,6 +1927,52 @@ func (q *Queries) FetchTapscriptTree(ctx context.Context, rootHash []byte) ([]Fe return items, nil } +const FetchUnknownTypeScriptKeys = `-- name: FetchUnknownTypeScriptKeys :many +SELECT script_keys.script_key_id, script_keys.internal_key_id, script_keys.tweaked_script_key, script_keys.tweak, script_keys.key_type, internal_keys.key_id, internal_keys.raw_key, internal_keys.key_family, internal_keys.key_index +FROM script_keys +JOIN internal_keys + ON script_keys.internal_key_id = internal_keys.key_id +WHERE script_keys.key_type IS NULL +` + +type FetchUnknownTypeScriptKeysRow struct { + ScriptKey ScriptKey + InternalKey InternalKey +} + +func (q *Queries) FetchUnknownTypeScriptKeys(ctx context.Context) ([]FetchUnknownTypeScriptKeysRow, error) { + rows, err := q.db.QueryContext(ctx, FetchUnknownTypeScriptKeys) + if err != nil { + return nil, err + } + defer rows.Close() + var items []FetchUnknownTypeScriptKeysRow + for rows.Next() { + var i FetchUnknownTypeScriptKeysRow + if err := rows.Scan( + &i.ScriptKey.ScriptKeyID, + &i.ScriptKey.InternalKeyID, + &i.ScriptKey.TweakedScriptKey, + &i.ScriptKey.Tweak, + &i.ScriptKey.KeyType, + &i.InternalKey.KeyID, + &i.InternalKey.RawKey, + &i.InternalKey.KeyFamily, + &i.InternalKey.KeyIndex, + ); err != nil { + return nil, err + } + items = append(items, i) + } + if err := rows.Close(); err != nil { + return nil, err + } + if err := rows.Err(); err != nil { + return nil, err + } + return items, nil +} + const GenesisAssets = `-- name: GenesisAssets :many SELECT gen_asset_id, asset_id, asset_tag, meta_data_id, output_index, asset_type, genesis_point_id FROM genesis_assets @@ -2160,8 +2207,10 @@ JOIN managed_utxos utxos JOIN script_keys ON assets.script_key_id = script_keys.script_key_id WHERE spent = FALSE AND - (script_keys.tweaked_script_key != $4 OR - $4 IS NULL) + (script_keys.key_type != $4 OR + $4 IS NULL) AND + ($5 = script_keys.key_type OR + $5 IS NULL) GROUP BY assets.genesis_id, genesis_info_view.asset_id, genesis_info_view.asset_tag, genesis_info_view.meta_hash, genesis_info_view.asset_type, genesis_info_view.output_index, @@ -2169,10 +2218,11 @@ GROUP BY assets.genesis_id, genesis_info_view.asset_id, ` type QueryAssetBalancesByAssetParams struct { - AssetIDFilter []byte - Leased interface{} - Now sql.NullTime - ExcludeKey []byte + AssetIDFilter []byte + Leased interface{} + Now sql.NullTime + ExcludeScriptKeyType sql.NullInt16 + ScriptKeyType sql.NullInt16 } type QueryAssetBalancesByAssetRow struct { @@ -2194,7 +2244,8 @@ func (q *Queries) QueryAssetBalancesByAsset(ctx context.Context, arg QueryAssetB arg.AssetIDFilter, arg.Leased, arg.Now, - arg.ExcludeKey, + arg.ExcludeScriptKeyType, + arg.ScriptKeyType, ) if err != nil { return nil, err @@ -2246,17 +2297,20 @@ JOIN managed_utxos utxos END JOIN script_keys ON assets.script_key_id = script_keys.script_key_id -WHERE spent = FALSE AND - (script_keys.tweaked_script_key != $4 OR - $4 IS NULL) +WHERE spent = FALSE AND + (script_keys.key_type != $4 OR + $4 IS NULL) AND + ($5 = script_keys.key_type OR + $5 IS NULL) GROUP BY key_group_info_view.tweaked_group_key ` type QueryAssetBalancesByGroupParams struct { - KeyGroupFilter []byte - Leased interface{} - Now sql.NullTime - ExcludeKey []byte + KeyGroupFilter []byte + Leased interface{} + Now sql.NullTime + ExcludeScriptKeyType sql.NullInt16 + ScriptKeyType sql.NullInt16 } type QueryAssetBalancesByGroupRow struct { @@ -2269,7 +2323,8 @@ func (q *Queries) QueryAssetBalancesByGroup(ctx context.Context, arg QueryAssetB arg.KeyGroupFilter, arg.Leased, arg.Now, - arg.ExcludeKey, + arg.ExcludeScriptKeyType, + arg.ScriptKeyType, ) if err != nil { return nil, err @@ -2296,12 +2351,8 @@ const QueryAssets = `-- name: QueryAssets :many SELECT assets.asset_id AS asset_primary_key, assets.genesis_id, assets.version, spent, - script_keys.tweak AS script_key_tweak, - script_keys.tweaked_script_key, - script_keys.declared_known AS script_key_declared_known, - internal_keys.raw_key AS script_key_raw, - internal_keys.key_family AS script_key_fam, - internal_keys.key_index AS script_key_index, + script_keys.script_key_id, script_keys.internal_key_id, script_keys.tweaked_script_key, script_keys.tweak, script_keys.key_type, + internal_keys.key_id, internal_keys.raw_key, internal_keys.key_family, internal_keys.key_index, key_group_info_view.tapscript_root, key_group_info_view.witness_stack, key_group_info_view.tweaked_group_key, @@ -2368,29 +2419,26 @@ WHERE ( assets.anchor_utxo_id = COALESCE($11, assets.anchor_utxo_id) AND assets.genesis_id = COALESCE($12, assets.genesis_id) AND assets.script_key_id = COALESCE($13, assets.script_key_id) AND - COALESCE(length(script_keys.tweak), 0) = (CASE - WHEN cast($14 as bool) = TRUE - THEN 0 - ELSE COALESCE(length(script_keys.tweak), 0) - END) + ($14 = script_keys.key_type OR + $14 IS NULL) ) ` type QueryAssetsParams struct { - AssetIDFilter []byte - TweakedScriptKey []byte - AnchorPoint []byte - Leased interface{} - Now sql.NullTime - MinAnchorHeight sql.NullInt32 - MinAmt sql.NullInt64 - MaxAmt sql.NullInt64 - Spent sql.NullBool - KeyGroupFilter []byte - AnchorUtxoID sql.NullInt64 - GenesisID sql.NullInt64 - ScriptKeyID sql.NullInt64 - Bip86ScriptKeysOnly bool + AssetIDFilter []byte + TweakedScriptKey []byte + AnchorPoint []byte + Leased interface{} + Now sql.NullTime + MinAnchorHeight sql.NullInt32 + MinAmt sql.NullInt64 + MaxAmt sql.NullInt64 + Spent sql.NullBool + KeyGroupFilter []byte + AnchorUtxoID sql.NullInt64 + GenesisID sql.NullInt64 + ScriptKeyID sql.NullInt64 + ScriptKeyType sql.NullInt16 } type QueryAssetsRow struct { @@ -2398,12 +2446,8 @@ type QueryAssetsRow struct { GenesisID int64 Version int32 Spent bool - ScriptKeyTweak []byte - TweakedScriptKey []byte - ScriptKeyDeclaredKnown sql.NullBool - ScriptKeyRaw []byte - ScriptKeyFam int32 - ScriptKeyIndex int32 + ScriptKey ScriptKey + InternalKey InternalKey TapscriptRoot []byte WitnessStack []byte TweakedGroupKey []byte @@ -2459,7 +2503,7 @@ func (q *Queries) QueryAssets(ctx context.Context, arg QueryAssetsParams) ([]Que arg.AnchorUtxoID, arg.GenesisID, arg.ScriptKeyID, - arg.Bip86ScriptKeysOnly, + arg.ScriptKeyType, ) if err != nil { return nil, err @@ -2473,12 +2517,15 @@ func (q *Queries) QueryAssets(ctx context.Context, arg QueryAssetsParams) ([]Que &i.GenesisID, &i.Version, &i.Spent, - &i.ScriptKeyTweak, - &i.TweakedScriptKey, - &i.ScriptKeyDeclaredKnown, - &i.ScriptKeyRaw, - &i.ScriptKeyFam, - &i.ScriptKeyIndex, + &i.ScriptKey.ScriptKeyID, + &i.ScriptKey.InternalKeyID, + &i.ScriptKey.TweakedScriptKey, + &i.ScriptKey.Tweak, + &i.ScriptKey.KeyType, + &i.InternalKey.KeyID, + &i.InternalKey.RawKey, + &i.InternalKey.KeyFamily, + &i.InternalKey.KeyIndex, &i.TapscriptRoot, &i.WitnessStack, &i.TweakedGroupKey, @@ -3034,27 +3081,29 @@ func (q *Queries) UpsertMintAnchorUniCommitment(ctx context.Context, arg UpsertM const UpsertScriptKey = `-- name: UpsertScriptKey :one INSERT INTO script_keys ( - internal_key_id, tweaked_script_key, tweak, declared_known + internal_key_id, tweaked_script_key, tweak, key_type ) VALUES ( $1, $2, $3, $4 ) ON CONFLICT (tweaked_script_key) - -- Overwrite the declared_known and tweak fields if they were previously - -- unknown. + -- Overwrite the declared_known, key_type and tweak fields if they were + -- previously unknown. DO UPDATE SET tweaked_script_key = EXCLUDED.tweaked_script_key, - -- If the script key was previously unknown, we'll update to the new - -- value. - declared_known = CASE - WHEN script_keys.declared_known IS NULL OR script_keys.declared_known = FALSE - THEN COALESCE(EXCLUDED.declared_known, script_keys.declared_known) - ELSE script_keys.declared_known - END, -- If the tweak was previously unknown, we'll update to the new value. - tweak = CASE - WHEN script_keys.tweak IS NULL - THEN COALESCE(EXCLUDED.tweak, script_keys.tweak) - ELSE script_keys.tweak - END + tweak = + CASE + WHEN script_keys.tweak IS NULL + THEN COALESCE(EXCLUDED.tweak, script_keys.tweak) + ELSE script_keys.tweak + END, + -- We only overwrite the key type with a value that does not mean + -- "unknown" (0 or NULL). + key_type = + CASE + WHEN COALESCE(EXCLUDED.key_type, 0) != 0 + THEN EXCLUDED.key_type + ELSE script_keys.key_type + END RETURNING script_key_id ` @@ -3062,7 +3111,7 @@ type UpsertScriptKeyParams struct { InternalKeyID int64 TweakedScriptKey []byte Tweak []byte - DeclaredKnown sql.NullBool + KeyType sql.NullInt16 } func (q *Queries) UpsertScriptKey(ctx context.Context, arg UpsertScriptKeyParams) (int64, error) { @@ -3070,7 +3119,7 @@ func (q *Queries) UpsertScriptKey(ctx context.Context, arg UpsertScriptKeyParams arg.InternalKeyID, arg.TweakedScriptKey, arg.Tweak, - arg.DeclaredKnown, + arg.KeyType, ) var script_key_id int64 err := row.Scan(&script_key_id) diff --git a/tapdb/sqlc/migrations/000033_script_key_type.down.sql b/tapdb/sqlc/migrations/000033_script_key_type.down.sql new file mode 100644 index 0000000000..1414c9cada --- /dev/null +++ b/tapdb/sqlc/migrations/000033_script_key_type.down.sql @@ -0,0 +1 @@ +ALTER TABLE script_keys DROP COLUMN key_type; diff --git a/tapdb/sqlc/migrations/000033_script_key_type.up.sql b/tapdb/sqlc/migrations/000033_script_key_type.up.sql new file mode 100644 index 0000000000..18171fd274 --- /dev/null +++ b/tapdb/sqlc/migrations/000033_script_key_type.up.sql @@ -0,0 +1,8 @@ +-- The key_type column is used to store the type of key that is stored in the +-- script_keys table. The type is a Golang numeric type that will have values +-- such as BIP-0086, script path with custom (externally defined) script, script +-- path with Taproot Asset Channel related script, etc. The NULL value +-- will mean the type is not known. Existing script keys will be inspected by +-- the post-migration step Golang code that determines the type of each script +-- key. +ALTER TABLE script_keys ADD COLUMN key_type SMALLINT; diff --git a/tapdb/sqlc/migrations/000034_script_key_drop_declared_known.down.sql b/tapdb/sqlc/migrations/000034_script_key_drop_declared_known.down.sql new file mode 100644 index 0000000000..e4ac3c55d7 --- /dev/null +++ b/tapdb/sqlc/migrations/000034_script_key_drop_declared_known.down.sql @@ -0,0 +1,2 @@ +ALTER TABLE script_keys ADD COLUMN declared_known BOOLEAN; + diff --git a/tapdb/sqlc/migrations/000034_script_key_drop_declared_known.up.sql b/tapdb/sqlc/migrations/000034_script_key_drop_declared_known.up.sql new file mode 100644 index 0000000000..75b750825d --- /dev/null +++ b/tapdb/sqlc/migrations/000034_script_key_drop_declared_known.up.sql @@ -0,0 +1,3 @@ +-- The declared_known flag was just a workaround. Now that we have an actual +-- type, we don't need this flag anymore. +ALTER TABLE script_keys DROP COLUMN declared_known; diff --git a/tapdb/sqlc/models.go b/tapdb/sqlc/models.go index d75129bdf8..8f8ff9da30 100644 --- a/tapdb/sqlc/models.go +++ b/tapdb/sqlc/models.go @@ -343,7 +343,7 @@ type ScriptKey struct { InternalKeyID int64 TweakedScriptKey []byte Tweak []byte - DeclaredKnown sql.NullBool + KeyType sql.NullInt16 } type TapscriptEdge struct { diff --git a/tapdb/sqlc/querier.go b/tapdb/sqlc/querier.go index 621acae6e5..374a4b27aa 100644 --- a/tapdb/sqlc/querier.go +++ b/tapdb/sqlc/querier.go @@ -94,6 +94,7 @@ type Querier interface { FetchTransferOutputs(ctx context.Context, transferID int64) ([]FetchTransferOutputsRow, error) FetchUniverseKeys(ctx context.Context, arg FetchUniverseKeysParams) ([]FetchUniverseKeysRow, error) FetchUniverseRoot(ctx context.Context, namespace string) (FetchUniverseRootRow, error) + FetchUnknownTypeScriptKeys(ctx context.Context) ([]FetchUnknownTypeScriptKeysRow, error) GenesisAssets(ctx context.Context) ([]GenesisAsset, error) GenesisPoints(ctx context.Context) ([]GenesisPoint, error) GetRootKey(ctx context.Context, id []byte) (Macaroon, error) diff --git a/tapdb/sqlc/queries/addrs.sql b/tapdb/sqlc/queries/addrs.sql index ece4b3cbb6..a7764347a6 100644 --- a/tapdb/sqlc/queries/addrs.sql +++ b/tapdb/sqlc/queries/addrs.sql @@ -10,12 +10,8 @@ SELECT version, asset_version, genesis_asset_id, group_key, tapscript_sibling, taproot_output_key, amount, asset_type, creation_time, managed_from, proof_courier_addr, - script_keys.tweaked_script_key, - script_keys.tweak AS script_key_tweak, - script_keys.declared_known AS script_key_declared_known, - raw_script_keys.raw_key AS raw_script_key, - raw_script_keys.key_family AS script_key_family, - raw_script_keys.key_index AS script_key_index, + sqlc.embed(script_keys), + sqlc.embed(raw_script_keys), taproot_keys.raw_key AS raw_taproot_key, taproot_keys.key_family AS taproot_key_family, taproot_keys.key_index AS taproot_key_index @@ -38,12 +34,8 @@ SELECT version, asset_version, genesis_asset_id, group_key, tapscript_sibling, taproot_output_key, amount, asset_type, creation_time, managed_from, proof_courier_addr, - script_keys.tweaked_script_key, - script_keys.tweak AS script_key_tweak, - script_keys.declared_known AS script_key_declared_known, - raw_script_keys.raw_key as raw_script_key, - raw_script_keys.key_family AS script_key_family, - raw_script_keys.key_index AS script_key_index, + sqlc.embed(script_keys), + sqlc.embed(raw_script_keys), taproot_keys.raw_key AS raw_taproot_key, taproot_keys.key_family AS taproot_key_family, taproot_keys.key_index AS taproot_key_index diff --git a/tapdb/sqlc/queries/assets.sql b/tapdb/sqlc/queries/assets.sql index 9ed18b79ed..b2104dd6aa 100644 --- a/tapdb/sqlc/queries/assets.sql +++ b/tapdb/sqlc/queries/assets.sql @@ -135,9 +135,12 @@ SELECT seedling_id, asset_name, asset_type, asset_version, asset_supply, sqlc.embed(assets_meta), emission_enabled, batch_id, group_genesis_id, group_anchor_id, group_tapscript_root, + -- TODO(guggero): We should use sqlc.embed() for the script key and internal + -- key fields, but we can't because it's a LEFT JOIN. We should check if the + -- LEFT JOIN is actually necessary or if we always have keys for seedlings. script_keys.tweak AS script_key_tweak, script_keys.tweaked_script_key, - script_keys.declared_known AS script_key_declared_known, + script_keys.key_type AS script_key_type, internal_keys.raw_key AS script_key_raw, internal_keys.key_family AS script_key_fam, internal_keys.key_index AS script_key_index, @@ -254,11 +257,9 @@ WITH genesis_info AS ( WHERE wit.gen_asset_id IN (SELECT gen_asset_id FROM genesis_info) ) SELECT - version, script_keys.tweak, script_keys.tweaked_script_key, - script_keys.declared_known AS script_key_declared_known, - internal_keys.raw_key AS script_key_raw, - internal_keys.key_family AS script_key_fam, - internal_keys.key_index AS script_key_index, + version, + sqlc.embed(script_keys), + sqlc.embed(internal_keys), key_group_info.tapscript_root, key_group_info.witness_stack, key_group_info.tweaked_group_key, @@ -338,8 +339,10 @@ JOIN managed_utxos utxos JOIN script_keys ON assets.script_key_id = script_keys.script_key_id WHERE spent = FALSE AND - (script_keys.tweaked_script_key != sqlc.narg('exclude_key') OR - sqlc.narg('exclude_key') IS NULL) + (script_keys.key_type != sqlc.narg('exclude_script_key_type') OR + sqlc.narg('exclude_script_key_type') IS NULL) AND + (sqlc.narg('script_key_type') = script_keys.key_type OR + sqlc.narg('script_key_type') IS NULL) GROUP BY assets.genesis_id, genesis_info_view.asset_id, genesis_info_view.asset_tag, genesis_info_view.meta_hash, genesis_info_view.asset_type, genesis_info_view.output_index, @@ -366,9 +369,11 @@ JOIN managed_utxos utxos END JOIN script_keys ON assets.script_key_id = script_keys.script_key_id -WHERE spent = FALSE AND - (script_keys.tweaked_script_key != sqlc.narg('exclude_key') OR - sqlc.narg('exclude_key') IS NULL) +WHERE spent = FALSE AND + (script_keys.key_type != sqlc.narg('exclude_script_key_type') OR + sqlc.narg('exclude_script_key_type') IS NULL) AND + (sqlc.narg('script_key_type') = script_keys.key_type OR + sqlc.narg('script_key_type') IS NULL) GROUP BY key_group_info_view.tweaked_group_key; -- name: FetchGroupedAssets :many @@ -425,12 +430,8 @@ WHERE ( SELECT assets.asset_id AS asset_primary_key, assets.genesis_id, assets.version, spent, - script_keys.tweak AS script_key_tweak, - script_keys.tweaked_script_key, - script_keys.declared_known AS script_key_declared_known, - internal_keys.raw_key AS script_key_raw, - internal_keys.key_family AS script_key_fam, - internal_keys.key_index AS script_key_index, + sqlc.embed(script_keys), + sqlc.embed(internal_keys), key_group_info_view.tapscript_root, key_group_info_view.witness_stack, key_group_info_view.tweaked_group_key, @@ -505,11 +506,8 @@ WHERE ( assets.anchor_utxo_id = COALESCE(sqlc.narg('anchor_utxo_id'), assets.anchor_utxo_id) AND assets.genesis_id = COALESCE(sqlc.narg('genesis_id'), assets.genesis_id) AND assets.script_key_id = COALESCE(sqlc.narg('script_key_id'), assets.script_key_id) AND - COALESCE(length(script_keys.tweak), 0) = (CASE - WHEN cast(@bip86_script_keys_only as bool) = TRUE - THEN 0 - ELSE COALESCE(length(script_keys.tweak), 0) - END) + (sqlc.narg('script_key_type') = script_keys.key_type OR + sqlc.narg('script_key_type') IS NULL) ); -- name: AllAssets :many @@ -867,27 +865,29 @@ WHERE txid = $1; -- name: UpsertScriptKey :one INSERT INTO script_keys ( - internal_key_id, tweaked_script_key, tweak, declared_known + internal_key_id, tweaked_script_key, tweak, key_type ) VALUES ( $1, $2, $3, $4 ) ON CONFLICT (tweaked_script_key) - -- Overwrite the declared_known and tweak fields if they were previously - -- unknown. + -- Overwrite the declared_known, key_type and tweak fields if they were + -- previously unknown. DO UPDATE SET tweaked_script_key = EXCLUDED.tweaked_script_key, - -- If the script key was previously unknown, we'll update to the new - -- value. - declared_known = CASE - WHEN script_keys.declared_known IS NULL OR script_keys.declared_known = FALSE - THEN COALESCE(EXCLUDED.declared_known, script_keys.declared_known) - ELSE script_keys.declared_known - END, -- If the tweak was previously unknown, we'll update to the new value. - tweak = CASE - WHEN script_keys.tweak IS NULL - THEN COALESCE(EXCLUDED.tweak, script_keys.tweak) - ELSE script_keys.tweak - END + tweak = + CASE + WHEN script_keys.tweak IS NULL + THEN COALESCE(EXCLUDED.tweak, script_keys.tweak) + ELSE script_keys.tweak + END, + -- We only overwrite the key type with a value that does not mean + -- "unknown" (0 or NULL). + key_type = + CASE + WHEN COALESCE(EXCLUDED.key_type, 0) != 0 + THEN EXCLUDED.key_type + ELSE script_keys.key_type + END RETURNING script_key_id; -- name: FetchScriptKeyIDByTweakedKey :one @@ -896,12 +896,19 @@ FROM script_keys WHERE tweaked_script_key = $1; -- name: FetchScriptKeyByTweakedKey :one -SELECT tweak, raw_key, key_family, key_index, declared_known +SELECT sqlc.embed(script_keys), sqlc.embed(internal_keys) FROM script_keys JOIN internal_keys ON script_keys.internal_key_id = internal_keys.key_id WHERE script_keys.tweaked_script_key = $1; +-- name: FetchUnknownTypeScriptKeys :many +SELECT sqlc.embed(script_keys), sqlc.embed(internal_keys) +FROM script_keys +JOIN internal_keys + ON script_keys.internal_key_id = internal_keys.key_id +WHERE script_keys.key_type IS NULL; + -- name: FetchInternalKeyLocator :one SELECT key_family, key_index FROM internal_keys diff --git a/tapdb/sqlc/queries/transfers.sql b/tapdb/sqlc/queries/transfers.sql index dc3651c482..a6b75d4fa7 100644 --- a/tapdb/sqlc/queries/transfers.sql +++ b/tapdb/sqlc/queries/transfers.sql @@ -91,13 +91,8 @@ SELECT utxo_internal_keys.raw_key AS internal_key_raw_key_bytes, utxo_internal_keys.key_family AS internal_key_family, utxo_internal_keys.key_index AS internal_key_index, - script_keys.tweaked_script_key AS script_key_bytes, - script_keys.tweak AS script_key_tweak, - script_keys.declared_known AS script_key_declared_known, - script_key AS script_key_id, - script_internal_keys.raw_key AS script_key_raw_key_bytes, - script_internal_keys.key_family AS script_key_family, - script_internal_keys.key_index AS script_key_index + sqlc.embed(script_keys), + sqlc.embed(script_internal_keys) FROM asset_transfer_outputs outputs JOIN managed_utxos utxos ON outputs.anchor_utxo = utxos.utxo_id diff --git a/tapdb/sqlc/schemas/generated_schema.sql b/tapdb/sqlc/schemas/generated_schema.sql index 2130d3c8e8..0cf935a3fc 100644 --- a/tapdb/sqlc/schemas/generated_schema.sql +++ b/tapdb/sqlc/schemas/generated_schema.sql @@ -716,7 +716,7 @@ CREATE TABLE script_keys ( -- An optional tweak for the script_key. If NULL, the raw_key may be -- tweaked BIP-0086 style. tweak BLOB -, declared_known BOOLEAN); +, key_type SMALLINT); CREATE INDEX status_idx ON addr_events(status); diff --git a/tapdb/sqlc/transfers.sql.go b/tapdb/sqlc/transfers.sql.go index 0485eefc56..5acef971df 100644 --- a/tapdb/sqlc/transfers.sql.go +++ b/tapdb/sqlc/transfers.sql.go @@ -137,13 +137,8 @@ SELECT utxo_internal_keys.raw_key AS internal_key_raw_key_bytes, utxo_internal_keys.key_family AS internal_key_family, utxo_internal_keys.key_index AS internal_key_index, - script_keys.tweaked_script_key AS script_key_bytes, - script_keys.tweak AS script_key_tweak, - script_keys.declared_known AS script_key_declared_known, - script_key AS script_key_id, - script_internal_keys.raw_key AS script_key_raw_key_bytes, - script_internal_keys.key_family AS script_key_family, - script_internal_keys.key_index AS script_key_index + script_keys.script_key_id, script_keys.internal_key_id, script_keys.tweaked_script_key, script_keys.tweak, script_keys.key_type, + script_internal_keys.key_id, script_internal_keys.raw_key, script_internal_keys.key_family, script_internal_keys.key_index FROM asset_transfer_outputs outputs JOIN managed_utxos utxos ON outputs.anchor_utxo = utxos.utxo_id @@ -183,13 +178,8 @@ type FetchTransferOutputsRow struct { InternalKeyRawKeyBytes []byte InternalKeyFamily int32 InternalKeyIndex int32 - ScriptKeyBytes []byte - ScriptKeyTweak []byte - ScriptKeyDeclaredKnown sql.NullBool - ScriptKeyID int64 - ScriptKeyRawKeyBytes []byte - ScriptKeyFamily int32 - ScriptKeyIndex int32 + ScriptKey ScriptKey + InternalKey InternalKey } func (q *Queries) FetchTransferOutputs(ctx context.Context, transferID int64) ([]FetchTransferOutputsRow, error) { @@ -227,13 +217,15 @@ func (q *Queries) FetchTransferOutputs(ctx context.Context, transferID int64) ([ &i.InternalKeyRawKeyBytes, &i.InternalKeyFamily, &i.InternalKeyIndex, - &i.ScriptKeyBytes, - &i.ScriptKeyTweak, - &i.ScriptKeyDeclaredKnown, - &i.ScriptKeyID, - &i.ScriptKeyRawKeyBytes, - &i.ScriptKeyFamily, - &i.ScriptKeyIndex, + &i.ScriptKey.ScriptKeyID, + &i.ScriptKey.InternalKeyID, + &i.ScriptKey.TweakedScriptKey, + &i.ScriptKey.Tweak, + &i.ScriptKey.KeyType, + &i.InternalKey.KeyID, + &i.InternalKey.RawKey, + &i.InternalKey.KeyFamily, + &i.InternalKey.KeyIndex, ); err != nil { return nil, err } diff --git a/tapdb/sqlite.go b/tapdb/sqlite.go index 9e3cb4ed86..b5ac730ccf 100644 --- a/tapdb/sqlite.go +++ b/tapdb/sqlite.go @@ -144,7 +144,12 @@ func NewSqliteStore(cfg *SqliteConfig) (*SqliteStore, error) { // Now that the database is open, populate the database with our set of // schemas based on our embedded in-memory file system. if !cfg.SkipMigrations { - if err := s.ExecuteMigrations(s.backupAndMigrate); err != nil { + err := s.ExecuteMigrations( + s.backupAndMigrate, WithPostStepCallbacks( + makePostStepCallbacks(s, postMigrationChecks), + ), + ) + if err != nil { return nil, fmt.Errorf("error executing migrations: "+ "%w", err) } @@ -297,7 +302,11 @@ func NewTestSqliteDBWithVersion(t *testing.T, version uint) *SqliteStore { }) require.NoError(t, err) - err = sqlDB.ExecuteMigrations(TargetVersion(version)) + err = sqlDB.ExecuteMigrations( + TargetVersion(version), WithPostStepCallbacks( + makePostStepCallbacks(sqlDB, postMigrationChecks), + ), + ) require.NoError(t, err) t.Cleanup(func() { diff --git a/tapdb/testdata/migrations_test_00033_dummy_data.sql b/tapdb/testdata/migrations_test_00033_dummy_data.sql new file mode 100644 index 0000000000..dae50eedca --- /dev/null +++ b/tapdb/testdata/migrations_test_00033_dummy_data.sql @@ -0,0 +1,32 @@ +-- Just a random internal key. +INSERT INTO internal_keys VALUES(1,X'03efbcf2878876bae81ca9a7f6476764d2da38d565b9fb2b691e7bb22fd99f9e5e',212,2); + +-- The NUMS key as an internal key. +INSERT INTO internal_keys VALUES(2, X'02dca094751109d0bd055d03565874e8276dd53e926b44e3bd1bb6bf4bc130a279', 212, 0); + +-- This is a correct BIP-86 key. +INSERT INTO script_keys VALUES(1,1,X'029c571fffcac1a1a7cd3372bd202ad8562f28e48b90f8a4eb714eca062f576ee6',NULL,true); + +-- This is not a correct BIP-86 key, it should be detected as unknown. +INSERT INTO script_keys VALUES(2,1,X'039c571fffcac1a1a7cd3372bd202ad8562f28e48b90f8a4eb714eca062f576ee6',NULL,true); + +-- This should be detected as script path key. +INSERT INTO script_keys VALUES(3,1,X'03f9cdf1ff7c9fbb0ea3c8533cd7048994f41ea20a79764469c22aa18aa6696169',X'b2f0cd8ecb23c1710903f872c31b0fd37e15224af457722a87c5e0c7f50fffb3',true); + +-- This should be detected as the NUMS/tombstone key. +INSERT INTO script_keys VALUES(4,1,X'027c79b9b26e463895eef5679d8558942c86c4ad2233adef01bc3e6d540b3653fe',NULL,true); + +-- This should be detected as a channel key. +INSERT INTO script_keys VALUES(5,2,X'0350aaeb166f4234650d84a2d8a130987aeaf6950206e0905401ee74ff3f8d18e6',X'a85b2107f791b26a84e7586c28cec7cb61202ed3d01944d832500f363782d675',true); + + +-- Testdata for a burn asset. +INSERT INTO chain_txns VALUES(1,X'a1594fc379308b2a209f6d0bdb8602e9f87cf71fc232c69032b9a5fed28f9331',1980,X'02000000000101022cd51ca4d850c5f71ceedf7c50a08ff82d66612b22f631eac95e6b52cbbd2d0000000000ffffffff02e80300000000000022512018ac5a65a0d12e7846c89d24705e2697b1da14627978ba8db24bdbce21fc2aa85cd5f5050000000022512030263d67b4275144b2b00921d220a1311b9a4465fa656ba7d5754b421cb4308402483045022100fa32af97cab8a765dc347c3ff57b14f9810b6dbfc4d02727fb099d1ed875660602204cb66f3bbd92925707158b4aa67338c50a9ffddceb023875eb82b78b3967e007012102eb9cd2a22fd11c40823cb7b0f0fba4156138af69cf73c0644be54f4d46ba480700000000',441,X'4295613d85ccbc455159eb4ddd1e266ca10041d3c75726286b7dfeb3132c9c4f',1); +INSERT INTO managed_utxos VALUES(1,X'a1594fc379308b2a209f6d0bdb8602e9f87cf71fc232c69032b9a5fed28f933100000000',1000,1,X'1dd3e2cf0bbbee32832c4deb57bbae58779fa599be0b8eb1f61e8c624157e2fa',NULL,X'1dd3e2cf0bbbee32832c4deb57bbae58779fa599be0b8eb1f61e8c624157e2fa',1,NULL,NULL,0); +INSERT INTO genesis_points VALUES(1,X'49b23992e063da8aac64d9c92035603636d0deb241b64978030b46642137052566b83958',NULL); +INSERT INTO genesis_assets VALUES(1,X'f28be4e6247a7630019ea8aa5e68397202407fd398196656add582d8b8569ca8','86d9ea529153575487671558c93e54682ca300fd68a9794735f774929c33a267',NULL,-699369396,0,1); +INSERT INTO internal_keys VALUES(3,X'02843663d232db2559213ec7aa7538fdbbf5161fc080b1c108f6a6ada5cd2ee602',0,0); +INSERT INTO internal_keys VALUES(4,X'02248bca7dbb12dcf0b490263a1d521691691aa2541842b7472c83acac0e88443b',0,0); +INSERT INTO script_keys VALUES(6,4,X'02248bca7dbb12dcf0b490263a1d521691691aa2541842b7472c83acac0e88443b',NULL,NULL); +INSERT INTO assets VALUES(1,1,1,6,NULL,0,1782902116,0,0,NULL,NULL,1,false); +INSERT INTO asset_witnesses VALUES(1,1,X'49b23992e063da8aac64d9c92035603636d0deb241b64978030b46642137052566b83958',X'f28be4e6247a7630019ea8aa5e68397202407fd398196656add582d8b8569ca8',X'0201b56f6f7a1f3c5d3443504659849a2ae0bb375549c182c5c2352a7ef36c05c0',NULL,NULL,0); diff --git a/tapfreighter/chain_porter.go b/tapfreighter/chain_porter.go index 37c183dd8c..d04c1f2a1c 100644 --- a/tapfreighter/chain_porter.go +++ b/tapfreighter/chain_porter.go @@ -1239,7 +1239,8 @@ func (p *ChainPorter) stateStep(currentPkg sendPackage) (*sendPackage, error) { "address parcel") } fundSendRes, err := p.cfg.AssetWallet.FundAddressSend( - ctx, tapsend.Bip86Only, nil, addrParcel.destAddrs..., + ctx, fn.Some(asset.ScriptKeyBip86), nil, + addrParcel.destAddrs..., ) if err != nil { return nil, fmt.Errorf("unable to fund address send: "+ @@ -1723,6 +1724,46 @@ func (p *ChainPorter) publishSubscriberEvent(event fn.Event) { } } +// detectUnSpendableKeys checks if the script key in the virtual output is a +// burn or tombstone key and sets the appropriate type on the output script key. +func detectUnSpendableKeys(vOut *tappsbt.VOutput) { + setScriptKeyType := func(vOut *tappsbt.VOutput, + scriptKeyType asset.ScriptKeyType) { + + if vOut.Asset.ScriptKey.TweakedScriptKey == nil { + vOut.Asset.ScriptKey.TweakedScriptKey = new( + asset.TweakedScriptKey, + ) + vOut.Asset.ScriptKey.RawKey.PubKey = + vOut.Asset.ScriptKey.PubKey + } + if vOut.ScriptKey.TweakedScriptKey == nil { + vOut.ScriptKey.TweakedScriptKey = new( + asset.TweakedScriptKey, + ) + vOut.ScriptKey.RawKey.PubKey = vOut.ScriptKey.PubKey + } + + vOut.Asset.ScriptKey.Type = scriptKeyType + vOut.ScriptKey.Type = scriptKeyType + } + + if vOut.Asset == nil { + return + } + + witness := vOut.Asset.PrevWitnesses + scriptKey := vOut.ScriptKey + if len(witness) > 0 && asset.IsBurnKey(scriptKey.PubKey, witness[0]) { + setScriptKeyType(vOut, asset.ScriptKeyBurn) + } + + unSpendable, _ := scriptKey.IsUnSpendable() + if unSpendable { + setScriptKeyType(vOut, asset.ScriptKeyTombstone) + } +} + // A compile-time assertion to make sure ChainPorter satisfies the // fn.EventPublisher interface. var _ fn.EventPublisher[fn.Event, bool] = (*ChainPorter)(nil) diff --git a/tapfreighter/coin_select.go b/tapfreighter/coin_select.go index 7906ee2429..0a1c23de94 100644 --- a/tapfreighter/coin_select.go +++ b/tapfreighter/coin_select.go @@ -54,7 +54,7 @@ func (s *CoinSelect) SelectCoins(ctx context.Context, listConstraints := CommitmentConstraints{ AssetSpecifier: constraints.AssetSpecifier, MinAmt: 1, - CoinSelectType: constraints.CoinSelectType, + ScriptKeyType: constraints.ScriptKeyType, PrevIDs: constraints.PrevIDs, DistinctSpecifier: constraints.DistinctSpecifier, } diff --git a/tapfreighter/interface.go b/tapfreighter/interface.go index 7a64499f83..e7721f4226 100644 --- a/tapfreighter/interface.go +++ b/tapfreighter/interface.go @@ -21,7 +21,6 @@ import ( "github.com/lightninglabs/taproot-assets/tapgarden" "github.com/lightninglabs/taproot-assets/tappsbt" "github.com/lightninglabs/taproot-assets/tapscript" - "github.com/lightninglabs/taproot-assets/tapsend" "github.com/lightningnetwork/lnd/keychain" ) @@ -52,14 +51,15 @@ type CommitmentConstraints struct { // PrevIDs are the set of inputs allowed to be used. PrevIDs []asset.PrevID - // CoinSelectType is the type of coins that should be selected. - CoinSelectType tapsend.CoinSelectType - // DistinctSpecifier indicates whether we _only_ look at either the // group key _or_ the asset ID but not both. That means, if the group // key is set, we ignore the asset ID and allow multiple inputs of the // same group to be selected. DistinctSpecifier bool + + // ScriptKeyType is the type of script key the assets are expected to + // have. If this is fn.None, then any script key type is allowed. + ScriptKeyType fn.Option[asset.ScriptKeyType] } // AssetBurn holds data related to a burn of an asset. diff --git a/tapfreighter/parcel.go b/tapfreighter/parcel.go index c7bed6333a..3c30f1dd7b 100644 --- a/tapfreighter/parcel.go +++ b/tapfreighter/parcel.go @@ -589,6 +589,13 @@ func ConvertToTransfer(currentHeight uint32, activeTransfers []*tappsbt.VPacket, vPkt := activeTransfers[pIdx] for vPktOutputIdx := range vPkt.Outputs { + // Burn and tombstone keys are the only keys that we + // don't explicitly store in the DB before this point. + // But we'll want them to have the correct type when + // creating the transfer, as they'll be inserted into + // the DB, assigned to this transfer. + detectUnSpendableKeys(vPkt.Outputs[vPktOutputIdx]) + tOut, err := transferOutput( vPkt, vPktOutputIdx, outputPosition, anchorTx, passiveAssets, isLocalKey, diff --git a/tapfreighter/wallet.go b/tapfreighter/wallet.go index e58102a55f..2436054b09 100644 --- a/tapfreighter/wallet.go +++ b/tapfreighter/wallet.go @@ -69,7 +69,8 @@ type Wallet interface { // asset re-anchors and the Taproot Asset level commitment of the // selected assets. FundAddressSend(ctx context.Context, - coinSelectType tapsend.CoinSelectType, prevIDs []asset.PrevID, + scriptKeyType fn.Option[asset.ScriptKeyType], + prevIDs []asset.PrevID, receiverAddrs ...*address.Tap) (*FundedVPacket, error) // FundPacket funds a virtual transaction, selecting assets to spend @@ -240,8 +241,7 @@ type FundedVPacket struct { // // NOTE: This is part of the Wallet interface. func (f *AssetWallet) FundAddressSend(ctx context.Context, - coinSelectType tapsend.CoinSelectType, - prevIDs []asset.PrevID, + scriptKeyType fn.Option[asset.ScriptKeyType], prevIDs []asset.PrevID, receiverAddrs ...*address.Tap) (*FundedVPacket, error) { // We start by creating a new virtual transaction that will be used to @@ -264,7 +264,7 @@ func (f *AssetWallet) FundAddressSend(ctx context.Context, fundDesc.PrevIDs = prevIDs } - fundDesc.CoinSelectType = coinSelectType + fundDesc.ScriptKeyType = scriptKeyType fundedVPkt, err := f.FundPacket(ctx, fundDesc, vPkt) if err != nil { return nil, err @@ -413,7 +413,7 @@ func (f *AssetWallet) FundPacket(ctx context.Context, constraints := CommitmentConstraints{ AssetSpecifier: fundDesc.AssetSpecifier, MinAmt: fundDesc.Amount, - CoinSelectType: fundDesc.CoinSelectType, + ScriptKeyType: fundDesc.ScriptKeyType, PrevIDs: fundDesc.PrevIDs, DistinctSpecifier: fundDesc.DistinctSpecifier, } diff --git a/taprpc/assetwalletrpc/assetwallet.pb.go b/taprpc/assetwalletrpc/assetwallet.pb.go index 5d8612900a..9946107770 100644 --- a/taprpc/assetwalletrpc/assetwallet.pb.go +++ b/taprpc/assetwalletrpc/assetwallet.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.33.0 +// protoc-gen-go v1.34.2 // protoc v3.21.12 // source: assetwalletrpc/assetwallet.proto @@ -2068,7 +2068,7 @@ func file_assetwalletrpc_assetwallet_proto_rawDescGZIP() []byte { var file_assetwalletrpc_assetwallet_proto_enumTypes = make([]protoimpl.EnumInfo, 1) var file_assetwalletrpc_assetwallet_proto_msgTypes = make([]protoimpl.MessageInfo, 27) -var file_assetwalletrpc_assetwallet_proto_goTypes = []interface{}{ +var file_assetwalletrpc_assetwallet_proto_goTypes = []any{ (CoinSelectType)(0), // 0: assetwalletrpc.CoinSelectType (*FundVirtualPsbtRequest)(nil), // 1: assetwalletrpc.FundVirtualPsbtRequest (*FundVirtualPsbtResponse)(nil), // 2: assetwalletrpc.FundVirtualPsbtResponse @@ -2158,7 +2158,7 @@ func file_assetwalletrpc_assetwallet_proto_init() { return } if !protoimpl.UnsafeEnabled { - file_assetwalletrpc_assetwallet_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + file_assetwalletrpc_assetwallet_proto_msgTypes[0].Exporter = func(v any, i int) any { switch v := v.(*FundVirtualPsbtRequest); i { case 0: return &v.state @@ -2170,7 +2170,7 @@ func file_assetwalletrpc_assetwallet_proto_init() { return nil } } - file_assetwalletrpc_assetwallet_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + file_assetwalletrpc_assetwallet_proto_msgTypes[1].Exporter = func(v any, i int) any { switch v := v.(*FundVirtualPsbtResponse); i { case 0: return &v.state @@ -2182,7 +2182,7 @@ func file_assetwalletrpc_assetwallet_proto_init() { return nil } } - file_assetwalletrpc_assetwallet_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + file_assetwalletrpc_assetwallet_proto_msgTypes[2].Exporter = func(v any, i int) any { switch v := v.(*TxTemplate); i { case 0: return &v.state @@ -2194,7 +2194,7 @@ func file_assetwalletrpc_assetwallet_proto_init() { return nil } } - file_assetwalletrpc_assetwallet_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + file_assetwalletrpc_assetwallet_proto_msgTypes[3].Exporter = func(v any, i int) any { switch v := v.(*PrevId); i { case 0: return &v.state @@ -2206,7 +2206,7 @@ func file_assetwalletrpc_assetwallet_proto_init() { return nil } } - file_assetwalletrpc_assetwallet_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + file_assetwalletrpc_assetwallet_proto_msgTypes[4].Exporter = func(v any, i int) any { switch v := v.(*SignVirtualPsbtRequest); i { case 0: return &v.state @@ -2218,7 +2218,7 @@ func file_assetwalletrpc_assetwallet_proto_init() { return nil } } - file_assetwalletrpc_assetwallet_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + file_assetwalletrpc_assetwallet_proto_msgTypes[5].Exporter = func(v any, i int) any { switch v := v.(*SignVirtualPsbtResponse); i { case 0: return &v.state @@ -2230,7 +2230,7 @@ func file_assetwalletrpc_assetwallet_proto_init() { return nil } } - file_assetwalletrpc_assetwallet_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { + file_assetwalletrpc_assetwallet_proto_msgTypes[6].Exporter = func(v any, i int) any { switch v := v.(*AnchorVirtualPsbtsRequest); i { case 0: return &v.state @@ -2242,7 +2242,7 @@ func file_assetwalletrpc_assetwallet_proto_init() { return nil } } - file_assetwalletrpc_assetwallet_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { + file_assetwalletrpc_assetwallet_proto_msgTypes[7].Exporter = func(v any, i int) any { switch v := v.(*CommitVirtualPsbtsRequest); i { case 0: return &v.state @@ -2254,7 +2254,7 @@ func file_assetwalletrpc_assetwallet_proto_init() { return nil } } - file_assetwalletrpc_assetwallet_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { + file_assetwalletrpc_assetwallet_proto_msgTypes[8].Exporter = func(v any, i int) any { switch v := v.(*CommitVirtualPsbtsResponse); i { case 0: return &v.state @@ -2266,7 +2266,7 @@ func file_assetwalletrpc_assetwallet_proto_init() { return nil } } - file_assetwalletrpc_assetwallet_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { + file_assetwalletrpc_assetwallet_proto_msgTypes[9].Exporter = func(v any, i int) any { switch v := v.(*PublishAndLogRequest); i { case 0: return &v.state @@ -2278,7 +2278,7 @@ func file_assetwalletrpc_assetwallet_proto_init() { return nil } } - file_assetwalletrpc_assetwallet_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { + file_assetwalletrpc_assetwallet_proto_msgTypes[10].Exporter = func(v any, i int) any { switch v := v.(*NextInternalKeyRequest); i { case 0: return &v.state @@ -2290,7 +2290,7 @@ func file_assetwalletrpc_assetwallet_proto_init() { return nil } } - file_assetwalletrpc_assetwallet_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { + file_assetwalletrpc_assetwallet_proto_msgTypes[11].Exporter = func(v any, i int) any { switch v := v.(*NextInternalKeyResponse); i { case 0: return &v.state @@ -2302,7 +2302,7 @@ func file_assetwalletrpc_assetwallet_proto_init() { return nil } } - file_assetwalletrpc_assetwallet_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { + file_assetwalletrpc_assetwallet_proto_msgTypes[12].Exporter = func(v any, i int) any { switch v := v.(*NextScriptKeyRequest); i { case 0: return &v.state @@ -2314,7 +2314,7 @@ func file_assetwalletrpc_assetwallet_proto_init() { return nil } } - file_assetwalletrpc_assetwallet_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { + file_assetwalletrpc_assetwallet_proto_msgTypes[13].Exporter = func(v any, i int) any { switch v := v.(*NextScriptKeyResponse); i { case 0: return &v.state @@ -2326,7 +2326,7 @@ func file_assetwalletrpc_assetwallet_proto_init() { return nil } } - file_assetwalletrpc_assetwallet_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { + file_assetwalletrpc_assetwallet_proto_msgTypes[14].Exporter = func(v any, i int) any { switch v := v.(*QueryInternalKeyRequest); i { case 0: return &v.state @@ -2338,7 +2338,7 @@ func file_assetwalletrpc_assetwallet_proto_init() { return nil } } - file_assetwalletrpc_assetwallet_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { + file_assetwalletrpc_assetwallet_proto_msgTypes[15].Exporter = func(v any, i int) any { switch v := v.(*QueryInternalKeyResponse); i { case 0: return &v.state @@ -2350,7 +2350,7 @@ func file_assetwalletrpc_assetwallet_proto_init() { return nil } } - file_assetwalletrpc_assetwallet_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { + file_assetwalletrpc_assetwallet_proto_msgTypes[16].Exporter = func(v any, i int) any { switch v := v.(*QueryScriptKeyRequest); i { case 0: return &v.state @@ -2362,7 +2362,7 @@ func file_assetwalletrpc_assetwallet_proto_init() { return nil } } - file_assetwalletrpc_assetwallet_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { + file_assetwalletrpc_assetwallet_proto_msgTypes[17].Exporter = func(v any, i int) any { switch v := v.(*QueryScriptKeyResponse); i { case 0: return &v.state @@ -2374,7 +2374,7 @@ func file_assetwalletrpc_assetwallet_proto_init() { return nil } } - file_assetwalletrpc_assetwallet_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { + file_assetwalletrpc_assetwallet_proto_msgTypes[18].Exporter = func(v any, i int) any { switch v := v.(*ProveAssetOwnershipRequest); i { case 0: return &v.state @@ -2386,7 +2386,7 @@ func file_assetwalletrpc_assetwallet_proto_init() { return nil } } - file_assetwalletrpc_assetwallet_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { + file_assetwalletrpc_assetwallet_proto_msgTypes[19].Exporter = func(v any, i int) any { switch v := v.(*ProveAssetOwnershipResponse); i { case 0: return &v.state @@ -2398,7 +2398,7 @@ func file_assetwalletrpc_assetwallet_proto_init() { return nil } } - file_assetwalletrpc_assetwallet_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { + file_assetwalletrpc_assetwallet_proto_msgTypes[20].Exporter = func(v any, i int) any { switch v := v.(*VerifyAssetOwnershipRequest); i { case 0: return &v.state @@ -2410,7 +2410,7 @@ func file_assetwalletrpc_assetwallet_proto_init() { return nil } } - file_assetwalletrpc_assetwallet_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { + file_assetwalletrpc_assetwallet_proto_msgTypes[21].Exporter = func(v any, i int) any { switch v := v.(*VerifyAssetOwnershipResponse); i { case 0: return &v.state @@ -2422,7 +2422,7 @@ func file_assetwalletrpc_assetwallet_proto_init() { return nil } } - file_assetwalletrpc_assetwallet_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { + file_assetwalletrpc_assetwallet_proto_msgTypes[22].Exporter = func(v any, i int) any { switch v := v.(*RemoveUTXOLeaseRequest); i { case 0: return &v.state @@ -2434,7 +2434,7 @@ func file_assetwalletrpc_assetwallet_proto_init() { return nil } } - file_assetwalletrpc_assetwallet_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { + file_assetwalletrpc_assetwallet_proto_msgTypes[23].Exporter = func(v any, i int) any { switch v := v.(*RemoveUTXOLeaseResponse); i { case 0: return &v.state @@ -2446,7 +2446,7 @@ func file_assetwalletrpc_assetwallet_proto_init() { return nil } } - file_assetwalletrpc_assetwallet_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { + file_assetwalletrpc_assetwallet_proto_msgTypes[24].Exporter = func(v any, i int) any { switch v := v.(*DeclareScriptKeyRequest); i { case 0: return &v.state @@ -2458,7 +2458,7 @@ func file_assetwalletrpc_assetwallet_proto_init() { return nil } } - file_assetwalletrpc_assetwallet_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { + file_assetwalletrpc_assetwallet_proto_msgTypes[25].Exporter = func(v any, i int) any { switch v := v.(*DeclareScriptKeyResponse); i { case 0: return &v.state @@ -2471,11 +2471,11 @@ func file_assetwalletrpc_assetwallet_proto_init() { } } } - file_assetwalletrpc_assetwallet_proto_msgTypes[0].OneofWrappers = []interface{}{ + file_assetwalletrpc_assetwallet_proto_msgTypes[0].OneofWrappers = []any{ (*FundVirtualPsbtRequest_Psbt)(nil), (*FundVirtualPsbtRequest_Raw)(nil), } - file_assetwalletrpc_assetwallet_proto_msgTypes[7].OneofWrappers = []interface{}{ + file_assetwalletrpc_assetwallet_proto_msgTypes[7].OneofWrappers = []any{ (*CommitVirtualPsbtsRequest_ExistingOutputIndex)(nil), (*CommitVirtualPsbtsRequest_Add)(nil), (*CommitVirtualPsbtsRequest_TargetConf)(nil), diff --git a/taprpc/assetwalletrpc/assetwallet.pb.gw.go b/taprpc/assetwalletrpc/assetwallet.pb.gw.go index ddf85ea42e..9f3ce07222 100644 --- a/taprpc/assetwalletrpc/assetwallet.pb.gw.go +++ b/taprpc/assetwalletrpc/assetwallet.pb.gw.go @@ -35,11 +35,7 @@ func request_AssetWallet_FundVirtualPsbt_0(ctx context.Context, marshaler runtim var protoReq FundVirtualPsbtRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -52,11 +48,7 @@ func local_request_AssetWallet_FundVirtualPsbt_0(ctx context.Context, marshaler var protoReq FundVirtualPsbtRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -69,11 +61,7 @@ func request_AssetWallet_SignVirtualPsbt_0(ctx context.Context, marshaler runtim var protoReq SignVirtualPsbtRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -86,11 +74,7 @@ func local_request_AssetWallet_SignVirtualPsbt_0(ctx context.Context, marshaler var protoReq SignVirtualPsbtRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -103,11 +87,7 @@ func request_AssetWallet_AnchorVirtualPsbts_0(ctx context.Context, marshaler run var protoReq AnchorVirtualPsbtsRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -120,11 +100,7 @@ func local_request_AssetWallet_AnchorVirtualPsbts_0(ctx context.Context, marshal var protoReq AnchorVirtualPsbtsRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -137,11 +113,7 @@ func request_AssetWallet_CommitVirtualPsbts_0(ctx context.Context, marshaler run var protoReq CommitVirtualPsbtsRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -154,11 +126,7 @@ func local_request_AssetWallet_CommitVirtualPsbts_0(ctx context.Context, marshal var protoReq CommitVirtualPsbtsRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -171,11 +139,7 @@ func request_AssetWallet_PublishAndLogTransfer_0(ctx context.Context, marshaler var protoReq PublishAndLogRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -188,11 +152,7 @@ func local_request_AssetWallet_PublishAndLogTransfer_0(ctx context.Context, mars var protoReq PublishAndLogRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -205,11 +165,7 @@ func request_AssetWallet_NextInternalKey_0(ctx context.Context, marshaler runtim var protoReq NextInternalKeyRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -222,11 +178,7 @@ func local_request_AssetWallet_NextInternalKey_0(ctx context.Context, marshaler var protoReq NextInternalKeyRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -239,11 +191,7 @@ func request_AssetWallet_NextScriptKey_0(ctx context.Context, marshaler runtime. var protoReq NextScriptKeyRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -256,11 +204,7 @@ func local_request_AssetWallet_NextScriptKey_0(ctx context.Context, marshaler ru var protoReq NextScriptKeyRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -377,11 +321,7 @@ func request_AssetWallet_ProveAssetOwnership_0(ctx context.Context, marshaler ru var protoReq ProveAssetOwnershipRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -394,11 +334,7 @@ func local_request_AssetWallet_ProveAssetOwnership_0(ctx context.Context, marsha var protoReq ProveAssetOwnershipRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -411,11 +347,7 @@ func request_AssetWallet_VerifyAssetOwnership_0(ctx context.Context, marshaler r var protoReq VerifyAssetOwnershipRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -428,11 +360,7 @@ func local_request_AssetWallet_VerifyAssetOwnership_0(ctx context.Context, marsh var protoReq VerifyAssetOwnershipRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -445,11 +373,7 @@ func request_AssetWallet_RemoveUTXOLease_0(ctx context.Context, marshaler runtim var protoReq RemoveUTXOLeaseRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -462,11 +386,7 @@ func local_request_AssetWallet_RemoveUTXOLease_0(ctx context.Context, marshaler var protoReq RemoveUTXOLeaseRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -479,11 +399,7 @@ func request_AssetWallet_DeclareScriptKey_0(ctx context.Context, marshaler runti var protoReq DeclareScriptKeyRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -496,11 +412,7 @@ func local_request_AssetWallet_DeclareScriptKey_0(ctx context.Context, marshaler var protoReq DeclareScriptKeyRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -846,21 +758,21 @@ func RegisterAssetWalletHandlerServer(ctx context.Context, mux *runtime.ServeMux // RegisterAssetWalletHandlerFromEndpoint is same as RegisterAssetWalletHandler but // automatically dials to "endpoint" and closes the connection when "ctx" gets done. func RegisterAssetWalletHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) { - conn, err := grpc.DialContext(ctx, endpoint, opts...) + conn, err := grpc.NewClient(endpoint, opts...) if err != nil { return err } defer func() { if err != nil { if cerr := conn.Close(); cerr != nil { - grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr) + grpclog.Errorf("Failed to close conn to %s: %v", endpoint, cerr) } return } go func() { <-ctx.Done() if cerr := conn.Close(); cerr != nil { - grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr) + grpclog.Errorf("Failed to close conn to %s: %v", endpoint, cerr) } }() }() diff --git a/taprpc/assetwalletrpc/assetwallet.swagger.json b/taprpc/assetwalletrpc/assetwallet.swagger.json index abe2ec2701..07e935bfef 100644 --- a/taprpc/assetwalletrpc/assetwallet.swagger.json +++ b/taprpc/assetwalletrpc/assetwallet.swagger.json @@ -1046,9 +1046,26 @@ "type": "string", "format": "byte", "description": "The optional Taproot tweak to apply to the above internal key. If this is\nempty then a BIP-86 style tweak is applied to the internal key." + }, + "type": { + "$ref": "#/definitions/taprpcScriptKeyType", + "description": "The type of the script key. This type is either user-declared when custom\nscript keys are added, or automatically determined by the daemon for\nstandard operations (e.g. BIP-86 keys, burn keys, tombstone keys, channel\nrelated keys)." } } }, + "taprpcScriptKeyType": { + "type": "string", + "enum": [ + "SCRIPT_KEY_UNKNOWN", + "SCRIPT_KEY_BIP86", + "SCRIPT_KEY_SCRIPT_PATH_EXTERNAL", + "SCRIPT_KEY_BURN", + "SCRIPT_KEY_TOMBSTONE", + "SCRIPT_KEY_CHANNEL" + ], + "default": "SCRIPT_KEY_UNKNOWN", + "description": " - SCRIPT_KEY_UNKNOWN: The type of script key is not known. This should only be stored for assets\nwhere we don't know the internal key of the script key (e.g. for\nimported proofs).\n - SCRIPT_KEY_BIP86: The script key is a normal BIP-86 key. This means that the internal key is\nturned into a Taproot output key by applying a BIP-86 tweak to it.\n - SCRIPT_KEY_SCRIPT_PATH_EXTERNAL: The script key is a key that contains a script path that is defined by the\nuser and is therefore external to the tapd wallet. Spending this key\nrequires providing a specific witness and must be signed through the vPSBT\nsigning flow.\n - SCRIPT_KEY_BURN: The script key is a specific un-spendable key that indicates a burnt asset.\nAssets with this key type can never be spent again, as a burn key is a\ntweaked NUMS key that nobody knows the private key for.\n - SCRIPT_KEY_TOMBSTONE: The script key is a specific un-spendable key that indicates a tombstone\noutput. This is only the case for zero-value assets that result from a\nnon-interactive (TAP address) send where no change was left over.\n - SCRIPT_KEY_CHANNEL: The script key is used for an asset that resides within a Taproot Asset\nChannel. That means the script key is either a funding key (OP_TRUE), a\ncommitment output key (to_local, to_remote, htlc), or a HTLC second-level\ntransaction output key. Keys related to channels are not shown in asset\nbalances (unless specifically requested) and are never used for coin\nselection." + }, "taprpcSendAssetResponse": { "type": "object", "properties": { diff --git a/taprpc/marshal.go b/taprpc/marshal.go index aa810f0e8e..7a03d2b739 100644 --- a/taprpc/marshal.go +++ b/taprpc/marshal.go @@ -85,8 +85,14 @@ func UnmarshalKeyDescriptor(rpcDesc *KeyDescriptor) (keychain.KeyDescriptor, // UnmarshalScriptKey parses the RPC script key into the native counterpart. func UnmarshalScriptKey(rpcKey *ScriptKey) (*asset.ScriptKey, error) { var ( - scriptKey asset.ScriptKey - err error + scriptKey = asset.ScriptKey{ + TweakedScriptKey: &asset.TweakedScriptKey{ + // The tweak is optional, if it's empty it means + // the key is derived using BIP-0086. + Tweak: rpcKey.TapTweak, + }, + } + err error ) // The script public key is a Taproot key, so 32-byte x-only. @@ -98,17 +104,15 @@ func UnmarshalScriptKey(rpcKey *ScriptKey) (*asset.ScriptKey, error) { // The key descriptor is optional for script keys that are completely // independent of the backing wallet. if rpcKey.KeyDesc != nil { - keyDesc, err := UnmarshalKeyDescriptor(rpcKey.KeyDesc) + scriptKey.RawKey, err = UnmarshalKeyDescriptor(rpcKey.KeyDesc) if err != nil { return nil, err } - scriptKey.TweakedScriptKey = &asset.TweakedScriptKey{ - RawKey: keyDesc, + } - // The tweak is optional, if it's empty it means the key - // is derived using BIP-0086. - Tweak: rpcKey.TapTweak, - } + scriptKey.Type, err = UnmarshalScriptKeyType(rpcKey.Type) + if err != nil { + return nil, err } return &scriptKey, nil @@ -125,11 +129,63 @@ func MarshalScriptKey(scriptKey asset.ScriptKey) *ScriptKey { scriptKey.TweakedScriptKey.RawKey, ) rpcScriptKey.TapTweak = scriptKey.TweakedScriptKey.Tweak + rpcScriptKey.Type = MarshalScriptKeyType(scriptKey.Type) } return rpcScriptKey } +// UnmarshalScriptKeyType parses the script key type from the RPC variant. +func UnmarshalScriptKeyType(rpcType ScriptKeyType) (asset.ScriptKeyType, + error) { + + switch rpcType { + case ScriptKeyType_SCRIPT_KEY_UNKNOWN: + return asset.ScriptKeyUnknown, nil + + case ScriptKeyType_SCRIPT_KEY_BIP86: + return asset.ScriptKeyBip86, nil + + case ScriptKeyType_SCRIPT_KEY_SCRIPT_PATH_EXTERNAL: + return asset.ScriptKeyScriptPathExternal, nil + + case ScriptKeyType_SCRIPT_KEY_BURN: + return asset.ScriptKeyBurn, nil + + case ScriptKeyType_SCRIPT_KEY_TOMBSTONE: + return asset.ScriptKeyTombstone, nil + + case ScriptKeyType_SCRIPT_KEY_CHANNEL: + return asset.ScriptKeyScriptPathChannel, nil + + default: + return 0, fmt.Errorf("unknown script key type: %v", rpcType) + } +} + +// MarshalScriptKeyType marshals the script key type from the RPC variant. +func MarshalScriptKeyType(typ asset.ScriptKeyType) ScriptKeyType { + switch typ { + case asset.ScriptKeyBip86: + return ScriptKeyType_SCRIPT_KEY_BIP86 + + case asset.ScriptKeyScriptPathExternal: + return ScriptKeyType_SCRIPT_KEY_SCRIPT_PATH_EXTERNAL + + case asset.ScriptKeyBurn: + return ScriptKeyType_SCRIPT_KEY_BURN + + case asset.ScriptKeyTombstone: + return ScriptKeyType_SCRIPT_KEY_TOMBSTONE + + case asset.ScriptKeyScriptPathChannel: + return ScriptKeyType_SCRIPT_KEY_CHANNEL + + default: + return ScriptKeyType_SCRIPT_KEY_UNKNOWN + } +} + // UnmarshalAssetVersion parses an asset version from the RPC variant. func UnmarshalAssetVersion(version AssetVersion) (asset.Version, error) { // For now, we'll only support two asset versions. The ones in the @@ -526,11 +582,18 @@ func MarshalAsset(ctx context.Context, a *asset.Asset, isSpent, withWitness bool, keyRing KeyLookup, decDisplay fn.Option[uint32]) (*Asset, error) { - scriptKeyIsLocal := false - if a.ScriptKey.TweakedScriptKey != nil && keyRing != nil { - scriptKeyIsLocal = keyRing.IsLocalKey( - ctx, a.ScriptKey.RawKey, - ) + var ( + scriptKeyIsLocal = false + scriptKeyType = asset.ScriptKeyUnknown + ) + if a.ScriptKey.TweakedScriptKey != nil { + if keyRing != nil { + scriptKeyIsLocal = keyRing.IsLocalKey( + ctx, a.ScriptKey.RawKey, + ) + } + + scriptKeyType = a.ScriptKey.Type } assetVersion, err := MarshalAssetVersion(a.Version) @@ -552,6 +615,7 @@ func MarshalAsset(ctx context.Context, a *asset.Asset, ScriptKeyHasScriptPath: a.ScriptKey.HasScriptPath(), IsSpent: isSpent, IsBurn: a.IsBurn(), + ScriptKeyType: MarshalScriptKeyType(scriptKeyType), } decDisplay.WhenSome(func(u uint32) { @@ -629,3 +693,41 @@ func MarshalAsset(ctx context.Context, a *asset.Asset, return rpcAsset, nil } + +// ParseScriptKeyTypeQuery parses the script key type query from the RPC +// variant. +func ParseScriptKeyTypeQuery( + q *ScriptKeyTypeQuery) (fn.Option[asset.ScriptKeyType], bool, error) { + + if q == nil || q.Type == nil { + return fn.Some(asset.ScriptKeyBip86), false, nil + } + + switch t := q.Type.(type) { + case *ScriptKeyTypeQuery_ExplicitType: + explicitType, err := UnmarshalScriptKeyType(t.ExplicitType) + if err != nil { + return fn.None[asset.ScriptKeyType](), false, err + } + + // Because burns and tombstones are not spendable, we always + // insert them as "spent". So if the user wants to see any of + // those keys, we need to toggle the "includeSpent" flag, + // otherwise the result will always be empty. + includeSpent := false + switch explicitType { + case asset.ScriptKeyTombstone, asset.ScriptKeyBurn: + includeSpent = true + + default: + } + + return fn.Some(explicitType), includeSpent, nil + + case *ScriptKeyTypeQuery_AllTypes: + return fn.None[asset.ScriptKeyType](), false, nil + + default: + return fn.Some(asset.ScriptKeyBip86), false, nil + } +} diff --git a/taprpc/mintrpc/mint.pb.go b/taprpc/mintrpc/mint.pb.go index ac272dd82c..3e481ce384 100644 --- a/taprpc/mintrpc/mint.pb.go +++ b/taprpc/mintrpc/mint.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.33.0 +// protoc-gen-go v1.34.2 // protoc v3.21.12 // source: mintrpc/mint.proto @@ -1867,7 +1867,7 @@ func file_mintrpc_mint_proto_rawDescGZIP() []byte { var file_mintrpc_mint_proto_enumTypes = make([]protoimpl.EnumInfo, 1) var file_mintrpc_mint_proto_msgTypes = make([]protoimpl.MessageInfo, 19) -var file_mintrpc_mint_proto_goTypes = []interface{}{ +var file_mintrpc_mint_proto_goTypes = []any{ (BatchState)(0), // 0: mintrpc.BatchState (*PendingAsset)(nil), // 1: mintrpc.PendingAsset (*UnsealedAsset)(nil), // 2: mintrpc.UnsealedAsset @@ -1959,7 +1959,7 @@ func file_mintrpc_mint_proto_init() { return } if !protoimpl.UnsafeEnabled { - file_mintrpc_mint_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + file_mintrpc_mint_proto_msgTypes[0].Exporter = func(v any, i int) any { switch v := v.(*PendingAsset); i { case 0: return &v.state @@ -1971,7 +1971,7 @@ func file_mintrpc_mint_proto_init() { return nil } } - file_mintrpc_mint_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + file_mintrpc_mint_proto_msgTypes[1].Exporter = func(v any, i int) any { switch v := v.(*UnsealedAsset); i { case 0: return &v.state @@ -1983,7 +1983,7 @@ func file_mintrpc_mint_proto_init() { return nil } } - file_mintrpc_mint_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + file_mintrpc_mint_proto_msgTypes[2].Exporter = func(v any, i int) any { switch v := v.(*MintAsset); i { case 0: return &v.state @@ -1995,7 +1995,7 @@ func file_mintrpc_mint_proto_init() { return nil } } - file_mintrpc_mint_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + file_mintrpc_mint_proto_msgTypes[3].Exporter = func(v any, i int) any { switch v := v.(*MintAssetRequest); i { case 0: return &v.state @@ -2007,7 +2007,7 @@ func file_mintrpc_mint_proto_init() { return nil } } - file_mintrpc_mint_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + file_mintrpc_mint_proto_msgTypes[4].Exporter = func(v any, i int) any { switch v := v.(*MintAssetResponse); i { case 0: return &v.state @@ -2019,7 +2019,7 @@ func file_mintrpc_mint_proto_init() { return nil } } - file_mintrpc_mint_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + file_mintrpc_mint_proto_msgTypes[5].Exporter = func(v any, i int) any { switch v := v.(*MintingBatch); i { case 0: return &v.state @@ -2031,7 +2031,7 @@ func file_mintrpc_mint_proto_init() { return nil } } - file_mintrpc_mint_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { + file_mintrpc_mint_proto_msgTypes[6].Exporter = func(v any, i int) any { switch v := v.(*VerboseBatch); i { case 0: return &v.state @@ -2043,7 +2043,7 @@ func file_mintrpc_mint_proto_init() { return nil } } - file_mintrpc_mint_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { + file_mintrpc_mint_proto_msgTypes[7].Exporter = func(v any, i int) any { switch v := v.(*FundBatchRequest); i { case 0: return &v.state @@ -2055,7 +2055,7 @@ func file_mintrpc_mint_proto_init() { return nil } } - file_mintrpc_mint_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { + file_mintrpc_mint_proto_msgTypes[8].Exporter = func(v any, i int) any { switch v := v.(*FundBatchResponse); i { case 0: return &v.state @@ -2067,7 +2067,7 @@ func file_mintrpc_mint_proto_init() { return nil } } - file_mintrpc_mint_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { + file_mintrpc_mint_proto_msgTypes[9].Exporter = func(v any, i int) any { switch v := v.(*SealBatchRequest); i { case 0: return &v.state @@ -2079,7 +2079,7 @@ func file_mintrpc_mint_proto_init() { return nil } } - file_mintrpc_mint_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { + file_mintrpc_mint_proto_msgTypes[10].Exporter = func(v any, i int) any { switch v := v.(*SealBatchResponse); i { case 0: return &v.state @@ -2091,7 +2091,7 @@ func file_mintrpc_mint_proto_init() { return nil } } - file_mintrpc_mint_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { + file_mintrpc_mint_proto_msgTypes[11].Exporter = func(v any, i int) any { switch v := v.(*FinalizeBatchRequest); i { case 0: return &v.state @@ -2103,7 +2103,7 @@ func file_mintrpc_mint_proto_init() { return nil } } - file_mintrpc_mint_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { + file_mintrpc_mint_proto_msgTypes[12].Exporter = func(v any, i int) any { switch v := v.(*FinalizeBatchResponse); i { case 0: return &v.state @@ -2115,7 +2115,7 @@ func file_mintrpc_mint_proto_init() { return nil } } - file_mintrpc_mint_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { + file_mintrpc_mint_proto_msgTypes[13].Exporter = func(v any, i int) any { switch v := v.(*CancelBatchRequest); i { case 0: return &v.state @@ -2127,7 +2127,7 @@ func file_mintrpc_mint_proto_init() { return nil } } - file_mintrpc_mint_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { + file_mintrpc_mint_proto_msgTypes[14].Exporter = func(v any, i int) any { switch v := v.(*CancelBatchResponse); i { case 0: return &v.state @@ -2139,7 +2139,7 @@ func file_mintrpc_mint_proto_init() { return nil } } - file_mintrpc_mint_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { + file_mintrpc_mint_proto_msgTypes[15].Exporter = func(v any, i int) any { switch v := v.(*ListBatchRequest); i { case 0: return &v.state @@ -2151,7 +2151,7 @@ func file_mintrpc_mint_proto_init() { return nil } } - file_mintrpc_mint_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { + file_mintrpc_mint_proto_msgTypes[16].Exporter = func(v any, i int) any { switch v := v.(*ListBatchResponse); i { case 0: return &v.state @@ -2163,7 +2163,7 @@ func file_mintrpc_mint_proto_init() { return nil } } - file_mintrpc_mint_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { + file_mintrpc_mint_proto_msgTypes[17].Exporter = func(v any, i int) any { switch v := v.(*SubscribeMintEventsRequest); i { case 0: return &v.state @@ -2175,7 +2175,7 @@ func file_mintrpc_mint_proto_init() { return nil } } - file_mintrpc_mint_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { + file_mintrpc_mint_proto_msgTypes[18].Exporter = func(v any, i int) any { switch v := v.(*MintEvent); i { case 0: return &v.state @@ -2188,15 +2188,15 @@ func file_mintrpc_mint_proto_init() { } } } - file_mintrpc_mint_proto_msgTypes[7].OneofWrappers = []interface{}{ + file_mintrpc_mint_proto_msgTypes[7].OneofWrappers = []any{ (*FundBatchRequest_FullTree)(nil), (*FundBatchRequest_Branch)(nil), } - file_mintrpc_mint_proto_msgTypes[11].OneofWrappers = []interface{}{ + file_mintrpc_mint_proto_msgTypes[11].OneofWrappers = []any{ (*FinalizeBatchRequest_FullTree)(nil), (*FinalizeBatchRequest_Branch)(nil), } - file_mintrpc_mint_proto_msgTypes[15].OneofWrappers = []interface{}{ + file_mintrpc_mint_proto_msgTypes[15].OneofWrappers = []any{ (*ListBatchRequest_BatchKey)(nil), (*ListBatchRequest_BatchKeyStr)(nil), } diff --git a/taprpc/mintrpc/mint.pb.gw.go b/taprpc/mintrpc/mint.pb.gw.go index 616eefd2bd..9cca70af22 100644 --- a/taprpc/mintrpc/mint.pb.gw.go +++ b/taprpc/mintrpc/mint.pb.gw.go @@ -35,11 +35,7 @@ func request_Mint_MintAsset_0(ctx context.Context, marshaler runtime.Marshaler, var protoReq MintAssetRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -52,11 +48,7 @@ func local_request_Mint_MintAsset_0(ctx context.Context, marshaler runtime.Marsh var protoReq MintAssetRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -69,11 +61,7 @@ func request_Mint_FundBatch_0(ctx context.Context, marshaler runtime.Marshaler, var protoReq FundBatchRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -86,11 +74,7 @@ func local_request_Mint_FundBatch_0(ctx context.Context, marshaler runtime.Marsh var protoReq FundBatchRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -103,11 +87,7 @@ func request_Mint_SealBatch_0(ctx context.Context, marshaler runtime.Marshaler, var protoReq SealBatchRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -120,11 +100,7 @@ func local_request_Mint_SealBatch_0(ctx context.Context, marshaler runtime.Marsh var protoReq SealBatchRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -137,11 +113,7 @@ func request_Mint_FinalizeBatch_0(ctx context.Context, marshaler runtime.Marshal var protoReq FinalizeBatchRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -154,11 +126,7 @@ func local_request_Mint_FinalizeBatch_0(ctx context.Context, marshaler runtime.M var protoReq FinalizeBatchRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -171,11 +139,7 @@ func request_Mint_CancelBatch_0(ctx context.Context, marshaler runtime.Marshaler var protoReq CancelBatchRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -188,11 +152,7 @@ func local_request_Mint_CancelBatch_0(ctx context.Context, marshaler runtime.Mar var protoReq CancelBatchRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -202,7 +162,7 @@ func local_request_Mint_CancelBatch_0(ctx context.Context, marshaler runtime.Mar } var ( - filter_Mint_ListBatches_0 = &utilities.DoubleArray{Encoding: map[string]int{"batch_key": 0, "batchKey": 1}, Base: []int{1, 1, 2, 0, 0}, Check: []int{0, 1, 1, 2, 3}} + filter_Mint_ListBatches_0 = &utilities.DoubleArray{Encoding: map[string]int{"batch_key": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} ) func request_Mint_ListBatches_0(ctx context.Context, marshaler runtime.Marshaler, client MintClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { @@ -285,11 +245,7 @@ func request_Mint_SubscribeMintEvents_0(ctx context.Context, marshaler runtime.M var protoReq SubscribeMintEventsRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -475,21 +431,21 @@ func RegisterMintHandlerServer(ctx context.Context, mux *runtime.ServeMux, serve // RegisterMintHandlerFromEndpoint is same as RegisterMintHandler but // automatically dials to "endpoint" and closes the connection when "ctx" gets done. func RegisterMintHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) { - conn, err := grpc.DialContext(ctx, endpoint, opts...) + conn, err := grpc.NewClient(endpoint, opts...) if err != nil { return err } defer func() { if err != nil { if cerr := conn.Close(); cerr != nil { - grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr) + grpclog.Errorf("Failed to close conn to %s: %v", endpoint, cerr) } return } go func() { <-ctx.Done() if cerr := conn.Close(); cerr != nil { - grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr) + grpclog.Errorf("Failed to close conn to %s: %v", endpoint, cerr) } }() }() diff --git a/taprpc/mintrpc/mint.swagger.json b/taprpc/mintrpc/mint.swagger.json index dd3f653e50..60bef4bda2 100644 --- a/taprpc/mintrpc/mint.swagger.json +++ b/taprpc/mintrpc/mint.swagger.json @@ -899,9 +899,26 @@ "type": "string", "format": "byte", "description": "The optional Taproot tweak to apply to the above internal key. If this is\nempty then a BIP-86 style tweak is applied to the internal key." + }, + "type": { + "$ref": "#/definitions/taprpcScriptKeyType", + "description": "The type of the script key. This type is either user-declared when custom\nscript keys are added, or automatically determined by the daemon for\nstandard operations (e.g. BIP-86 keys, burn keys, tombstone keys, channel\nrelated keys)." } } }, + "taprpcScriptKeyType": { + "type": "string", + "enum": [ + "SCRIPT_KEY_UNKNOWN", + "SCRIPT_KEY_BIP86", + "SCRIPT_KEY_SCRIPT_PATH_EXTERNAL", + "SCRIPT_KEY_BURN", + "SCRIPT_KEY_TOMBSTONE", + "SCRIPT_KEY_CHANNEL" + ], + "default": "SCRIPT_KEY_UNKNOWN", + "description": " - SCRIPT_KEY_UNKNOWN: The type of script key is not known. This should only be stored for assets\nwhere we don't know the internal key of the script key (e.g. for\nimported proofs).\n - SCRIPT_KEY_BIP86: The script key is a normal BIP-86 key. This means that the internal key is\nturned into a Taproot output key by applying a BIP-86 tweak to it.\n - SCRIPT_KEY_SCRIPT_PATH_EXTERNAL: The script key is a key that contains a script path that is defined by the\nuser and is therefore external to the tapd wallet. Spending this key\nrequires providing a specific witness and must be signed through the vPSBT\nsigning flow.\n - SCRIPT_KEY_BURN: The script key is a specific un-spendable key that indicates a burnt asset.\nAssets with this key type can never be spent again, as a burn key is a\ntweaked NUMS key that nobody knows the private key for.\n - SCRIPT_KEY_TOMBSTONE: The script key is a specific un-spendable key that indicates a tombstone\noutput. This is only the case for zero-value assets that result from a\nnon-interactive (TAP address) send where no change was left over.\n - SCRIPT_KEY_CHANNEL: The script key is used for an asset that resides within a Taproot Asset\nChannel. That means the script key is either a funding key (OP_TRUE), a\ncommitment output key (to_local, to_remote, htlc), or a HTLC second-level\ntransaction output key. Keys related to channels are not shown in asset\nbalances (unless specifically requested) and are never used for coin\nselection." + }, "taprpcTapBranch": { "type": "object", "properties": { diff --git a/taprpc/priceoraclerpc/price_oracle.pb.go b/taprpc/priceoraclerpc/price_oracle.pb.go index 180e51ff7d..6becebda0f 100644 --- a/taprpc/priceoraclerpc/price_oracle.pb.go +++ b/taprpc/priceoraclerpc/price_oracle.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.33.0 +// protoc-gen-go v1.34.2 // protoc v3.21.12 // source: priceoraclerpc/price_oracle.proto @@ -754,7 +754,7 @@ func file_priceoraclerpc_price_oracle_proto_rawDescGZIP() []byte { var file_priceoraclerpc_price_oracle_proto_enumTypes = make([]protoimpl.EnumInfo, 1) var file_priceoraclerpc_price_oracle_proto_msgTypes = make([]protoimpl.MessageInfo, 7) -var file_priceoraclerpc_price_oracle_proto_goTypes = []interface{}{ +var file_priceoraclerpc_price_oracle_proto_goTypes = []any{ (TransactionType)(0), // 0: priceoraclerpc.TransactionType (*FixedPoint)(nil), // 1: priceoraclerpc.FixedPoint (*AssetRates)(nil), // 2: priceoraclerpc.AssetRates @@ -789,7 +789,7 @@ func file_priceoraclerpc_price_oracle_proto_init() { return } if !protoimpl.UnsafeEnabled { - file_priceoraclerpc_price_oracle_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + file_priceoraclerpc_price_oracle_proto_msgTypes[0].Exporter = func(v any, i int) any { switch v := v.(*FixedPoint); i { case 0: return &v.state @@ -801,7 +801,7 @@ func file_priceoraclerpc_price_oracle_proto_init() { return nil } } - file_priceoraclerpc_price_oracle_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + file_priceoraclerpc_price_oracle_proto_msgTypes[1].Exporter = func(v any, i int) any { switch v := v.(*AssetRates); i { case 0: return &v.state @@ -813,7 +813,7 @@ func file_priceoraclerpc_price_oracle_proto_init() { return nil } } - file_priceoraclerpc_price_oracle_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + file_priceoraclerpc_price_oracle_proto_msgTypes[2].Exporter = func(v any, i int) any { switch v := v.(*AssetSpecifier); i { case 0: return &v.state @@ -825,7 +825,7 @@ func file_priceoraclerpc_price_oracle_proto_init() { return nil } } - file_priceoraclerpc_price_oracle_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + file_priceoraclerpc_price_oracle_proto_msgTypes[3].Exporter = func(v any, i int) any { switch v := v.(*QueryAssetRatesRequest); i { case 0: return &v.state @@ -837,7 +837,7 @@ func file_priceoraclerpc_price_oracle_proto_init() { return nil } } - file_priceoraclerpc_price_oracle_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + file_priceoraclerpc_price_oracle_proto_msgTypes[4].Exporter = func(v any, i int) any { switch v := v.(*QueryAssetRatesOkResponse); i { case 0: return &v.state @@ -849,7 +849,7 @@ func file_priceoraclerpc_price_oracle_proto_init() { return nil } } - file_priceoraclerpc_price_oracle_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + file_priceoraclerpc_price_oracle_proto_msgTypes[5].Exporter = func(v any, i int) any { switch v := v.(*QueryAssetRatesErrResponse); i { case 0: return &v.state @@ -861,7 +861,7 @@ func file_priceoraclerpc_price_oracle_proto_init() { return nil } } - file_priceoraclerpc_price_oracle_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { + file_priceoraclerpc_price_oracle_proto_msgTypes[6].Exporter = func(v any, i int) any { switch v := v.(*QueryAssetRatesResponse); i { case 0: return &v.state @@ -874,13 +874,13 @@ func file_priceoraclerpc_price_oracle_proto_init() { } } } - file_priceoraclerpc_price_oracle_proto_msgTypes[2].OneofWrappers = []interface{}{ + file_priceoraclerpc_price_oracle_proto_msgTypes[2].OneofWrappers = []any{ (*AssetSpecifier_AssetId)(nil), (*AssetSpecifier_AssetIdStr)(nil), (*AssetSpecifier_GroupKey)(nil), (*AssetSpecifier_GroupKeyStr)(nil), } - file_priceoraclerpc_price_oracle_proto_msgTypes[6].OneofWrappers = []interface{}{ + file_priceoraclerpc_price_oracle_proto_msgTypes[6].OneofWrappers = []any{ (*QueryAssetRatesResponse_Ok)(nil), (*QueryAssetRatesResponse_Error)(nil), } diff --git a/taprpc/priceoraclerpc/price_oracle.pb.gw.go b/taprpc/priceoraclerpc/price_oracle.pb.gw.go index 560a9b814d..2f9501573d 100644 --- a/taprpc/priceoraclerpc/price_oracle.pb.gw.go +++ b/taprpc/priceoraclerpc/price_oracle.pb.gw.go @@ -104,21 +104,21 @@ func RegisterPriceOracleHandlerServer(ctx context.Context, mux *runtime.ServeMux // RegisterPriceOracleHandlerFromEndpoint is same as RegisterPriceOracleHandler but // automatically dials to "endpoint" and closes the connection when "ctx" gets done. func RegisterPriceOracleHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) { - conn, err := grpc.DialContext(ctx, endpoint, opts...) + conn, err := grpc.NewClient(endpoint, opts...) if err != nil { return err } defer func() { if err != nil { if cerr := conn.Close(); cerr != nil { - grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr) + grpclog.Errorf("Failed to close conn to %s: %v", endpoint, cerr) } return } go func() { <-ctx.Done() if cerr := conn.Close(); cerr != nil { - grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr) + grpclog.Errorf("Failed to close conn to %s: %v", endpoint, cerr) } }() }() diff --git a/taprpc/rfqrpc/rfq.pb.go b/taprpc/rfqrpc/rfq.pb.go index fbf0ae6a18..985a2a0bd2 100644 --- a/taprpc/rfqrpc/rfq.pb.go +++ b/taprpc/rfqrpc/rfq.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.33.0 +// protoc-gen-go v1.34.2 // protoc v3.21.12 // source: rfqrpc/rfq.proto @@ -1900,7 +1900,7 @@ func file_rfqrpc_rfq_proto_rawDescGZIP() []byte { var file_rfqrpc_rfq_proto_enumTypes = make([]protoimpl.EnumInfo, 1) var file_rfqrpc_rfq_proto_msgTypes = make([]protoimpl.MessageInfo, 21) -var file_rfqrpc_rfq_proto_goTypes = []interface{}{ +var file_rfqrpc_rfq_proto_goTypes = []any{ (QuoteRespStatus)(0), // 0: rfqrpc.QuoteRespStatus (*AssetSpecifier)(nil), // 1: rfqrpc.AssetSpecifier (*FixedPoint)(nil), // 2: rfqrpc.FixedPoint @@ -1970,7 +1970,7 @@ func file_rfqrpc_rfq_proto_init() { return } if !protoimpl.UnsafeEnabled { - file_rfqrpc_rfq_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + file_rfqrpc_rfq_proto_msgTypes[0].Exporter = func(v any, i int) any { switch v := v.(*AssetSpecifier); i { case 0: return &v.state @@ -1982,7 +1982,7 @@ func file_rfqrpc_rfq_proto_init() { return nil } } - file_rfqrpc_rfq_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + file_rfqrpc_rfq_proto_msgTypes[1].Exporter = func(v any, i int) any { switch v := v.(*FixedPoint); i { case 0: return &v.state @@ -1994,7 +1994,7 @@ func file_rfqrpc_rfq_proto_init() { return nil } } - file_rfqrpc_rfq_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + file_rfqrpc_rfq_proto_msgTypes[2].Exporter = func(v any, i int) any { switch v := v.(*AddAssetBuyOrderRequest); i { case 0: return &v.state @@ -2006,7 +2006,7 @@ func file_rfqrpc_rfq_proto_init() { return nil } } - file_rfqrpc_rfq_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + file_rfqrpc_rfq_proto_msgTypes[3].Exporter = func(v any, i int) any { switch v := v.(*AddAssetBuyOrderResponse); i { case 0: return &v.state @@ -2018,7 +2018,7 @@ func file_rfqrpc_rfq_proto_init() { return nil } } - file_rfqrpc_rfq_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + file_rfqrpc_rfq_proto_msgTypes[4].Exporter = func(v any, i int) any { switch v := v.(*AddAssetSellOrderRequest); i { case 0: return &v.state @@ -2030,7 +2030,7 @@ func file_rfqrpc_rfq_proto_init() { return nil } } - file_rfqrpc_rfq_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + file_rfqrpc_rfq_proto_msgTypes[5].Exporter = func(v any, i int) any { switch v := v.(*AddAssetSellOrderResponse); i { case 0: return &v.state @@ -2042,7 +2042,7 @@ func file_rfqrpc_rfq_proto_init() { return nil } } - file_rfqrpc_rfq_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { + file_rfqrpc_rfq_proto_msgTypes[6].Exporter = func(v any, i int) any { switch v := v.(*AddAssetSellOfferRequest); i { case 0: return &v.state @@ -2054,7 +2054,7 @@ func file_rfqrpc_rfq_proto_init() { return nil } } - file_rfqrpc_rfq_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { + file_rfqrpc_rfq_proto_msgTypes[7].Exporter = func(v any, i int) any { switch v := v.(*AddAssetSellOfferResponse); i { case 0: return &v.state @@ -2066,7 +2066,7 @@ func file_rfqrpc_rfq_proto_init() { return nil } } - file_rfqrpc_rfq_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { + file_rfqrpc_rfq_proto_msgTypes[8].Exporter = func(v any, i int) any { switch v := v.(*AddAssetBuyOfferRequest); i { case 0: return &v.state @@ -2078,7 +2078,7 @@ func file_rfqrpc_rfq_proto_init() { return nil } } - file_rfqrpc_rfq_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { + file_rfqrpc_rfq_proto_msgTypes[9].Exporter = func(v any, i int) any { switch v := v.(*AddAssetBuyOfferResponse); i { case 0: return &v.state @@ -2090,7 +2090,7 @@ func file_rfqrpc_rfq_proto_init() { return nil } } - file_rfqrpc_rfq_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { + file_rfqrpc_rfq_proto_msgTypes[10].Exporter = func(v any, i int) any { switch v := v.(*QueryPeerAcceptedQuotesRequest); i { case 0: return &v.state @@ -2102,7 +2102,7 @@ func file_rfqrpc_rfq_proto_init() { return nil } } - file_rfqrpc_rfq_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { + file_rfqrpc_rfq_proto_msgTypes[11].Exporter = func(v any, i int) any { switch v := v.(*PeerAcceptedBuyQuote); i { case 0: return &v.state @@ -2114,7 +2114,7 @@ func file_rfqrpc_rfq_proto_init() { return nil } } - file_rfqrpc_rfq_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { + file_rfqrpc_rfq_proto_msgTypes[12].Exporter = func(v any, i int) any { switch v := v.(*PeerAcceptedSellQuote); i { case 0: return &v.state @@ -2126,7 +2126,7 @@ func file_rfqrpc_rfq_proto_init() { return nil } } - file_rfqrpc_rfq_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { + file_rfqrpc_rfq_proto_msgTypes[13].Exporter = func(v any, i int) any { switch v := v.(*InvalidQuoteResponse); i { case 0: return &v.state @@ -2138,7 +2138,7 @@ func file_rfqrpc_rfq_proto_init() { return nil } } - file_rfqrpc_rfq_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { + file_rfqrpc_rfq_proto_msgTypes[14].Exporter = func(v any, i int) any { switch v := v.(*RejectedQuoteResponse); i { case 0: return &v.state @@ -2150,7 +2150,7 @@ func file_rfqrpc_rfq_proto_init() { return nil } } - file_rfqrpc_rfq_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { + file_rfqrpc_rfq_proto_msgTypes[15].Exporter = func(v any, i int) any { switch v := v.(*QueryPeerAcceptedQuotesResponse); i { case 0: return &v.state @@ -2162,7 +2162,7 @@ func file_rfqrpc_rfq_proto_init() { return nil } } - file_rfqrpc_rfq_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { + file_rfqrpc_rfq_proto_msgTypes[16].Exporter = func(v any, i int) any { switch v := v.(*SubscribeRfqEventNtfnsRequest); i { case 0: return &v.state @@ -2174,7 +2174,7 @@ func file_rfqrpc_rfq_proto_init() { return nil } } - file_rfqrpc_rfq_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { + file_rfqrpc_rfq_proto_msgTypes[17].Exporter = func(v any, i int) any { switch v := v.(*PeerAcceptedBuyQuoteEvent); i { case 0: return &v.state @@ -2186,7 +2186,7 @@ func file_rfqrpc_rfq_proto_init() { return nil } } - file_rfqrpc_rfq_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { + file_rfqrpc_rfq_proto_msgTypes[18].Exporter = func(v any, i int) any { switch v := v.(*PeerAcceptedSellQuoteEvent); i { case 0: return &v.state @@ -2198,7 +2198,7 @@ func file_rfqrpc_rfq_proto_init() { return nil } } - file_rfqrpc_rfq_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { + file_rfqrpc_rfq_proto_msgTypes[19].Exporter = func(v any, i int) any { switch v := v.(*AcceptHtlcEvent); i { case 0: return &v.state @@ -2210,7 +2210,7 @@ func file_rfqrpc_rfq_proto_init() { return nil } } - file_rfqrpc_rfq_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { + file_rfqrpc_rfq_proto_msgTypes[20].Exporter = func(v any, i int) any { switch v := v.(*RfqEvent); i { case 0: return &v.state @@ -2223,23 +2223,23 @@ func file_rfqrpc_rfq_proto_init() { } } } - file_rfqrpc_rfq_proto_msgTypes[0].OneofWrappers = []interface{}{ + file_rfqrpc_rfq_proto_msgTypes[0].OneofWrappers = []any{ (*AssetSpecifier_AssetId)(nil), (*AssetSpecifier_AssetIdStr)(nil), (*AssetSpecifier_GroupKey)(nil), (*AssetSpecifier_GroupKeyStr)(nil), } - file_rfqrpc_rfq_proto_msgTypes[3].OneofWrappers = []interface{}{ + file_rfqrpc_rfq_proto_msgTypes[3].OneofWrappers = []any{ (*AddAssetBuyOrderResponse_AcceptedQuote)(nil), (*AddAssetBuyOrderResponse_InvalidQuote)(nil), (*AddAssetBuyOrderResponse_RejectedQuote)(nil), } - file_rfqrpc_rfq_proto_msgTypes[5].OneofWrappers = []interface{}{ + file_rfqrpc_rfq_proto_msgTypes[5].OneofWrappers = []any{ (*AddAssetSellOrderResponse_AcceptedQuote)(nil), (*AddAssetSellOrderResponse_InvalidQuote)(nil), (*AddAssetSellOrderResponse_RejectedQuote)(nil), } - file_rfqrpc_rfq_proto_msgTypes[20].OneofWrappers = []interface{}{ + file_rfqrpc_rfq_proto_msgTypes[20].OneofWrappers = []any{ (*RfqEvent_PeerAcceptedBuyQuote)(nil), (*RfqEvent_PeerAcceptedSellQuote)(nil), (*RfqEvent_AcceptHtlc)(nil), diff --git a/taprpc/rfqrpc/rfq.pb.gw.go b/taprpc/rfqrpc/rfq.pb.gw.go index d63a4307d3..57abbcc247 100644 --- a/taprpc/rfqrpc/rfq.pb.gw.go +++ b/taprpc/rfqrpc/rfq.pb.gw.go @@ -35,11 +35,7 @@ func request_Rfq_AddAssetBuyOrder_0(ctx context.Context, marshaler runtime.Marsh var protoReq AddAssetBuyOrderRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -69,11 +65,7 @@ func local_request_Rfq_AddAssetBuyOrder_0(ctx context.Context, marshaler runtime var protoReq AddAssetBuyOrderRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -103,11 +95,7 @@ func request_Rfq_AddAssetBuyOrder_1(ctx context.Context, marshaler runtime.Marsh var protoReq AddAssetBuyOrderRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -137,11 +125,7 @@ func local_request_Rfq_AddAssetBuyOrder_1(ctx context.Context, marshaler runtime var protoReq AddAssetBuyOrderRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -171,11 +155,7 @@ func request_Rfq_AddAssetSellOrder_0(ctx context.Context, marshaler runtime.Mars var protoReq AddAssetSellOrderRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -205,11 +185,7 @@ func local_request_Rfq_AddAssetSellOrder_0(ctx context.Context, marshaler runtim var protoReq AddAssetSellOrderRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -239,11 +215,7 @@ func request_Rfq_AddAssetSellOrder_1(ctx context.Context, marshaler runtime.Mars var protoReq AddAssetSellOrderRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -273,11 +245,7 @@ func local_request_Rfq_AddAssetSellOrder_1(ctx context.Context, marshaler runtim var protoReq AddAssetSellOrderRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -307,11 +275,7 @@ func request_Rfq_AddAssetSellOffer_0(ctx context.Context, marshaler runtime.Mars var protoReq AddAssetSellOfferRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -341,11 +305,7 @@ func local_request_Rfq_AddAssetSellOffer_0(ctx context.Context, marshaler runtim var protoReq AddAssetSellOfferRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -375,11 +335,7 @@ func request_Rfq_AddAssetSellOffer_1(ctx context.Context, marshaler runtime.Mars var protoReq AddAssetSellOfferRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -409,11 +365,7 @@ func local_request_Rfq_AddAssetSellOffer_1(ctx context.Context, marshaler runtim var protoReq AddAssetSellOfferRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -443,11 +395,7 @@ func request_Rfq_AddAssetBuyOffer_0(ctx context.Context, marshaler runtime.Marsh var protoReq AddAssetBuyOfferRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -477,11 +425,7 @@ func local_request_Rfq_AddAssetBuyOffer_0(ctx context.Context, marshaler runtime var protoReq AddAssetBuyOfferRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -511,11 +455,7 @@ func request_Rfq_AddAssetBuyOffer_1(ctx context.Context, marshaler runtime.Marsh var protoReq AddAssetBuyOfferRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -545,11 +485,7 @@ func local_request_Rfq_AddAssetBuyOffer_1(ctx context.Context, marshaler runtime var protoReq AddAssetBuyOfferRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -597,11 +533,7 @@ func request_Rfq_SubscribeRfqEventNtfns_0(ctx context.Context, marshaler runtime var protoReq SubscribeRfqEventNtfnsRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -862,21 +794,21 @@ func RegisterRfqHandlerServer(ctx context.Context, mux *runtime.ServeMux, server // RegisterRfqHandlerFromEndpoint is same as RegisterRfqHandler but // automatically dials to "endpoint" and closes the connection when "ctx" gets done. func RegisterRfqHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) { - conn, err := grpc.DialContext(ctx, endpoint, opts...) + conn, err := grpc.NewClient(endpoint, opts...) if err != nil { return err } defer func() { if err != nil { if cerr := conn.Close(); cerr != nil { - grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr) + grpclog.Errorf("Failed to close conn to %s: %v", endpoint, cerr) } return } go func() { <-ctx.Done() if cerr := conn.Close(); cerr != nil { - grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr) + grpclog.Errorf("Failed to close conn to %s: %v", endpoint, cerr) } }() }() diff --git a/taprpc/rfqrpc/rfq.swagger.json b/taprpc/rfqrpc/rfq.swagger.json index 5bdff4a1a1..9270b51a52 100644 --- a/taprpc/rfqrpc/rfq.swagger.json +++ b/taprpc/rfqrpc/rfq.swagger.json @@ -48,35 +48,7 @@ "in": "body", "required": true, "schema": { - "type": "object", - "properties": { - "asset_specifier": { - "type": "object", - "properties": { - "asset_id": { - "type": "string", - "format": "byte", - "description": "The 32-byte asset ID specified as raw bytes (gRPC only)." - }, - "group_key": { - "type": "string", - "format": "byte", - "description": "The 32-byte asset group key specified as raw bytes (gRPC only)." - }, - "group_key_str": { - "type": "string", - "description": "The 32-byte asset group key encoded as hex string (use this for\nREST)." - } - }, - "description": "asset_specifier is the subject asset.", - "title": "asset_specifier is the subject asset." - }, - "max_units": { - "type": "string", - "format": "uint64", - "description": "max_units is the maximum amount of the asset to buy." - } - } + "$ref": "#/definitions/RfqAddAssetBuyOfferBody" } } ], @@ -117,35 +89,7 @@ "in": "body", "required": true, "schema": { - "type": "object", - "properties": { - "asset_specifier": { - "type": "object", - "properties": { - "asset_id": { - "type": "string", - "format": "byte", - "description": "The 32-byte asset ID specified as raw bytes (gRPC only)." - }, - "asset_id_str": { - "type": "string", - "description": "The 32-byte asset ID encoded as a hex string (use this for REST)." - }, - "group_key": { - "type": "string", - "format": "byte", - "description": "The 32-byte asset group key specified as raw bytes (gRPC only)." - } - }, - "description": "asset_specifier is the subject asset.", - "title": "asset_specifier is the subject asset." - }, - "max_units": { - "type": "string", - "format": "uint64", - "description": "max_units is the maximum amount of the asset to buy." - } - } + "$ref": "#/definitions/RfqAddAssetBuyOfferBody" } } ], @@ -186,54 +130,7 @@ "in": "body", "required": true, "schema": { - "type": "object", - "properties": { - "asset_specifier": { - "type": "object", - "properties": { - "asset_id": { - "type": "string", - "format": "byte", - "description": "The 32-byte asset ID specified as raw bytes (gRPC only)." - }, - "group_key": { - "type": "string", - "format": "byte", - "description": "The 32-byte asset group key specified as raw bytes (gRPC only)." - }, - "group_key_str": { - "type": "string", - "description": "The 32-byte asset group key encoded as hex string (use this for\nREST)." - } - }, - "description": "asset_specifier is the subject asset.", - "title": "asset_specifier is the subject asset." - }, - "asset_max_amt": { - "type": "string", - "format": "uint64", - "description": "The maximum amount of the asset that the provider must be willing to\noffer." - }, - "expiry": { - "type": "string", - "format": "uint64", - "description": "The unix timestamp in seconds after which the order is no longer valid." - }, - "peer_pub_key": { - "type": "string", - "format": "byte", - "description": "peer_pub_key is an optional field for specifying the public key of the\nintended recipient peer for the order." - }, - "timeout_seconds": { - "type": "integer", - "format": "int64", - "description": "timeout_seconds is the number of seconds to wait for the peer to respond\nwith an accepted quote (or a rejection)." - }, - "skip_asset_channel_check": { - "type": "boolean", - "description": "If set, the check if a channel with the given asset exists with the peer\nwill be skipped. An active channel with the peer is still required for\nthe RFQ negotiation to work. This flag shouldn't be set outside of test\nscenarios." - } - } + "$ref": "#/definitions/RfqAddAssetBuyOrderBody" } } ], @@ -274,54 +171,7 @@ "in": "body", "required": true, "schema": { - "type": "object", - "properties": { - "asset_specifier": { - "type": "object", - "properties": { - "asset_id": { - "type": "string", - "format": "byte", - "description": "The 32-byte asset ID specified as raw bytes (gRPC only)." - }, - "asset_id_str": { - "type": "string", - "description": "The 32-byte asset ID encoded as a hex string (use this for REST)." - }, - "group_key": { - "type": "string", - "format": "byte", - "description": "The 32-byte asset group key specified as raw bytes (gRPC only)." - } - }, - "description": "asset_specifier is the subject asset.", - "title": "asset_specifier is the subject asset." - }, - "asset_max_amt": { - "type": "string", - "format": "uint64", - "description": "The maximum amount of the asset that the provider must be willing to\noffer." - }, - "expiry": { - "type": "string", - "format": "uint64", - "description": "The unix timestamp in seconds after which the order is no longer valid." - }, - "peer_pub_key": { - "type": "string", - "format": "byte", - "description": "peer_pub_key is an optional field for specifying the public key of the\nintended recipient peer for the order." - }, - "timeout_seconds": { - "type": "integer", - "format": "int64", - "description": "timeout_seconds is the number of seconds to wait for the peer to respond\nwith an accepted quote (or a rejection)." - }, - "skip_asset_channel_check": { - "type": "boolean", - "description": "If set, the check if a channel with the given asset exists with the peer\nwill be skipped. An active channel with the peer is still required for\nthe RFQ negotiation to work. This flag shouldn't be set outside of test\nscenarios." - } - } + "$ref": "#/definitions/RfqAddAssetBuyOrderBody" } } ], @@ -426,35 +276,7 @@ "in": "body", "required": true, "schema": { - "type": "object", - "properties": { - "asset_specifier": { - "type": "object", - "properties": { - "asset_id": { - "type": "string", - "format": "byte", - "description": "The 32-byte asset ID specified as raw bytes (gRPC only)." - }, - "group_key": { - "type": "string", - "format": "byte", - "description": "The 32-byte asset group key specified as raw bytes (gRPC only)." - }, - "group_key_str": { - "type": "string", - "description": "The 32-byte asset group key encoded as hex string (use this for\nREST)." - } - }, - "description": "asset_specifier is the subject asset.", - "title": "asset_specifier is the subject asset." - }, - "max_units": { - "type": "string", - "format": "uint64", - "description": "max_units is the maximum amount of the asset to sell." - } - } + "$ref": "#/definitions/RfqAddAssetSellOfferBody" } } ], @@ -494,35 +316,7 @@ "in": "body", "required": true, "schema": { - "type": "object", - "properties": { - "asset_specifier": { - "type": "object", - "properties": { - "asset_id": { - "type": "string", - "format": "byte", - "description": "The 32-byte asset ID specified as raw bytes (gRPC only)." - }, - "asset_id_str": { - "type": "string", - "description": "The 32-byte asset ID encoded as a hex string (use this for REST)." - }, - "group_key": { - "type": "string", - "format": "byte", - "description": "The 32-byte asset group key specified as raw bytes (gRPC only)." - } - }, - "description": "asset_specifier is the subject asset.", - "title": "asset_specifier is the subject asset." - }, - "max_units": { - "type": "string", - "format": "uint64", - "description": "max_units is the maximum amount of the asset to sell." - } - } + "$ref": "#/definitions/RfqAddAssetSellOfferBody" } } ], @@ -562,54 +356,7 @@ "in": "body", "required": true, "schema": { - "type": "object", - "properties": { - "asset_specifier": { - "type": "object", - "properties": { - "asset_id": { - "type": "string", - "format": "byte", - "description": "The 32-byte asset ID specified as raw bytes (gRPC only)." - }, - "group_key": { - "type": "string", - "format": "byte", - "description": "The 32-byte asset group key specified as raw bytes (gRPC only)." - }, - "group_key_str": { - "type": "string", - "description": "The 32-byte asset group key encoded as hex string (use this for\nREST)." - } - }, - "description": "asset_specifier is the subject asset.", - "title": "asset_specifier is the subject asset." - }, - "payment_max_amt": { - "type": "string", - "format": "uint64", - "description": "The maximum msat amount that the responding peer must agree to pay\n(units: millisats)." - }, - "expiry": { - "type": "string", - "format": "uint64", - "description": "The unix timestamp in seconds after which the order is no longer valid." - }, - "peer_pub_key": { - "type": "string", - "format": "byte", - "description": "peer_pub_key is an optional field for specifying the public key of the\nintended recipient peer for the order." - }, - "timeout_seconds": { - "type": "integer", - "format": "int64", - "description": "timeout_seconds is the number of seconds to wait for the peer to respond\nwith an accepted quote (or a rejection)." - }, - "skip_asset_channel_check": { - "type": "boolean", - "description": "If set, the check if a channel with the given asset exists with the peer\nwill be skipped. An active channel with the peer is still required for\nthe RFQ negotiation to work. This flag shouldn't be set outside of test\nscenarios." - } - } + "$ref": "#/definitions/RfqAddAssetSellOrderBody" } } ], @@ -649,54 +396,7 @@ "in": "body", "required": true, "schema": { - "type": "object", - "properties": { - "asset_specifier": { - "type": "object", - "properties": { - "asset_id": { - "type": "string", - "format": "byte", - "description": "The 32-byte asset ID specified as raw bytes (gRPC only)." - }, - "asset_id_str": { - "type": "string", - "description": "The 32-byte asset ID encoded as a hex string (use this for REST)." - }, - "group_key": { - "type": "string", - "format": "byte", - "description": "The 32-byte asset group key specified as raw bytes (gRPC only)." - } - }, - "description": "asset_specifier is the subject asset.", - "title": "asset_specifier is the subject asset." - }, - "payment_max_amt": { - "type": "string", - "format": "uint64", - "description": "The maximum msat amount that the responding peer must agree to pay\n(units: millisats)." - }, - "expiry": { - "type": "string", - "format": "uint64", - "description": "The unix timestamp in seconds after which the order is no longer valid." - }, - "peer_pub_key": { - "type": "string", - "format": "byte", - "description": "peer_pub_key is an optional field for specifying the public key of the\nintended recipient peer for the order." - }, - "timeout_seconds": { - "type": "integer", - "format": "int64", - "description": "timeout_seconds is the number of seconds to wait for the peer to respond\nwith an accepted quote (or a rejection)." - }, - "skip_asset_channel_check": { - "type": "boolean", - "description": "If set, the check if a channel with the given asset exists with the peer\nwill be skipped. An active channel with the peer is still required for\nthe RFQ negotiation to work. This flag shouldn't be set outside of test\nscenarios." - } - } + "$ref": "#/definitions/RfqAddAssetSellOrderBody" } } ], @@ -707,6 +407,168 @@ } }, "definitions": { + "RfqAddAssetBuyOfferBody": { + "type": "object", + "properties": { + "asset_specifier": { + "type": "object", + "properties": { + "asset_id": { + "type": "string", + "format": "byte", + "description": "The 32-byte asset ID specified as raw bytes (gRPC only)." + }, + "asset_id_str": { + "type": "string", + "description": "The 32-byte asset ID encoded as a hex string (use this for REST)." + }, + "group_key": { + "type": "string", + "format": "byte", + "description": "The 32-byte asset group key specified as raw bytes (gRPC only)." + } + }, + "description": "asset_specifier is the subject asset.", + "title": "asset_specifier is the subject asset." + }, + "max_units": { + "type": "string", + "format": "uint64", + "description": "max_units is the maximum amount of the asset to buy." + } + } + }, + "RfqAddAssetBuyOrderBody": { + "type": "object", + "properties": { + "asset_specifier": { + "type": "object", + "properties": { + "asset_id": { + "type": "string", + "format": "byte", + "description": "The 32-byte asset ID specified as raw bytes (gRPC only)." + }, + "asset_id_str": { + "type": "string", + "description": "The 32-byte asset ID encoded as a hex string (use this for REST)." + }, + "group_key": { + "type": "string", + "format": "byte", + "description": "The 32-byte asset group key specified as raw bytes (gRPC only)." + } + }, + "description": "asset_specifier is the subject asset.", + "title": "asset_specifier is the subject asset." + }, + "asset_max_amt": { + "type": "string", + "format": "uint64", + "description": "The maximum amount of the asset that the provider must be willing to\noffer." + }, + "expiry": { + "type": "string", + "format": "uint64", + "description": "The unix timestamp in seconds after which the order is no longer valid." + }, + "peer_pub_key": { + "type": "string", + "format": "byte", + "description": "peer_pub_key is an optional field for specifying the public key of the\nintended recipient peer for the order." + }, + "timeout_seconds": { + "type": "integer", + "format": "int64", + "description": "timeout_seconds is the number of seconds to wait for the peer to respond\nwith an accepted quote (or a rejection)." + }, + "skip_asset_channel_check": { + "type": "boolean", + "description": "If set, the check if a channel with the given asset exists with the peer\nwill be skipped. An active channel with the peer is still required for\nthe RFQ negotiation to work. This flag shouldn't be set outside of test\nscenarios." + } + } + }, + "RfqAddAssetSellOfferBody": { + "type": "object", + "properties": { + "asset_specifier": { + "type": "object", + "properties": { + "asset_id": { + "type": "string", + "format": "byte", + "description": "The 32-byte asset ID specified as raw bytes (gRPC only)." + }, + "asset_id_str": { + "type": "string", + "description": "The 32-byte asset ID encoded as a hex string (use this for REST)." + }, + "group_key": { + "type": "string", + "format": "byte", + "description": "The 32-byte asset group key specified as raw bytes (gRPC only)." + } + }, + "description": "asset_specifier is the subject asset.", + "title": "asset_specifier is the subject asset." + }, + "max_units": { + "type": "string", + "format": "uint64", + "description": "max_units is the maximum amount of the asset to sell." + } + } + }, + "RfqAddAssetSellOrderBody": { + "type": "object", + "properties": { + "asset_specifier": { + "type": "object", + "properties": { + "asset_id": { + "type": "string", + "format": "byte", + "description": "The 32-byte asset ID specified as raw bytes (gRPC only)." + }, + "asset_id_str": { + "type": "string", + "description": "The 32-byte asset ID encoded as a hex string (use this for REST)." + }, + "group_key": { + "type": "string", + "format": "byte", + "description": "The 32-byte asset group key specified as raw bytes (gRPC only)." + } + }, + "description": "asset_specifier is the subject asset.", + "title": "asset_specifier is the subject asset." + }, + "payment_max_amt": { + "type": "string", + "format": "uint64", + "description": "The maximum msat amount that the responding peer must agree to pay\n(units: millisats)." + }, + "expiry": { + "type": "string", + "format": "uint64", + "description": "The unix timestamp in seconds after which the order is no longer valid." + }, + "peer_pub_key": { + "type": "string", + "format": "byte", + "description": "peer_pub_key is an optional field for specifying the public key of the\nintended recipient peer for the order." + }, + "timeout_seconds": { + "type": "integer", + "format": "int64", + "description": "timeout_seconds is the number of seconds to wait for the peer to respond\nwith an accepted quote (or a rejection)." + }, + "skip_asset_channel_check": { + "type": "boolean", + "description": "If set, the check if a channel with the given asset exists with the peer\nwill be skipped. An active channel with the peer is still required for\nthe RFQ negotiation to work. This flag shouldn't be set outside of test\nscenarios." + } + } + }, "protobufAny": { "type": "object", "properties": { diff --git a/taprpc/tapchannelrpc/tapchannel.pb.go b/taprpc/tapchannelrpc/tapchannel.pb.go index 809eec8f2a..cdf914a316 100644 --- a/taprpc/tapchannelrpc/tapchannel.pb.go +++ b/taprpc/tapchannelrpc/tapchannel.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.33.0 +// protoc-gen-go v1.34.2 // protoc v3.21.12 // source: tapchannelrpc/tapchannel.proto @@ -1121,7 +1121,7 @@ func file_tapchannelrpc_tapchannel_proto_rawDescGZIP() []byte { } var file_tapchannelrpc_tapchannel_proto_msgTypes = make([]protoimpl.MessageInfo, 14) -var file_tapchannelrpc_tapchannel_proto_goTypes = []interface{}{ +var file_tapchannelrpc_tapchannel_proto_goTypes = []any{ (*FundChannelRequest)(nil), // 0: tapchannelrpc.FundChannelRequest (*FundChannelResponse)(nil), // 1: tapchannelrpc.FundChannelResponse (*RouterSendPaymentData)(nil), // 2: tapchannelrpc.RouterSendPaymentData @@ -1185,7 +1185,7 @@ func file_tapchannelrpc_tapchannel_proto_init() { return } if !protoimpl.UnsafeEnabled { - file_tapchannelrpc_tapchannel_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + file_tapchannelrpc_tapchannel_proto_msgTypes[0].Exporter = func(v any, i int) any { switch v := v.(*FundChannelRequest); i { case 0: return &v.state @@ -1197,7 +1197,7 @@ func file_tapchannelrpc_tapchannel_proto_init() { return nil } } - file_tapchannelrpc_tapchannel_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + file_tapchannelrpc_tapchannel_proto_msgTypes[1].Exporter = func(v any, i int) any { switch v := v.(*FundChannelResponse); i { case 0: return &v.state @@ -1209,7 +1209,7 @@ func file_tapchannelrpc_tapchannel_proto_init() { return nil } } - file_tapchannelrpc_tapchannel_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + file_tapchannelrpc_tapchannel_proto_msgTypes[2].Exporter = func(v any, i int) any { switch v := v.(*RouterSendPaymentData); i { case 0: return &v.state @@ -1221,7 +1221,7 @@ func file_tapchannelrpc_tapchannel_proto_init() { return nil } } - file_tapchannelrpc_tapchannel_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + file_tapchannelrpc_tapchannel_proto_msgTypes[3].Exporter = func(v any, i int) any { switch v := v.(*EncodeCustomRecordsRequest); i { case 0: return &v.state @@ -1233,7 +1233,7 @@ func file_tapchannelrpc_tapchannel_proto_init() { return nil } } - file_tapchannelrpc_tapchannel_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + file_tapchannelrpc_tapchannel_proto_msgTypes[4].Exporter = func(v any, i int) any { switch v := v.(*EncodeCustomRecordsResponse); i { case 0: return &v.state @@ -1245,7 +1245,7 @@ func file_tapchannelrpc_tapchannel_proto_init() { return nil } } - file_tapchannelrpc_tapchannel_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + file_tapchannelrpc_tapchannel_proto_msgTypes[5].Exporter = func(v any, i int) any { switch v := v.(*SendPaymentRequest); i { case 0: return &v.state @@ -1257,7 +1257,7 @@ func file_tapchannelrpc_tapchannel_proto_init() { return nil } } - file_tapchannelrpc_tapchannel_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { + file_tapchannelrpc_tapchannel_proto_msgTypes[6].Exporter = func(v any, i int) any { switch v := v.(*SendPaymentResponse); i { case 0: return &v.state @@ -1269,7 +1269,7 @@ func file_tapchannelrpc_tapchannel_proto_init() { return nil } } - file_tapchannelrpc_tapchannel_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { + file_tapchannelrpc_tapchannel_proto_msgTypes[7].Exporter = func(v any, i int) any { switch v := v.(*HodlInvoice); i { case 0: return &v.state @@ -1281,7 +1281,7 @@ func file_tapchannelrpc_tapchannel_proto_init() { return nil } } - file_tapchannelrpc_tapchannel_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { + file_tapchannelrpc_tapchannel_proto_msgTypes[8].Exporter = func(v any, i int) any { switch v := v.(*AddInvoiceRequest); i { case 0: return &v.state @@ -1293,7 +1293,7 @@ func file_tapchannelrpc_tapchannel_proto_init() { return nil } } - file_tapchannelrpc_tapchannel_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { + file_tapchannelrpc_tapchannel_proto_msgTypes[9].Exporter = func(v any, i int) any { switch v := v.(*AddInvoiceResponse); i { case 0: return &v.state @@ -1305,7 +1305,7 @@ func file_tapchannelrpc_tapchannel_proto_init() { return nil } } - file_tapchannelrpc_tapchannel_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { + file_tapchannelrpc_tapchannel_proto_msgTypes[10].Exporter = func(v any, i int) any { switch v := v.(*AssetPayReq); i { case 0: return &v.state @@ -1317,7 +1317,7 @@ func file_tapchannelrpc_tapchannel_proto_init() { return nil } } - file_tapchannelrpc_tapchannel_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { + file_tapchannelrpc_tapchannel_proto_msgTypes[11].Exporter = func(v any, i int) any { switch v := v.(*AssetPayReqResponse); i { case 0: return &v.state @@ -1330,10 +1330,10 @@ func file_tapchannelrpc_tapchannel_proto_init() { } } } - file_tapchannelrpc_tapchannel_proto_msgTypes[3].OneofWrappers = []interface{}{ + file_tapchannelrpc_tapchannel_proto_msgTypes[3].OneofWrappers = []any{ (*EncodeCustomRecordsRequest_RouterSendPayment)(nil), } - file_tapchannelrpc_tapchannel_proto_msgTypes[6].OneofWrappers = []interface{}{ + file_tapchannelrpc_tapchannel_proto_msgTypes[6].OneofWrappers = []any{ (*SendPaymentResponse_AcceptedSellOrder)(nil), (*SendPaymentResponse_PaymentResult)(nil), } diff --git a/taprpc/tapchannelrpc/tapchannel.pb.gw.go b/taprpc/tapchannelrpc/tapchannel.pb.gw.go index ca89998b19..620ca4ed41 100644 --- a/taprpc/tapchannelrpc/tapchannel.pb.gw.go +++ b/taprpc/tapchannelrpc/tapchannel.pb.gw.go @@ -35,11 +35,7 @@ func request_TaprootAssetChannels_FundChannel_0(ctx context.Context, marshaler r var protoReq FundChannelRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -52,11 +48,7 @@ func local_request_TaprootAssetChannels_FundChannel_0(ctx context.Context, marsh var protoReq FundChannelRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -69,11 +61,7 @@ func request_TaprootAssetChannels_EncodeCustomRecords_0(ctx context.Context, mar var protoReq EncodeCustomRecordsRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -86,11 +74,7 @@ func local_request_TaprootAssetChannels_EncodeCustomRecords_0(ctx context.Contex var protoReq EncodeCustomRecordsRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -103,11 +87,7 @@ func request_TaprootAssetChannels_SendPayment_0(ctx context.Context, marshaler r var protoReq SendPaymentRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -128,11 +108,7 @@ func request_TaprootAssetChannels_AddInvoice_0(ctx context.Context, marshaler ru var protoReq AddInvoiceRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -145,11 +121,7 @@ func local_request_TaprootAssetChannels_AddInvoice_0(ctx context.Context, marsha var protoReq AddInvoiceRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -162,11 +134,7 @@ func request_TaprootAssetChannels_DecodeAssetPayReq_0(ctx context.Context, marsh var protoReq AssetPayReq var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -179,11 +147,7 @@ func local_request_TaprootAssetChannels_DecodeAssetPayReq_0(ctx context.Context, var protoReq AssetPayReq var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -311,21 +275,21 @@ func RegisterTaprootAssetChannelsHandlerServer(ctx context.Context, mux *runtime // RegisterTaprootAssetChannelsHandlerFromEndpoint is same as RegisterTaprootAssetChannelsHandler but // automatically dials to "endpoint" and closes the connection when "ctx" gets done. func RegisterTaprootAssetChannelsHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) { - conn, err := grpc.DialContext(ctx, endpoint, opts...) + conn, err := grpc.NewClient(endpoint, opts...) if err != nil { return err } defer func() { if err != nil { if cerr := conn.Close(); cerr != nil { - grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr) + grpclog.Errorf("Failed to close conn to %s: %v", endpoint, cerr) } return } go func() { <-ctx.Done() if cerr := conn.Close(); cerr != nil { - grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr) + grpclog.Errorf("Failed to close conn to %s: %v", endpoint, cerr) } }() }() diff --git a/taprpc/tapdevrpc/tapdev.pb.go b/taprpc/tapdevrpc/tapdev.pb.go index e6a94278fa..516a96f5ee 100644 --- a/taprpc/tapdevrpc/tapdev.pb.go +++ b/taprpc/tapdevrpc/tapdev.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.33.0 +// protoc-gen-go v1.34.2 // protoc v3.21.12 // source: tapdevrpc/tapdev.proto @@ -733,7 +733,7 @@ func file_tapdevrpc_tapdev_proto_rawDescGZIP() []byte { var file_tapdevrpc_tapdev_proto_enumTypes = make([]protoimpl.EnumInfo, 1) var file_tapdevrpc_tapdev_proto_msgTypes = make([]protoimpl.MessageInfo, 9) -var file_tapdevrpc_tapdev_proto_goTypes = []interface{}{ +var file_tapdevrpc_tapdev_proto_goTypes = []any{ (ProofTransferType)(0), // 0: tapdevrpc.ProofTransferType (*ImportProofRequest)(nil), // 1: tapdevrpc.ImportProofRequest (*ImportProofResponse)(nil), // 2: tapdevrpc.ImportProofResponse @@ -772,7 +772,7 @@ func file_tapdevrpc_tapdev_proto_init() { return } if !protoimpl.UnsafeEnabled { - file_tapdevrpc_tapdev_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + file_tapdevrpc_tapdev_proto_msgTypes[0].Exporter = func(v any, i int) any { switch v := v.(*ImportProofRequest); i { case 0: return &v.state @@ -784,7 +784,7 @@ func file_tapdevrpc_tapdev_proto_init() { return nil } } - file_tapdevrpc_tapdev_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + file_tapdevrpc_tapdev_proto_msgTypes[1].Exporter = func(v any, i int) any { switch v := v.(*ImportProofResponse); i { case 0: return &v.state @@ -796,7 +796,7 @@ func file_tapdevrpc_tapdev_proto_init() { return nil } } - file_tapdevrpc_tapdev_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + file_tapdevrpc_tapdev_proto_msgTypes[2].Exporter = func(v any, i int) any { switch v := v.(*SubscribeSendAssetEventNtfnsRequest); i { case 0: return &v.state @@ -808,7 +808,7 @@ func file_tapdevrpc_tapdev_proto_init() { return nil } } - file_tapdevrpc_tapdev_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + file_tapdevrpc_tapdev_proto_msgTypes[3].Exporter = func(v any, i int) any { switch v := v.(*SendAssetEvent); i { case 0: return &v.state @@ -820,7 +820,7 @@ func file_tapdevrpc_tapdev_proto_init() { return nil } } - file_tapdevrpc_tapdev_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + file_tapdevrpc_tapdev_proto_msgTypes[4].Exporter = func(v any, i int) any { switch v := v.(*ExecuteSendStateEvent); i { case 0: return &v.state @@ -832,7 +832,7 @@ func file_tapdevrpc_tapdev_proto_init() { return nil } } - file_tapdevrpc_tapdev_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + file_tapdevrpc_tapdev_proto_msgTypes[5].Exporter = func(v any, i int) any { switch v := v.(*ProofTransferBackoffWaitEvent); i { case 0: return &v.state @@ -844,7 +844,7 @@ func file_tapdevrpc_tapdev_proto_init() { return nil } } - file_tapdevrpc_tapdev_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { + file_tapdevrpc_tapdev_proto_msgTypes[6].Exporter = func(v any, i int) any { switch v := v.(*SubscribeReceiveAssetEventNtfnsRequest); i { case 0: return &v.state @@ -856,7 +856,7 @@ func file_tapdevrpc_tapdev_proto_init() { return nil } } - file_tapdevrpc_tapdev_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { + file_tapdevrpc_tapdev_proto_msgTypes[7].Exporter = func(v any, i int) any { switch v := v.(*AssetReceiveCompleteEvent); i { case 0: return &v.state @@ -868,7 +868,7 @@ func file_tapdevrpc_tapdev_proto_init() { return nil } } - file_tapdevrpc_tapdev_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { + file_tapdevrpc_tapdev_proto_msgTypes[8].Exporter = func(v any, i int) any { switch v := v.(*ReceiveAssetEvent); i { case 0: return &v.state @@ -881,11 +881,11 @@ func file_tapdevrpc_tapdev_proto_init() { } } } - file_tapdevrpc_tapdev_proto_msgTypes[3].OneofWrappers = []interface{}{ + file_tapdevrpc_tapdev_proto_msgTypes[3].OneofWrappers = []any{ (*SendAssetEvent_ExecuteSendStateEvent)(nil), (*SendAssetEvent_ProofTransferBackoffWaitEvent)(nil), } - file_tapdevrpc_tapdev_proto_msgTypes[8].OneofWrappers = []interface{}{ + file_tapdevrpc_tapdev_proto_msgTypes[8].OneofWrappers = []any{ (*ReceiveAssetEvent_ProofTransferBackoffWaitEvent)(nil), (*ReceiveAssetEvent_AssetReceiveCompleteEvent)(nil), } diff --git a/taprpc/taprootassets.pb.go b/taprpc/taprootassets.pb.go index 939909ca85..59f8792e48 100644 --- a/taprpc/taprootassets.pb.go +++ b/taprpc/taprootassets.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.33.0 +// protoc-gen-go v1.34.2 // protoc v3.21.12 // source: taprootassets.proto @@ -334,6 +334,85 @@ func (AddrVersion) EnumDescriptor() ([]byte, []int) { return file_taprootassets_proto_rawDescGZIP(), []int{5} } +type ScriptKeyType int32 + +const ( + // The type of script key is not known. This should only be stored for assets + // where we don't know the internal key of the script key (e.g. for + // imported proofs). + ScriptKeyType_SCRIPT_KEY_UNKNOWN ScriptKeyType = 0 + // The script key is a normal BIP-86 key. This means that the internal key is + // turned into a Taproot output key by applying a BIP-86 tweak to it. + ScriptKeyType_SCRIPT_KEY_BIP86 ScriptKeyType = 1 + // The script key is a key that contains a script path that is defined by the + // user and is therefore external to the tapd wallet. Spending this key + // requires providing a specific witness and must be signed through the vPSBT + // signing flow. + ScriptKeyType_SCRIPT_KEY_SCRIPT_PATH_EXTERNAL ScriptKeyType = 2 + // The script key is a specific un-spendable key that indicates a burnt asset. + // Assets with this key type can never be spent again, as a burn key is a + // tweaked NUMS key that nobody knows the private key for. + ScriptKeyType_SCRIPT_KEY_BURN ScriptKeyType = 3 + // The script key is a specific un-spendable key that indicates a tombstone + // output. This is only the case for zero-value assets that result from a + // non-interactive (TAP address) send where no change was left over. + ScriptKeyType_SCRIPT_KEY_TOMBSTONE ScriptKeyType = 4 + // The script key is used for an asset that resides within a Taproot Asset + // Channel. That means the script key is either a funding key (OP_TRUE), a + // commitment output key (to_local, to_remote, htlc), or a HTLC second-level + // transaction output key. Keys related to channels are not shown in asset + // balances (unless specifically requested) and are never used for coin + // selection. + ScriptKeyType_SCRIPT_KEY_CHANNEL ScriptKeyType = 5 +) + +// Enum value maps for ScriptKeyType. +var ( + ScriptKeyType_name = map[int32]string{ + 0: "SCRIPT_KEY_UNKNOWN", + 1: "SCRIPT_KEY_BIP86", + 2: "SCRIPT_KEY_SCRIPT_PATH_EXTERNAL", + 3: "SCRIPT_KEY_BURN", + 4: "SCRIPT_KEY_TOMBSTONE", + 5: "SCRIPT_KEY_CHANNEL", + } + ScriptKeyType_value = map[string]int32{ + "SCRIPT_KEY_UNKNOWN": 0, + "SCRIPT_KEY_BIP86": 1, + "SCRIPT_KEY_SCRIPT_PATH_EXTERNAL": 2, + "SCRIPT_KEY_BURN": 3, + "SCRIPT_KEY_TOMBSTONE": 4, + "SCRIPT_KEY_CHANNEL": 5, + } +) + +func (x ScriptKeyType) Enum() *ScriptKeyType { + p := new(ScriptKeyType) + *p = x + return p +} + +func (x ScriptKeyType) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (ScriptKeyType) Descriptor() protoreflect.EnumDescriptor { + return file_taprootassets_proto_enumTypes[6].Descriptor() +} + +func (ScriptKeyType) Type() protoreflect.EnumType { + return &file_taprootassets_proto_enumTypes[6] +} + +func (x ScriptKeyType) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use ScriptKeyType.Descriptor instead. +func (ScriptKeyType) EnumDescriptor() ([]byte, []int) { + return file_taprootassets_proto_rawDescGZIP(), []int{6} +} + type AddrEventStatus int32 const ( @@ -373,11 +452,11 @@ func (x AddrEventStatus) String() string { } func (AddrEventStatus) Descriptor() protoreflect.EnumDescriptor { - return file_taprootassets_proto_enumTypes[6].Descriptor() + return file_taprootassets_proto_enumTypes[7].Descriptor() } func (AddrEventStatus) Type() protoreflect.EnumType { - return &file_taprootassets_proto_enumTypes[6] + return &file_taprootassets_proto_enumTypes[7] } func (x AddrEventStatus) Number() protoreflect.EnumNumber { @@ -386,7 +465,7 @@ func (x AddrEventStatus) Number() protoreflect.EnumNumber { // Deprecated: Use AddrEventStatus.Descriptor instead. func (AddrEventStatus) EnumDescriptor() ([]byte, []int) { - return file_taprootassets_proto_rawDescGZIP(), []int{6} + return file_taprootassets_proto_rawDescGZIP(), []int{7} } type SendState int32 @@ -456,11 +535,11 @@ func (x SendState) String() string { } func (SendState) Descriptor() protoreflect.EnumDescriptor { - return file_taprootassets_proto_enumTypes[7].Descriptor() + return file_taprootassets_proto_enumTypes[8].Descriptor() } func (SendState) Type() protoreflect.EnumType { - return &file_taprootassets_proto_enumTypes[7] + return &file_taprootassets_proto_enumTypes[8] } func (x SendState) Number() protoreflect.EnumNumber { @@ -469,7 +548,7 @@ func (x SendState) Number() protoreflect.EnumNumber { // Deprecated: Use SendState.Descriptor instead. func (SendState) EnumDescriptor() ([]byte, []int) { - return file_taprootassets_proto_rawDescGZIP(), []int{7} + return file_taprootassets_proto_rawDescGZIP(), []int{8} } type ParcelType int32 @@ -519,11 +598,11 @@ func (x ParcelType) String() string { } func (ParcelType) Descriptor() protoreflect.EnumDescriptor { - return file_taprootassets_proto_enumTypes[8].Descriptor() + return file_taprootassets_proto_enumTypes[9].Descriptor() } func (ParcelType) Type() protoreflect.EnumType { - return &file_taprootassets_proto_enumTypes[8] + return &file_taprootassets_proto_enumTypes[9] } func (x ParcelType) Number() protoreflect.EnumNumber { @@ -532,7 +611,7 @@ func (x ParcelType) Number() protoreflect.EnumNumber { // Deprecated: Use ParcelType.Descriptor instead. func (ParcelType) EnumDescriptor() ([]byte, []int) { - return file_taprootassets_proto_rawDescGZIP(), []int{8} + return file_taprootassets_proto_rawDescGZIP(), []int{9} } type AssetMeta struct { @@ -628,6 +707,13 @@ type ListAssetRequest struct { ScriptKey *ScriptKey `protobuf:"bytes,8,opt,name=script_key,json=scriptKey,proto3" json:"script_key,omitempty"` // Return all assets that are currently anchored on this outpoint. AnchorOutpoint *OutPoint `protobuf:"bytes,9,opt,name=anchor_outpoint,json=anchorOutpoint,proto3" json:"anchor_outpoint,omitempty"` + // The script key type to filter the assets by. If not set, only assets with + // a BIP-0086 script key will be returned (which is the equivalent of + // setting script_key_type.explicit_type = SCRIPT_KEY_BIP86). If the type + // is set to SCRIPT_KEY_BURN or SCRIPT_KEY_TOMBSTONE the include_spent flag + // will automatically be set to true, because assets of that type are always + // marked as spent. + ScriptKeyType *ScriptKeyTypeQuery `protobuf:"bytes,10,opt,name=script_key_type,json=scriptKeyType,proto3" json:"script_key_type,omitempty"` } func (x *ListAssetRequest) Reset() { @@ -725,6 +811,13 @@ func (x *ListAssetRequest) GetAnchorOutpoint() *OutPoint { return nil } +func (x *ListAssetRequest) GetScriptKeyType() *ScriptKeyTypeQuery { + if x != nil { + return x.ScriptKeyType + } + return nil +} + type AnchorInfo struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1582,6 +1675,7 @@ type Asset struct { // Indicates whether this transfer was an asset burn. If true, the number of // assets in this output are destroyed and can no longer be spent. IsBurn bool `protobuf:"varint,17,opt,name=is_burn,json=isBurn,proto3" json:"is_burn,omitempty"` + // Deprecated, use script_key_type instead! // Indicates whether this script key has either been derived by the local // wallet or was explicitly declared to be known by using the // DeclareScriptKey RPC. Knowing the key conceptually means the key belongs @@ -1591,6 +1685,7 @@ type Asset struct { // this method returns true for a script key, it means the asset with the // script key will be shown in the wallet balance. ScriptKeyDeclaredKnown bool `protobuf:"varint,18,opt,name=script_key_declared_known,json=scriptKeyDeclaredKnown,proto3" json:"script_key_declared_known,omitempty"` + // Deprecated, use script_key_type instead! // Indicates whether the script key is known to have a Tapscript spend path, // meaning that the Taproot merkle root tweak is not empty. This will only // ever be true if either script_key_is_local or script_key_internals_known @@ -1602,6 +1697,11 @@ type Asset struct { // field is null, it means the presence of a decimal display field is // unknown in the current context. DecimalDisplay *DecimalDisplay `protobuf:"bytes,20,opt,name=decimal_display,json=decimalDisplay,proto3" json:"decimal_display,omitempty"` + // The type of the script key. This type is either user-declared when custom + // script keys are added, or automatically determined by the daemon for + // standard operations (e.g. BIP-86 keys, burn keys, tombstone keys, channel + // related keys). + ScriptKeyType ScriptKeyType `protobuf:"varint,21,opt,name=script_key_type,json=scriptKeyType,proto3,enum=taprpc.ScriptKeyType" json:"script_key_type,omitempty"` } func (x *Asset) Reset() { @@ -1762,6 +1862,13 @@ func (x *Asset) GetDecimalDisplay() *DecimalDisplay { return nil } +func (x *Asset) GetScriptKeyType() ScriptKeyType { + if x != nil { + return x.ScriptKeyType + } + return ScriptKeyType_SCRIPT_KEY_UNKNOWN +} + type PrevWitness struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1946,6 +2053,10 @@ type ListUtxosRequest struct { unknownFields protoimpl.UnknownFields IncludeLeased bool `protobuf:"varint,1,opt,name=include_leased,json=includeLeased,proto3" json:"include_leased,omitempty"` + // The script key type to filter the assets by. If not set, only assets with + // a BIP-0086 script key will be returned (which is the equivalent of + // setting script_key_type.explicit_type = SCRIPT_KEY_BIP86). + ScriptKeyType *ScriptKeyTypeQuery `protobuf:"bytes,2,opt,name=script_key_type,json=scriptKeyType,proto3" json:"script_key_type,omitempty"` } func (x *ListUtxosRequest) Reset() { @@ -1987,6 +2098,13 @@ func (x *ListUtxosRequest) GetIncludeLeased() bool { return false } +func (x *ListUtxosRequest) GetScriptKeyType() *ScriptKeyTypeQuery { + if x != nil { + return x.ScriptKeyType + } + return nil +} + type ManagedUtxo struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -2413,6 +2531,13 @@ type ListBalancesRequest struct { GroupKeyFilter []byte `protobuf:"bytes,4,opt,name=group_key_filter,json=groupKeyFilter,proto3" json:"group_key_filter,omitempty"` // An option to include previous leased assets in the balances. IncludeLeased bool `protobuf:"varint,5,opt,name=include_leased,json=includeLeased,proto3" json:"include_leased,omitempty"` + // The script key type to filter the assets by. If not set, only assets with + // a BIP-0086 script key will be returned (which is the equivalent of + // setting script_key_type.explicit_type = SCRIPT_KEY_BIP86). If the type + // is set to SCRIPT_KEY_BURN or SCRIPT_KEY_TOMBSTONE the include_spent flag + // will automatically be set to true, because assets of that type are always + // marked as spent. + ScriptKeyType *ScriptKeyTypeQuery `protobuf:"bytes,6,opt,name=script_key_type,json=scriptKeyType,proto3" json:"script_key_type,omitempty"` } func (x *ListBalancesRequest) Reset() { @@ -2489,6 +2614,13 @@ func (x *ListBalancesRequest) GetIncludeLeased() bool { return false } +func (x *ListBalancesRequest) GetScriptKeyType() *ScriptKeyTypeQuery { + if x != nil { + return x.ScriptKeyType + } + return nil +} + type isListBalancesRequest_GroupBy interface { isListBalancesRequest_GroupBy() } @@ -3868,6 +4000,89 @@ func (x *NewAddrRequest) GetAddressVersion() AddrVersion { return AddrVersion_ADDR_VERSION_UNSPECIFIED } +type ScriptKeyTypeQuery struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Types that are assignable to Type: + // + // *ScriptKeyTypeQuery_ExplicitType + // *ScriptKeyTypeQuery_AllTypes + Type isScriptKeyTypeQuery_Type `protobuf_oneof:"type"` +} + +func (x *ScriptKeyTypeQuery) Reset() { + *x = ScriptKeyTypeQuery{} + if protoimpl.UnsafeEnabled { + mi := &file_taprootassets_proto_msgTypes[43] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ScriptKeyTypeQuery) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ScriptKeyTypeQuery) ProtoMessage() {} + +func (x *ScriptKeyTypeQuery) ProtoReflect() protoreflect.Message { + mi := &file_taprootassets_proto_msgTypes[43] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ScriptKeyTypeQuery.ProtoReflect.Descriptor instead. +func (*ScriptKeyTypeQuery) Descriptor() ([]byte, []int) { + return file_taprootassets_proto_rawDescGZIP(), []int{43} +} + +func (m *ScriptKeyTypeQuery) GetType() isScriptKeyTypeQuery_Type { + if m != nil { + return m.Type + } + return nil +} + +func (x *ScriptKeyTypeQuery) GetExplicitType() ScriptKeyType { + if x, ok := x.GetType().(*ScriptKeyTypeQuery_ExplicitType); ok { + return x.ExplicitType + } + return ScriptKeyType_SCRIPT_KEY_UNKNOWN +} + +func (x *ScriptKeyTypeQuery) GetAllTypes() bool { + if x, ok := x.GetType().(*ScriptKeyTypeQuery_AllTypes); ok { + return x.AllTypes + } + return false +} + +type isScriptKeyTypeQuery_Type interface { + isScriptKeyTypeQuery_Type() +} + +type ScriptKeyTypeQuery_ExplicitType struct { + // Query for assets of a specific script key type. + ExplicitType ScriptKeyType `protobuf:"varint,1,opt,name=explicit_type,json=explicitType,proto3,enum=taprpc.ScriptKeyType,oneof"` +} + +type ScriptKeyTypeQuery_AllTypes struct { + // Query for assets with all script key types. + AllTypes bool `protobuf:"varint,2,opt,name=all_types,json=allTypes,proto3,oneof"` +} + +func (*ScriptKeyTypeQuery_ExplicitType) isScriptKeyTypeQuery_Type() {} + +func (*ScriptKeyTypeQuery_AllTypes) isScriptKeyTypeQuery_Type() {} + type ScriptKey struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -3882,12 +4097,17 @@ type ScriptKey struct { // The optional Taproot tweak to apply to the above internal key. If this is // empty then a BIP-86 style tweak is applied to the internal key. TapTweak []byte `protobuf:"bytes,3,opt,name=tap_tweak,json=tapTweak,proto3" json:"tap_tweak,omitempty"` + // The type of the script key. This type is either user-declared when custom + // script keys are added, or automatically determined by the daemon for + // standard operations (e.g. BIP-86 keys, burn keys, tombstone keys, channel + // related keys). + Type ScriptKeyType `protobuf:"varint,4,opt,name=type,proto3,enum=taprpc.ScriptKeyType" json:"type,omitempty"` } func (x *ScriptKey) Reset() { *x = ScriptKey{} if protoimpl.UnsafeEnabled { - mi := &file_taprootassets_proto_msgTypes[43] + mi := &file_taprootassets_proto_msgTypes[44] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3900,7 +4120,7 @@ func (x *ScriptKey) String() string { func (*ScriptKey) ProtoMessage() {} func (x *ScriptKey) ProtoReflect() protoreflect.Message { - mi := &file_taprootassets_proto_msgTypes[43] + mi := &file_taprootassets_proto_msgTypes[44] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3913,7 +4133,7 @@ func (x *ScriptKey) ProtoReflect() protoreflect.Message { // Deprecated: Use ScriptKey.ProtoReflect.Descriptor instead. func (*ScriptKey) Descriptor() ([]byte, []int) { - return file_taprootassets_proto_rawDescGZIP(), []int{43} + return file_taprootassets_proto_rawDescGZIP(), []int{44} } func (x *ScriptKey) GetPubKey() []byte { @@ -3937,6 +4157,13 @@ func (x *ScriptKey) GetTapTweak() []byte { return nil } +func (x *ScriptKey) GetType() ScriptKeyType { + if x != nil { + return x.Type + } + return ScriptKeyType_SCRIPT_KEY_UNKNOWN +} + type KeyLocator struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -3951,7 +4178,7 @@ type KeyLocator struct { func (x *KeyLocator) Reset() { *x = KeyLocator{} if protoimpl.UnsafeEnabled { - mi := &file_taprootassets_proto_msgTypes[44] + mi := &file_taprootassets_proto_msgTypes[45] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3964,7 +4191,7 @@ func (x *KeyLocator) String() string { func (*KeyLocator) ProtoMessage() {} func (x *KeyLocator) ProtoReflect() protoreflect.Message { - mi := &file_taprootassets_proto_msgTypes[44] + mi := &file_taprootassets_proto_msgTypes[45] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3977,7 +4204,7 @@ func (x *KeyLocator) ProtoReflect() protoreflect.Message { // Deprecated: Use KeyLocator.ProtoReflect.Descriptor instead. func (*KeyLocator) Descriptor() ([]byte, []int) { - return file_taprootassets_proto_rawDescGZIP(), []int{44} + return file_taprootassets_proto_rawDescGZIP(), []int{45} } func (x *KeyLocator) GetKeyFamily() int32 { @@ -4008,7 +4235,7 @@ type KeyDescriptor struct { func (x *KeyDescriptor) Reset() { *x = KeyDescriptor{} if protoimpl.UnsafeEnabled { - mi := &file_taprootassets_proto_msgTypes[45] + mi := &file_taprootassets_proto_msgTypes[46] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4021,7 +4248,7 @@ func (x *KeyDescriptor) String() string { func (*KeyDescriptor) ProtoMessage() {} func (x *KeyDescriptor) ProtoReflect() protoreflect.Message { - mi := &file_taprootassets_proto_msgTypes[45] + mi := &file_taprootassets_proto_msgTypes[46] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4034,7 +4261,7 @@ func (x *KeyDescriptor) ProtoReflect() protoreflect.Message { // Deprecated: Use KeyDescriptor.ProtoReflect.Descriptor instead. func (*KeyDescriptor) Descriptor() ([]byte, []int) { - return file_taprootassets_proto_rawDescGZIP(), []int{45} + return file_taprootassets_proto_rawDescGZIP(), []int{46} } func (x *KeyDescriptor) GetRawKeyBytes() []byte { @@ -4063,7 +4290,7 @@ type TapscriptFullTree struct { func (x *TapscriptFullTree) Reset() { *x = TapscriptFullTree{} if protoimpl.UnsafeEnabled { - mi := &file_taprootassets_proto_msgTypes[46] + mi := &file_taprootassets_proto_msgTypes[47] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4076,7 +4303,7 @@ func (x *TapscriptFullTree) String() string { func (*TapscriptFullTree) ProtoMessage() {} func (x *TapscriptFullTree) ProtoReflect() protoreflect.Message { - mi := &file_taprootassets_proto_msgTypes[46] + mi := &file_taprootassets_proto_msgTypes[47] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4089,7 +4316,7 @@ func (x *TapscriptFullTree) ProtoReflect() protoreflect.Message { // Deprecated: Use TapscriptFullTree.ProtoReflect.Descriptor instead. func (*TapscriptFullTree) Descriptor() ([]byte, []int) { - return file_taprootassets_proto_rawDescGZIP(), []int{46} + return file_taprootassets_proto_rawDescGZIP(), []int{47} } func (x *TapscriptFullTree) GetAllLeaves() []*TapLeaf { @@ -4111,7 +4338,7 @@ type TapLeaf struct { func (x *TapLeaf) Reset() { *x = TapLeaf{} if protoimpl.UnsafeEnabled { - mi := &file_taprootassets_proto_msgTypes[47] + mi := &file_taprootassets_proto_msgTypes[48] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4124,7 +4351,7 @@ func (x *TapLeaf) String() string { func (*TapLeaf) ProtoMessage() {} func (x *TapLeaf) ProtoReflect() protoreflect.Message { - mi := &file_taprootassets_proto_msgTypes[47] + mi := &file_taprootassets_proto_msgTypes[48] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4137,7 +4364,7 @@ func (x *TapLeaf) ProtoReflect() protoreflect.Message { // Deprecated: Use TapLeaf.ProtoReflect.Descriptor instead. func (*TapLeaf) Descriptor() ([]byte, []int) { - return file_taprootassets_proto_rawDescGZIP(), []int{47} + return file_taprootassets_proto_rawDescGZIP(), []int{48} } func (x *TapLeaf) GetScript() []byte { @@ -4161,7 +4388,7 @@ type TapBranch struct { func (x *TapBranch) Reset() { *x = TapBranch{} if protoimpl.UnsafeEnabled { - mi := &file_taprootassets_proto_msgTypes[48] + mi := &file_taprootassets_proto_msgTypes[49] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4174,7 +4401,7 @@ func (x *TapBranch) String() string { func (*TapBranch) ProtoMessage() {} func (x *TapBranch) ProtoReflect() protoreflect.Message { - mi := &file_taprootassets_proto_msgTypes[48] + mi := &file_taprootassets_proto_msgTypes[49] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4187,7 +4414,7 @@ func (x *TapBranch) ProtoReflect() protoreflect.Message { // Deprecated: Use TapBranch.ProtoReflect.Descriptor instead. func (*TapBranch) Descriptor() ([]byte, []int) { - return file_taprootassets_proto_rawDescGZIP(), []int{48} + return file_taprootassets_proto_rawDescGZIP(), []int{49} } func (x *TapBranch) GetLeftTaphash() []byte { @@ -4215,7 +4442,7 @@ type DecodeAddrRequest struct { func (x *DecodeAddrRequest) Reset() { *x = DecodeAddrRequest{} if protoimpl.UnsafeEnabled { - mi := &file_taprootassets_proto_msgTypes[49] + mi := &file_taprootassets_proto_msgTypes[50] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4228,7 +4455,7 @@ func (x *DecodeAddrRequest) String() string { func (*DecodeAddrRequest) ProtoMessage() {} func (x *DecodeAddrRequest) ProtoReflect() protoreflect.Message { - mi := &file_taprootassets_proto_msgTypes[49] + mi := &file_taprootassets_proto_msgTypes[50] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4241,7 +4468,7 @@ func (x *DecodeAddrRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use DecodeAddrRequest.ProtoReflect.Descriptor instead. func (*DecodeAddrRequest) Descriptor() ([]byte, []int) { - return file_taprootassets_proto_rawDescGZIP(), []int{49} + return file_taprootassets_proto_rawDescGZIP(), []int{50} } func (x *DecodeAddrRequest) GetAddr() string { @@ -4265,7 +4492,7 @@ type ProofFile struct { func (x *ProofFile) Reset() { *x = ProofFile{} if protoimpl.UnsafeEnabled { - mi := &file_taprootassets_proto_msgTypes[50] + mi := &file_taprootassets_proto_msgTypes[51] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4278,7 +4505,7 @@ func (x *ProofFile) String() string { func (*ProofFile) ProtoMessage() {} func (x *ProofFile) ProtoReflect() protoreflect.Message { - mi := &file_taprootassets_proto_msgTypes[50] + mi := &file_taprootassets_proto_msgTypes[51] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4291,7 +4518,7 @@ func (x *ProofFile) ProtoReflect() protoreflect.Message { // Deprecated: Use ProofFile.ProtoReflect.Descriptor instead. func (*ProofFile) Descriptor() ([]byte, []int) { - return file_taprootassets_proto_rawDescGZIP(), []int{50} + return file_taprootassets_proto_rawDescGZIP(), []int{51} } func (x *ProofFile) GetRawProofFile() []byte { @@ -4366,7 +4593,7 @@ type DecodedProof struct { func (x *DecodedProof) Reset() { *x = DecodedProof{} if protoimpl.UnsafeEnabled { - mi := &file_taprootassets_proto_msgTypes[51] + mi := &file_taprootassets_proto_msgTypes[52] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4379,7 +4606,7 @@ func (x *DecodedProof) String() string { func (*DecodedProof) ProtoMessage() {} func (x *DecodedProof) ProtoReflect() protoreflect.Message { - mi := &file_taprootassets_proto_msgTypes[51] + mi := &file_taprootassets_proto_msgTypes[52] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4392,7 +4619,7 @@ func (x *DecodedProof) ProtoReflect() protoreflect.Message { // Deprecated: Use DecodedProof.ProtoReflect.Descriptor instead. func (*DecodedProof) Descriptor() ([]byte, []int) { - return file_taprootassets_proto_rawDescGZIP(), []int{51} + return file_taprootassets_proto_rawDescGZIP(), []int{52} } func (x *DecodedProof) GetProofAtDepth() uint32 { @@ -4506,7 +4733,7 @@ type VerifyProofResponse struct { func (x *VerifyProofResponse) Reset() { *x = VerifyProofResponse{} if protoimpl.UnsafeEnabled { - mi := &file_taprootassets_proto_msgTypes[52] + mi := &file_taprootassets_proto_msgTypes[53] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4519,7 +4746,7 @@ func (x *VerifyProofResponse) String() string { func (*VerifyProofResponse) ProtoMessage() {} func (x *VerifyProofResponse) ProtoReflect() protoreflect.Message { - mi := &file_taprootassets_proto_msgTypes[52] + mi := &file_taprootassets_proto_msgTypes[53] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4532,7 +4759,7 @@ func (x *VerifyProofResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use VerifyProofResponse.ProtoReflect.Descriptor instead. func (*VerifyProofResponse) Descriptor() ([]byte, []int) { - return file_taprootassets_proto_rawDescGZIP(), []int{52} + return file_taprootassets_proto_rawDescGZIP(), []int{53} } func (x *VerifyProofResponse) GetValid() bool { @@ -4572,7 +4799,7 @@ type DecodeProofRequest struct { func (x *DecodeProofRequest) Reset() { *x = DecodeProofRequest{} if protoimpl.UnsafeEnabled { - mi := &file_taprootassets_proto_msgTypes[53] + mi := &file_taprootassets_proto_msgTypes[54] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4585,7 +4812,7 @@ func (x *DecodeProofRequest) String() string { func (*DecodeProofRequest) ProtoMessage() {} func (x *DecodeProofRequest) ProtoReflect() protoreflect.Message { - mi := &file_taprootassets_proto_msgTypes[53] + mi := &file_taprootassets_proto_msgTypes[54] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4598,7 +4825,7 @@ func (x *DecodeProofRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use DecodeProofRequest.ProtoReflect.Descriptor instead. func (*DecodeProofRequest) Descriptor() ([]byte, []int) { - return file_taprootassets_proto_rawDescGZIP(), []int{53} + return file_taprootassets_proto_rawDescGZIP(), []int{54} } func (x *DecodeProofRequest) GetRawProof() []byte { @@ -4640,7 +4867,7 @@ type DecodeProofResponse struct { func (x *DecodeProofResponse) Reset() { *x = DecodeProofResponse{} if protoimpl.UnsafeEnabled { - mi := &file_taprootassets_proto_msgTypes[54] + mi := &file_taprootassets_proto_msgTypes[55] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4653,7 +4880,7 @@ func (x *DecodeProofResponse) String() string { func (*DecodeProofResponse) ProtoMessage() {} func (x *DecodeProofResponse) ProtoReflect() protoreflect.Message { - mi := &file_taprootassets_proto_msgTypes[54] + mi := &file_taprootassets_proto_msgTypes[55] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4666,7 +4893,7 @@ func (x *DecodeProofResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use DecodeProofResponse.ProtoReflect.Descriptor instead. func (*DecodeProofResponse) Descriptor() ([]byte, []int) { - return file_taprootassets_proto_rawDescGZIP(), []int{54} + return file_taprootassets_proto_rawDescGZIP(), []int{55} } func (x *DecodeProofResponse) GetDecodedProof() *DecodedProof { @@ -4689,7 +4916,7 @@ type ExportProofRequest struct { func (x *ExportProofRequest) Reset() { *x = ExportProofRequest{} if protoimpl.UnsafeEnabled { - mi := &file_taprootassets_proto_msgTypes[55] + mi := &file_taprootassets_proto_msgTypes[56] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4702,7 +4929,7 @@ func (x *ExportProofRequest) String() string { func (*ExportProofRequest) ProtoMessage() {} func (x *ExportProofRequest) ProtoReflect() protoreflect.Message { - mi := &file_taprootassets_proto_msgTypes[55] + mi := &file_taprootassets_proto_msgTypes[56] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4715,7 +4942,7 @@ func (x *ExportProofRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ExportProofRequest.ProtoReflect.Descriptor instead. func (*ExportProofRequest) Descriptor() ([]byte, []int) { - return file_taprootassets_proto_rawDescGZIP(), []int{55} + return file_taprootassets_proto_rawDescGZIP(), []int{56} } func (x *ExportProofRequest) GetAssetId() []byte { @@ -4752,7 +4979,7 @@ type UnpackProofFileRequest struct { func (x *UnpackProofFileRequest) Reset() { *x = UnpackProofFileRequest{} if protoimpl.UnsafeEnabled { - mi := &file_taprootassets_proto_msgTypes[56] + mi := &file_taprootassets_proto_msgTypes[57] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4765,7 +4992,7 @@ func (x *UnpackProofFileRequest) String() string { func (*UnpackProofFileRequest) ProtoMessage() {} func (x *UnpackProofFileRequest) ProtoReflect() protoreflect.Message { - mi := &file_taprootassets_proto_msgTypes[56] + mi := &file_taprootassets_proto_msgTypes[57] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4778,7 +5005,7 @@ func (x *UnpackProofFileRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use UnpackProofFileRequest.ProtoReflect.Descriptor instead. func (*UnpackProofFileRequest) Descriptor() ([]byte, []int) { - return file_taprootassets_proto_rawDescGZIP(), []int{56} + return file_taprootassets_proto_rawDescGZIP(), []int{57} } func (x *UnpackProofFileRequest) GetRawProofFile() []byte { @@ -4802,7 +5029,7 @@ type UnpackProofFileResponse struct { func (x *UnpackProofFileResponse) Reset() { *x = UnpackProofFileResponse{} if protoimpl.UnsafeEnabled { - mi := &file_taprootassets_proto_msgTypes[57] + mi := &file_taprootassets_proto_msgTypes[58] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4815,7 +5042,7 @@ func (x *UnpackProofFileResponse) String() string { func (*UnpackProofFileResponse) ProtoMessage() {} func (x *UnpackProofFileResponse) ProtoReflect() protoreflect.Message { - mi := &file_taprootassets_proto_msgTypes[57] + mi := &file_taprootassets_proto_msgTypes[58] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4828,7 +5055,7 @@ func (x *UnpackProofFileResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use UnpackProofFileResponse.ProtoReflect.Descriptor instead. func (*UnpackProofFileResponse) Descriptor() ([]byte, []int) { - return file_taprootassets_proto_rawDescGZIP(), []int{57} + return file_taprootassets_proto_rawDescGZIP(), []int{58} } func (x *UnpackProofFileResponse) GetRawProofs() [][]byte { @@ -4868,7 +5095,7 @@ type AddrEvent struct { func (x *AddrEvent) Reset() { *x = AddrEvent{} if protoimpl.UnsafeEnabled { - mi := &file_taprootassets_proto_msgTypes[58] + mi := &file_taprootassets_proto_msgTypes[59] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4881,7 +5108,7 @@ func (x *AddrEvent) String() string { func (*AddrEvent) ProtoMessage() {} func (x *AddrEvent) ProtoReflect() protoreflect.Message { - mi := &file_taprootassets_proto_msgTypes[58] + mi := &file_taprootassets_proto_msgTypes[59] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4894,7 +5121,7 @@ func (x *AddrEvent) ProtoReflect() protoreflect.Message { // Deprecated: Use AddrEvent.ProtoReflect.Descriptor instead. func (*AddrEvent) Descriptor() ([]byte, []int) { - return file_taprootassets_proto_rawDescGZIP(), []int{58} + return file_taprootassets_proto_rawDescGZIP(), []int{59} } func (x *AddrEvent) GetCreationTimeUnixSeconds() uint64 { @@ -4967,7 +5194,7 @@ type AddrReceivesRequest struct { func (x *AddrReceivesRequest) Reset() { *x = AddrReceivesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_taprootassets_proto_msgTypes[59] + mi := &file_taprootassets_proto_msgTypes[60] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4980,7 +5207,7 @@ func (x *AddrReceivesRequest) String() string { func (*AddrReceivesRequest) ProtoMessage() {} func (x *AddrReceivesRequest) ProtoReflect() protoreflect.Message { - mi := &file_taprootassets_proto_msgTypes[59] + mi := &file_taprootassets_proto_msgTypes[60] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4993,7 +5220,7 @@ func (x *AddrReceivesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use AddrReceivesRequest.ProtoReflect.Descriptor instead. func (*AddrReceivesRequest) Descriptor() ([]byte, []int) { - return file_taprootassets_proto_rawDescGZIP(), []int{59} + return file_taprootassets_proto_rawDescGZIP(), []int{60} } func (x *AddrReceivesRequest) GetFilterAddr() string { @@ -5022,7 +5249,7 @@ type AddrReceivesResponse struct { func (x *AddrReceivesResponse) Reset() { *x = AddrReceivesResponse{} if protoimpl.UnsafeEnabled { - mi := &file_taprootassets_proto_msgTypes[60] + mi := &file_taprootassets_proto_msgTypes[61] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5035,7 +5262,7 @@ func (x *AddrReceivesResponse) String() string { func (*AddrReceivesResponse) ProtoMessage() {} func (x *AddrReceivesResponse) ProtoReflect() protoreflect.Message { - mi := &file_taprootassets_proto_msgTypes[60] + mi := &file_taprootassets_proto_msgTypes[61] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5048,7 +5275,7 @@ func (x *AddrReceivesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use AddrReceivesResponse.ProtoReflect.Descriptor instead. func (*AddrReceivesResponse) Descriptor() ([]byte, []int) { - return file_taprootassets_proto_rawDescGZIP(), []int{60} + return file_taprootassets_proto_rawDescGZIP(), []int{61} } func (x *AddrReceivesResponse) GetEvents() []*AddrEvent { @@ -5079,7 +5306,7 @@ type SendAssetRequest struct { func (x *SendAssetRequest) Reset() { *x = SendAssetRequest{} if protoimpl.UnsafeEnabled { - mi := &file_taprootassets_proto_msgTypes[61] + mi := &file_taprootassets_proto_msgTypes[62] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5092,7 +5319,7 @@ func (x *SendAssetRequest) String() string { func (*SendAssetRequest) ProtoMessage() {} func (x *SendAssetRequest) ProtoReflect() protoreflect.Message { - mi := &file_taprootassets_proto_msgTypes[61] + mi := &file_taprootassets_proto_msgTypes[62] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5105,7 +5332,7 @@ func (x *SendAssetRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SendAssetRequest.ProtoReflect.Descriptor instead. func (*SendAssetRequest) Descriptor() ([]byte, []int) { - return file_taprootassets_proto_rawDescGZIP(), []int{61} + return file_taprootassets_proto_rawDescGZIP(), []int{62} } func (x *SendAssetRequest) GetTapAddrs() []string { @@ -5150,7 +5377,7 @@ type PrevInputAsset struct { func (x *PrevInputAsset) Reset() { *x = PrevInputAsset{} if protoimpl.UnsafeEnabled { - mi := &file_taprootassets_proto_msgTypes[62] + mi := &file_taprootassets_proto_msgTypes[63] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5163,7 +5390,7 @@ func (x *PrevInputAsset) String() string { func (*PrevInputAsset) ProtoMessage() {} func (x *PrevInputAsset) ProtoReflect() protoreflect.Message { - mi := &file_taprootassets_proto_msgTypes[62] + mi := &file_taprootassets_proto_msgTypes[63] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5176,7 +5403,7 @@ func (x *PrevInputAsset) ProtoReflect() protoreflect.Message { // Deprecated: Use PrevInputAsset.ProtoReflect.Descriptor instead. func (*PrevInputAsset) Descriptor() ([]byte, []int) { - return file_taprootassets_proto_rawDescGZIP(), []int{62} + return file_taprootassets_proto_rawDescGZIP(), []int{63} } func (x *PrevInputAsset) GetAnchorPoint() string { @@ -5218,7 +5445,7 @@ type SendAssetResponse struct { func (x *SendAssetResponse) Reset() { *x = SendAssetResponse{} if protoimpl.UnsafeEnabled { - mi := &file_taprootassets_proto_msgTypes[63] + mi := &file_taprootassets_proto_msgTypes[64] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5231,7 +5458,7 @@ func (x *SendAssetResponse) String() string { func (*SendAssetResponse) ProtoMessage() {} func (x *SendAssetResponse) ProtoReflect() protoreflect.Message { - mi := &file_taprootassets_proto_msgTypes[63] + mi := &file_taprootassets_proto_msgTypes[64] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5244,7 +5471,7 @@ func (x *SendAssetResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use SendAssetResponse.ProtoReflect.Descriptor instead. func (*SendAssetResponse) Descriptor() ([]byte, []int) { - return file_taprootassets_proto_rawDescGZIP(), []int{63} + return file_taprootassets_proto_rawDescGZIP(), []int{64} } func (x *SendAssetResponse) GetTransfer() *AssetTransfer { @@ -5263,7 +5490,7 @@ type GetInfoRequest struct { func (x *GetInfoRequest) Reset() { *x = GetInfoRequest{} if protoimpl.UnsafeEnabled { - mi := &file_taprootassets_proto_msgTypes[64] + mi := &file_taprootassets_proto_msgTypes[65] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5276,7 +5503,7 @@ func (x *GetInfoRequest) String() string { func (*GetInfoRequest) ProtoMessage() {} func (x *GetInfoRequest) ProtoReflect() protoreflect.Message { - mi := &file_taprootassets_proto_msgTypes[64] + mi := &file_taprootassets_proto_msgTypes[65] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5289,7 +5516,7 @@ func (x *GetInfoRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetInfoRequest.ProtoReflect.Descriptor instead. func (*GetInfoRequest) Descriptor() ([]byte, []int) { - return file_taprootassets_proto_rawDescGZIP(), []int{64} + return file_taprootassets_proto_rawDescGZIP(), []int{65} } type GetInfoResponse struct { @@ -5310,7 +5537,7 @@ type GetInfoResponse struct { func (x *GetInfoResponse) Reset() { *x = GetInfoResponse{} if protoimpl.UnsafeEnabled { - mi := &file_taprootassets_proto_msgTypes[65] + mi := &file_taprootassets_proto_msgTypes[66] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5323,7 +5550,7 @@ func (x *GetInfoResponse) String() string { func (*GetInfoResponse) ProtoMessage() {} func (x *GetInfoResponse) ProtoReflect() protoreflect.Message { - mi := &file_taprootassets_proto_msgTypes[65] + mi := &file_taprootassets_proto_msgTypes[66] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5336,7 +5563,7 @@ func (x *GetInfoResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetInfoResponse.ProtoReflect.Descriptor instead. func (*GetInfoResponse) Descriptor() ([]byte, []int) { - return file_taprootassets_proto_rawDescGZIP(), []int{65} + return file_taprootassets_proto_rawDescGZIP(), []int{66} } func (x *GetInfoResponse) GetVersion() string { @@ -5412,7 +5639,7 @@ type FetchAssetMetaRequest struct { func (x *FetchAssetMetaRequest) Reset() { *x = FetchAssetMetaRequest{} if protoimpl.UnsafeEnabled { - mi := &file_taprootassets_proto_msgTypes[66] + mi := &file_taprootassets_proto_msgTypes[67] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5425,7 +5652,7 @@ func (x *FetchAssetMetaRequest) String() string { func (*FetchAssetMetaRequest) ProtoMessage() {} func (x *FetchAssetMetaRequest) ProtoReflect() protoreflect.Message { - mi := &file_taprootassets_proto_msgTypes[66] + mi := &file_taprootassets_proto_msgTypes[67] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5438,7 +5665,7 @@ func (x *FetchAssetMetaRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use FetchAssetMetaRequest.ProtoReflect.Descriptor instead. func (*FetchAssetMetaRequest) Descriptor() ([]byte, []int) { - return file_taprootassets_proto_rawDescGZIP(), []int{66} + return file_taprootassets_proto_rawDescGZIP(), []int{67} } func (m *FetchAssetMetaRequest) GetAsset() isFetchAssetMetaRequest_Asset { @@ -5530,7 +5757,7 @@ type BurnAssetRequest struct { func (x *BurnAssetRequest) Reset() { *x = BurnAssetRequest{} if protoimpl.UnsafeEnabled { - mi := &file_taprootassets_proto_msgTypes[67] + mi := &file_taprootassets_proto_msgTypes[68] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5543,7 +5770,7 @@ func (x *BurnAssetRequest) String() string { func (*BurnAssetRequest) ProtoMessage() {} func (x *BurnAssetRequest) ProtoReflect() protoreflect.Message { - mi := &file_taprootassets_proto_msgTypes[67] + mi := &file_taprootassets_proto_msgTypes[68] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5556,7 +5783,7 @@ func (x *BurnAssetRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use BurnAssetRequest.ProtoReflect.Descriptor instead. func (*BurnAssetRequest) Descriptor() ([]byte, []int) { - return file_taprootassets_proto_rawDescGZIP(), []int{67} + return file_taprootassets_proto_rawDescGZIP(), []int{68} } func (m *BurnAssetRequest) GetAsset() isBurnAssetRequest_Asset { @@ -5633,7 +5860,7 @@ type BurnAssetResponse struct { func (x *BurnAssetResponse) Reset() { *x = BurnAssetResponse{} if protoimpl.UnsafeEnabled { - mi := &file_taprootassets_proto_msgTypes[68] + mi := &file_taprootassets_proto_msgTypes[69] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5646,7 +5873,7 @@ func (x *BurnAssetResponse) String() string { func (*BurnAssetResponse) ProtoMessage() {} func (x *BurnAssetResponse) ProtoReflect() protoreflect.Message { - mi := &file_taprootassets_proto_msgTypes[68] + mi := &file_taprootassets_proto_msgTypes[69] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5659,7 +5886,7 @@ func (x *BurnAssetResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use BurnAssetResponse.ProtoReflect.Descriptor instead. func (*BurnAssetResponse) Descriptor() ([]byte, []int) { - return file_taprootassets_proto_rawDescGZIP(), []int{68} + return file_taprootassets_proto_rawDescGZIP(), []int{69} } func (x *BurnAssetResponse) GetBurnTransfer() *AssetTransfer { @@ -5692,7 +5919,7 @@ type ListBurnsRequest struct { func (x *ListBurnsRequest) Reset() { *x = ListBurnsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_taprootassets_proto_msgTypes[69] + mi := &file_taprootassets_proto_msgTypes[70] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5705,7 +5932,7 @@ func (x *ListBurnsRequest) String() string { func (*ListBurnsRequest) ProtoMessage() {} func (x *ListBurnsRequest) ProtoReflect() protoreflect.Message { - mi := &file_taprootassets_proto_msgTypes[69] + mi := &file_taprootassets_proto_msgTypes[70] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5718,7 +5945,7 @@ func (x *ListBurnsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListBurnsRequest.ProtoReflect.Descriptor instead. func (*ListBurnsRequest) Descriptor() ([]byte, []int) { - return file_taprootassets_proto_rawDescGZIP(), []int{69} + return file_taprootassets_proto_rawDescGZIP(), []int{70} } func (x *ListBurnsRequest) GetAssetId() []byte { @@ -5762,7 +5989,7 @@ type AssetBurn struct { func (x *AssetBurn) Reset() { *x = AssetBurn{} if protoimpl.UnsafeEnabled { - mi := &file_taprootassets_proto_msgTypes[70] + mi := &file_taprootassets_proto_msgTypes[71] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5775,7 +6002,7 @@ func (x *AssetBurn) String() string { func (*AssetBurn) ProtoMessage() {} func (x *AssetBurn) ProtoReflect() protoreflect.Message { - mi := &file_taprootassets_proto_msgTypes[70] + mi := &file_taprootassets_proto_msgTypes[71] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5788,7 +6015,7 @@ func (x *AssetBurn) ProtoReflect() protoreflect.Message { // Deprecated: Use AssetBurn.ProtoReflect.Descriptor instead. func (*AssetBurn) Descriptor() ([]byte, []int) { - return file_taprootassets_proto_rawDescGZIP(), []int{70} + return file_taprootassets_proto_rawDescGZIP(), []int{71} } func (x *AssetBurn) GetNote() string { @@ -5837,7 +6064,7 @@ type ListBurnsResponse struct { func (x *ListBurnsResponse) Reset() { *x = ListBurnsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_taprootassets_proto_msgTypes[71] + mi := &file_taprootassets_proto_msgTypes[72] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5850,7 +6077,7 @@ func (x *ListBurnsResponse) String() string { func (*ListBurnsResponse) ProtoMessage() {} func (x *ListBurnsResponse) ProtoReflect() protoreflect.Message { - mi := &file_taprootassets_proto_msgTypes[71] + mi := &file_taprootassets_proto_msgTypes[72] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5863,7 +6090,7 @@ func (x *ListBurnsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListBurnsResponse.ProtoReflect.Descriptor instead. func (*ListBurnsResponse) Descriptor() ([]byte, []int) { - return file_taprootassets_proto_rawDescGZIP(), []int{71} + return file_taprootassets_proto_rawDescGZIP(), []int{72} } func (x *ListBurnsResponse) GetBurns() []*AssetBurn { @@ -5887,7 +6114,7 @@ type OutPoint struct { func (x *OutPoint) Reset() { *x = OutPoint{} if protoimpl.UnsafeEnabled { - mi := &file_taprootassets_proto_msgTypes[72] + mi := &file_taprootassets_proto_msgTypes[73] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5900,7 +6127,7 @@ func (x *OutPoint) String() string { func (*OutPoint) ProtoMessage() {} func (x *OutPoint) ProtoReflect() protoreflect.Message { - mi := &file_taprootassets_proto_msgTypes[72] + mi := &file_taprootassets_proto_msgTypes[73] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5913,7 +6140,7 @@ func (x *OutPoint) ProtoReflect() protoreflect.Message { // Deprecated: Use OutPoint.ProtoReflect.Descriptor instead. func (*OutPoint) Descriptor() ([]byte, []int) { - return file_taprootassets_proto_rawDescGZIP(), []int{72} + return file_taprootassets_proto_rawDescGZIP(), []int{73} } func (x *OutPoint) GetTxid() []byte { @@ -5946,7 +6173,7 @@ type SubscribeReceiveEventsRequest struct { func (x *SubscribeReceiveEventsRequest) Reset() { *x = SubscribeReceiveEventsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_taprootassets_proto_msgTypes[73] + mi := &file_taprootassets_proto_msgTypes[74] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5959,7 +6186,7 @@ func (x *SubscribeReceiveEventsRequest) String() string { func (*SubscribeReceiveEventsRequest) ProtoMessage() {} func (x *SubscribeReceiveEventsRequest) ProtoReflect() protoreflect.Message { - mi := &file_taprootassets_proto_msgTypes[73] + mi := &file_taprootassets_proto_msgTypes[74] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5972,7 +6199,7 @@ func (x *SubscribeReceiveEventsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SubscribeReceiveEventsRequest.ProtoReflect.Descriptor instead. func (*SubscribeReceiveEventsRequest) Descriptor() ([]byte, []int) { - return file_taprootassets_proto_rawDescGZIP(), []int{73} + return file_taprootassets_proto_rawDescGZIP(), []int{74} } func (x *SubscribeReceiveEventsRequest) GetFilterAddr() string { @@ -6014,7 +6241,7 @@ type ReceiveEvent struct { func (x *ReceiveEvent) Reset() { *x = ReceiveEvent{} if protoimpl.UnsafeEnabled { - mi := &file_taprootassets_proto_msgTypes[74] + mi := &file_taprootassets_proto_msgTypes[75] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6027,7 +6254,7 @@ func (x *ReceiveEvent) String() string { func (*ReceiveEvent) ProtoMessage() {} func (x *ReceiveEvent) ProtoReflect() protoreflect.Message { - mi := &file_taprootassets_proto_msgTypes[74] + mi := &file_taprootassets_proto_msgTypes[75] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6040,7 +6267,7 @@ func (x *ReceiveEvent) ProtoReflect() protoreflect.Message { // Deprecated: Use ReceiveEvent.ProtoReflect.Descriptor instead. func (*ReceiveEvent) Descriptor() ([]byte, []int) { - return file_taprootassets_proto_rawDescGZIP(), []int{74} + return file_taprootassets_proto_rawDescGZIP(), []int{75} } func (x *ReceiveEvent) GetTimestamp() int64 { @@ -6101,7 +6328,7 @@ type SubscribeSendEventsRequest struct { func (x *SubscribeSendEventsRequest) Reset() { *x = SubscribeSendEventsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_taprootassets_proto_msgTypes[75] + mi := &file_taprootassets_proto_msgTypes[76] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6114,7 +6341,7 @@ func (x *SubscribeSendEventsRequest) String() string { func (*SubscribeSendEventsRequest) ProtoMessage() {} func (x *SubscribeSendEventsRequest) ProtoReflect() protoreflect.Message { - mi := &file_taprootassets_proto_msgTypes[75] + mi := &file_taprootassets_proto_msgTypes[76] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6127,7 +6354,7 @@ func (x *SubscribeSendEventsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SubscribeSendEventsRequest.ProtoReflect.Descriptor instead. func (*SubscribeSendEventsRequest) Descriptor() ([]byte, []int) { - return file_taprootassets_proto_rawDescGZIP(), []int{75} + return file_taprootassets_proto_rawDescGZIP(), []int{76} } func (x *SubscribeSendEventsRequest) GetFilterScriptKey() []byte { @@ -6182,7 +6409,7 @@ type SendEvent struct { func (x *SendEvent) Reset() { *x = SendEvent{} if protoimpl.UnsafeEnabled { - mi := &file_taprootassets_proto_msgTypes[76] + mi := &file_taprootassets_proto_msgTypes[77] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6195,7 +6422,7 @@ func (x *SendEvent) String() string { func (*SendEvent) ProtoMessage() {} func (x *SendEvent) ProtoReflect() protoreflect.Message { - mi := &file_taprootassets_proto_msgTypes[76] + mi := &file_taprootassets_proto_msgTypes[77] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6208,7 +6435,7 @@ func (x *SendEvent) ProtoReflect() protoreflect.Message { // Deprecated: Use SendEvent.ProtoReflect.Descriptor instead. func (*SendEvent) Descriptor() ([]byte, []int) { - return file_taprootassets_proto_rawDescGZIP(), []int{76} + return file_taprootassets_proto_rawDescGZIP(), []int{77} } func (x *SendEvent) GetTimestamp() int64 { @@ -6305,7 +6532,7 @@ type AnchorTransaction struct { func (x *AnchorTransaction) Reset() { *x = AnchorTransaction{} if protoimpl.UnsafeEnabled { - mi := &file_taprootassets_proto_msgTypes[77] + mi := &file_taprootassets_proto_msgTypes[78] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6318,7 +6545,7 @@ func (x *AnchorTransaction) String() string { func (*AnchorTransaction) ProtoMessage() {} func (x *AnchorTransaction) ProtoReflect() protoreflect.Message { - mi := &file_taprootassets_proto_msgTypes[77] + mi := &file_taprootassets_proto_msgTypes[78] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6331,7 +6558,7 @@ func (x *AnchorTransaction) ProtoReflect() protoreflect.Message { // Deprecated: Use AnchorTransaction.ProtoReflect.Descriptor instead. func (*AnchorTransaction) Descriptor() ([]byte, []int) { - return file_taprootassets_proto_rawDescGZIP(), []int{77} + return file_taprootassets_proto_rawDescGZIP(), []int{78} } func (x *AnchorTransaction) GetAnchorPsbt() []byte { @@ -6394,7 +6621,7 @@ type RegisterTransferRequest struct { func (x *RegisterTransferRequest) Reset() { *x = RegisterTransferRequest{} if protoimpl.UnsafeEnabled { - mi := &file_taprootassets_proto_msgTypes[78] + mi := &file_taprootassets_proto_msgTypes[79] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6407,7 +6634,7 @@ func (x *RegisterTransferRequest) String() string { func (*RegisterTransferRequest) ProtoMessage() {} func (x *RegisterTransferRequest) ProtoReflect() protoreflect.Message { - mi := &file_taprootassets_proto_msgTypes[78] + mi := &file_taprootassets_proto_msgTypes[79] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6420,7 +6647,7 @@ func (x *RegisterTransferRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RegisterTransferRequest.ProtoReflect.Descriptor instead. func (*RegisterTransferRequest) Descriptor() ([]byte, []int) { - return file_taprootassets_proto_rawDescGZIP(), []int{78} + return file_taprootassets_proto_rawDescGZIP(), []int{79} } func (x *RegisterTransferRequest) GetAssetId() []byte { @@ -6462,7 +6689,7 @@ type RegisterTransferResponse struct { func (x *RegisterTransferResponse) Reset() { *x = RegisterTransferResponse{} if protoimpl.UnsafeEnabled { - mi := &file_taprootassets_proto_msgTypes[79] + mi := &file_taprootassets_proto_msgTypes[80] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6475,7 +6702,7 @@ func (x *RegisterTransferResponse) String() string { func (*RegisterTransferResponse) ProtoMessage() {} func (x *RegisterTransferResponse) ProtoReflect() protoreflect.Message { - mi := &file_taprootassets_proto_msgTypes[79] + mi := &file_taprootassets_proto_msgTypes[80] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6488,7 +6715,7 @@ func (x *RegisterTransferResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use RegisterTransferResponse.ProtoReflect.Descriptor instead. func (*RegisterTransferResponse) Descriptor() ([]byte, []int) { - return file_taprootassets_proto_rawDescGZIP(), []int{79} + return file_taprootassets_proto_rawDescGZIP(), []int{80} } func (x *RegisterTransferResponse) GetRegisteredAsset() *Asset { @@ -6509,7 +6736,7 @@ var file_taprootassets_proto_rawDesc = []byte{ 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, 0x22, 0x85, 0x03, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x41, + 0x74, 0x61, 0x48, 0x61, 0x73, 0x68, 0x22, 0xc9, 0x03, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x77, 0x69, 0x74, 0x6e, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x77, 0x69, 0x74, 0x68, 0x57, 0x69, 0x74, 0x6e, 0x65, 0x73, 0x73, 0x12, 0x23, @@ -6533,989 +6760,1027 @@ var file_taprootassets_proto_rawDesc = []byte{ 0x4b, 0x65, 0x79, 0x12, 0x39, 0x0a, 0x0f, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x5f, 0x6f, 0x75, 0x74, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4f, 0x75, 0x74, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x0e, - 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x4f, 0x75, 0x74, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x22, 0xbb, - 0x02, 0x0a, 0x0a, 0x41, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1b, 0x0a, - 0x09, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x5f, 0x74, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, - 0x52, 0x08, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x54, 0x78, 0x12, 0x2a, 0x0a, 0x11, 0x61, 0x6e, - 0x63, 0x68, 0x6f, 0x72, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x42, 0x6c, 0x6f, - 0x63, 0x6b, 0x48, 0x61, 0x73, 0x68, 0x12, 0x27, 0x0a, 0x0f, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, - 0x5f, 0x6f, 0x75, 0x74, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0e, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x4f, 0x75, 0x74, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, - 0x21, 0x0a, 0x0c, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x6b, 0x65, 0x79, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0b, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x4b, - 0x65, 0x79, 0x12, 0x1f, 0x0a, 0x0b, 0x6d, 0x65, 0x72, 0x6b, 0x6c, 0x65, 0x5f, 0x72, 0x6f, 0x6f, - 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0a, 0x6d, 0x65, 0x72, 0x6b, 0x6c, 0x65, 0x52, - 0x6f, 0x6f, 0x74, 0x12, 0x2b, 0x0a, 0x11, 0x74, 0x61, 0x70, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, - 0x5f, 0x73, 0x69, 0x62, 0x6c, 0x69, 0x6e, 0x67, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x10, - 0x74, 0x61, 0x70, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x53, 0x69, 0x62, 0x6c, 0x69, 0x6e, 0x67, - 0x12, 0x21, 0x0a, 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, - 0x18, 0x08, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x69, - 0x67, 0x68, 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x74, 0x69, 0x6d, - 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x09, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x62, 0x6c, - 0x6f, 0x63, 0x6b, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0xd3, 0x01, 0x0a, - 0x0b, 0x47, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x23, 0x0a, 0x0d, - 0x67, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0c, 0x67, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x50, 0x6f, 0x69, 0x6e, - 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x6e, 0x61, 0x6d, 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, 0x19, 0x0a, 0x08, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x61, 0x73, 0x73, 0x65, 0x74, 0x49, 0x64, 0x12, 0x30, 0x0a, - 0x0a, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x05, 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, - 0x21, 0x0a, 0x0c, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x49, 0x6e, 0x64, - 0x65, 0x78, 0x22, 0x79, 0x0a, 0x0b, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x4b, 0x65, - 0x79, 0x12, 0x12, 0x0a, 0x04, 0x78, 0x70, 0x75, 0x62, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x78, 0x70, 0x75, 0x62, 0x12, 0x2d, 0x0a, 0x12, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, - 0x66, 0x69, 0x6e, 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0c, 0x52, 0x11, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x46, 0x69, 0x6e, 0x67, 0x65, 0x72, 0x70, - 0x72, 0x69, 0x6e, 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x64, 0x65, 0x72, 0x69, 0x76, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x64, - 0x65, 0x72, 0x69, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x74, 0x68, 0x22, 0xf9, 0x01, - 0x0a, 0x0f, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x2e, 0x0a, 0x07, 0x72, 0x61, 0x77, 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, 0x06, 0x72, 0x61, 0x77, 0x4b, 0x65, - 0x79, 0x12, 0x3a, 0x0a, 0x0e, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x5f, 0x67, 0x65, 0x6e, 0x65, - 0x73, 0x69, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x74, 0x61, 0x70, 0x72, - 0x70, 0x63, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0d, - 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x47, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x12, 0x25, 0x0a, - 0x0e, 0x74, 0x61, 0x70, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0d, 0x74, 0x61, 0x70, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, - 0x52, 0x6f, 0x6f, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x6e, 0x65, 0x77, 0x5f, 0x61, 0x73, 0x73, 0x65, - 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x6e, 0x65, 0x77, 0x41, 0x73, 0x73, 0x65, - 0x74, 0x12, 0x36, 0x0a, 0x0c, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x6b, 0x65, - 0x79, 0x18, 0x05, 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, 0x0b, 0x65, 0x78, - 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x4b, 0x65, 0x79, 0x22, 0x3a, 0x0a, 0x05, 0x54, 0x78, 0x4f, - 0x75, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6b, 0x5f, 0x73, - 0x63, 0x72, 0x69, 0x70, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x70, 0x6b, 0x53, - 0x63, 0x72, 0x69, 0x70, 0x74, 0x22, 0x9c, 0x01, 0x0a, 0x0e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x56, - 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x54, 0x78, 0x12, 0x20, 0x0a, 0x0b, 0x74, 0x72, 0x61, 0x6e, - 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0b, 0x74, - 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x0a, 0x08, 0x70, 0x72, - 0x65, 0x76, 0x5f, 0x6f, 0x75, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x74, - 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x54, 0x78, 0x4f, 0x75, 0x74, 0x52, 0x07, 0x70, 0x72, 0x65, - 0x76, 0x4f, 0x75, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x67, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x5f, - 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x67, 0x65, 0x6e, 0x65, 0x73, 0x69, - 0x73, 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x77, 0x65, 0x61, 0x6b, 0x65, 0x64, 0x5f, 0x6b, - 0x65, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0a, 0x74, 0x77, 0x65, 0x61, 0x6b, 0x65, - 0x64, 0x4b, 0x65, 0x79, 0x22, 0x47, 0x0a, 0x0c, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x57, 0x69, 0x74, - 0x6e, 0x65, 0x73, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x67, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x5f, - 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x67, 0x65, 0x6e, 0x65, 0x73, 0x69, - 0x73, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x77, 0x69, 0x74, 0x6e, 0x65, 0x73, 0x73, 0x18, 0x02, - 0x20, 0x03, 0x28, 0x0c, 0x52, 0x07, 0x77, 0x69, 0x74, 0x6e, 0x65, 0x73, 0x73, 0x22, 0xa8, 0x01, - 0x0a, 0x0a, 0x41, 0x73, 0x73, 0x65, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x22, 0x0a, 0x0d, - 0x72, 0x61, 0x77, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0c, 0x52, 0x0b, 0x72, 0x61, 0x77, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4b, 0x65, 0x79, - 0x12, 0x2a, 0x0a, 0x11, 0x74, 0x77, 0x65, 0x61, 0x6b, 0x65, 0x64, 0x5f, 0x67, 0x72, 0x6f, 0x75, - 0x70, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0f, 0x74, 0x77, 0x65, - 0x61, 0x6b, 0x65, 0x64, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4b, 0x65, 0x79, 0x12, 0x23, 0x0a, 0x0d, - 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x77, 0x69, 0x74, 0x6e, 0x65, 0x73, 0x73, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x0c, 0x52, 0x0c, 0x61, 0x73, 0x73, 0x65, 0x74, 0x57, 0x69, 0x74, 0x6e, 0x65, 0x73, + 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x4f, 0x75, 0x74, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x42, + 0x0a, 0x0f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x74, 0x79, 0x70, + 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, + 0x2e, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x4b, 0x65, 0x79, 0x54, 0x79, 0x70, 0x65, 0x51, 0x75, + 0x65, 0x72, 0x79, 0x52, 0x0d, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x4b, 0x65, 0x79, 0x54, 0x79, + 0x70, 0x65, 0x22, 0xbb, 0x02, 0x0a, 0x0a, 0x41, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x49, 0x6e, 0x66, + 0x6f, 0x12, 0x1b, 0x0a, 0x09, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x5f, 0x74, 0x78, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x54, 0x78, 0x12, 0x2a, + 0x0a, 0x11, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x68, + 0x61, 0x73, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x61, 0x6e, 0x63, 0x68, 0x6f, + 0x72, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x61, 0x73, 0x68, 0x12, 0x27, 0x0a, 0x0f, 0x61, 0x6e, + 0x63, 0x68, 0x6f, 0x72, 0x5f, 0x6f, 0x75, 0x74, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0e, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x4f, 0x75, 0x74, 0x70, 0x6f, + 0x69, 0x6e, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, + 0x6b, 0x65, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0b, 0x69, 0x6e, 0x74, 0x65, 0x72, + 0x6e, 0x61, 0x6c, 0x4b, 0x65, 0x79, 0x12, 0x1f, 0x0a, 0x0b, 0x6d, 0x65, 0x72, 0x6b, 0x6c, 0x65, + 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0a, 0x6d, 0x65, 0x72, + 0x6b, 0x6c, 0x65, 0x52, 0x6f, 0x6f, 0x74, 0x12, 0x2b, 0x0a, 0x11, 0x74, 0x61, 0x70, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x5f, 0x73, 0x69, 0x62, 0x6c, 0x69, 0x6e, 0x67, 0x18, 0x07, 0x20, 0x01, + 0x28, 0x0c, 0x52, 0x10, 0x74, 0x61, 0x70, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x53, 0x69, 0x62, + 0x6c, 0x69, 0x6e, 0x67, 0x12, 0x21, 0x0a, 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x68, 0x65, + 0x69, 0x67, 0x68, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x62, 0x6c, 0x6f, 0x63, + 0x6b, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, + 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x09, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x0e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, + 0x22, 0xd3, 0x01, 0x0a, 0x0b, 0x47, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x49, 0x6e, 0x66, 0x6f, + 0x12, 0x23, 0x0a, 0x0d, 0x67, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x5f, 0x70, 0x6f, 0x69, 0x6e, + 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x67, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, + 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 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, 0x19, 0x0a, 0x08, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, + 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x61, 0x73, 0x73, 0x65, 0x74, 0x49, + 0x64, 0x12, 0x30, 0x0a, 0x0a, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, + 0x05, 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, 0x21, 0x0a, 0x0c, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x5f, 0x69, 0x6e, + 0x64, 0x65, 0x78, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x6f, 0x75, 0x74, 0x70, 0x75, + 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x79, 0x0a, 0x0b, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, + 0x61, 0x6c, 0x4b, 0x65, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x78, 0x70, 0x75, 0x62, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x78, 0x70, 0x75, 0x62, 0x12, 0x2d, 0x0a, 0x12, 0x6d, 0x61, 0x73, + 0x74, 0x65, 0x72, 0x5f, 0x66, 0x69, 0x6e, 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x11, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x46, 0x69, 0x6e, + 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x64, 0x65, 0x72, 0x69, + 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0e, 0x64, 0x65, 0x72, 0x69, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x74, + 0x68, 0x22, 0xf9, 0x01, 0x0a, 0x0f, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4b, 0x65, 0x79, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2e, 0x0a, 0x07, 0x72, 0x61, 0x77, 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, 0x06, 0x72, + 0x61, 0x77, 0x4b, 0x65, 0x79, 0x12, 0x3a, 0x0a, 0x0e, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x5f, + 0x67, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, + 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x49, 0x6e, + 0x66, 0x6f, 0x52, 0x0d, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x47, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x74, 0x61, 0x70, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x5f, 0x72, - 0x6f, 0x6f, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0d, 0x74, 0x61, 0x70, 0x73, 0x63, - 0x72, 0x69, 0x70, 0x74, 0x52, 0x6f, 0x6f, 0x74, 0x22, 0x5b, 0x0a, 0x0e, 0x47, 0x72, 0x6f, 0x75, - 0x70, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x76, 0x65, 0x61, 0x6c, 0x12, 0x22, 0x0a, 0x0d, 0x72, 0x61, - 0x77, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0c, 0x52, 0x0b, 0x72, 0x61, 0x77, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4b, 0x65, 0x79, 0x12, 0x25, - 0x0a, 0x0e, 0x74, 0x61, 0x70, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x5f, 0x72, 0x6f, 0x6f, 0x74, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0d, 0x74, 0x61, 0x70, 0x73, 0x63, 0x72, 0x69, 0x70, - 0x74, 0x52, 0x6f, 0x6f, 0x74, 0x22, 0x54, 0x0a, 0x0d, 0x47, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, - 0x52, 0x65, 0x76, 0x65, 0x61, 0x6c, 0x12, 0x43, 0x0a, 0x13, 0x67, 0x65, 0x6e, 0x65, 0x73, 0x69, - 0x73, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x72, 0x65, 0x76, 0x65, 0x61, 0x6c, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x47, 0x65, 0x6e, - 0x65, 0x73, 0x69, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x11, 0x67, 0x65, 0x6e, 0x65, 0x73, 0x69, - 0x73, 0x42, 0x61, 0x73, 0x65, 0x52, 0x65, 0x76, 0x65, 0x61, 0x6c, 0x22, 0x39, 0x0a, 0x0e, 0x44, - 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x44, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x12, 0x27, 0x0a, + 0x6f, 0x6f, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0d, 0x74, 0x61, 0x70, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x52, 0x6f, 0x6f, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x6e, 0x65, 0x77, 0x5f, + 0x61, 0x73, 0x73, 0x65, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x6e, 0x65, 0x77, + 0x41, 0x73, 0x73, 0x65, 0x74, 0x12, 0x36, 0x0a, 0x0c, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, + 0x6c, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x05, 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, 0x0b, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x4b, 0x65, 0x79, 0x22, 0x3a, 0x0a, + 0x05, 0x54, 0x78, 0x4f, 0x75, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1b, 0x0a, 0x09, + 0x70, 0x6b, 0x5f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, + 0x08, 0x70, 0x6b, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x22, 0x9c, 0x01, 0x0a, 0x0e, 0x47, 0x72, + 0x6f, 0x75, 0x70, 0x56, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x54, 0x78, 0x12, 0x20, 0x0a, 0x0b, + 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0c, 0x52, 0x0b, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x28, + 0x0a, 0x08, 0x70, 0x72, 0x65, 0x76, 0x5f, 0x6f, 0x75, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x0d, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x54, 0x78, 0x4f, 0x75, 0x74, 0x52, + 0x07, 0x70, 0x72, 0x65, 0x76, 0x4f, 0x75, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x67, 0x65, 0x6e, 0x65, + 0x73, 0x69, 0x73, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x67, 0x65, + 0x6e, 0x65, 0x73, 0x69, 0x73, 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x77, 0x65, 0x61, 0x6b, + 0x65, 0x64, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0a, 0x74, 0x77, + 0x65, 0x61, 0x6b, 0x65, 0x64, 0x4b, 0x65, 0x79, 0x22, 0x47, 0x0a, 0x0c, 0x47, 0x72, 0x6f, 0x75, + 0x70, 0x57, 0x69, 0x74, 0x6e, 0x65, 0x73, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x67, 0x65, 0x6e, 0x65, + 0x73, 0x69, 0x73, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x67, 0x65, + 0x6e, 0x65, 0x73, 0x69, 0x73, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x77, 0x69, 0x74, 0x6e, 0x65, + 0x73, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x07, 0x77, 0x69, 0x74, 0x6e, 0x65, 0x73, + 0x73, 0x22, 0xa8, 0x01, 0x0a, 0x0a, 0x41, 0x73, 0x73, 0x65, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, + 0x12, 0x22, 0x0a, 0x0d, 0x72, 0x61, 0x77, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6b, 0x65, + 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0b, 0x72, 0x61, 0x77, 0x47, 0x72, 0x6f, 0x75, + 0x70, 0x4b, 0x65, 0x79, 0x12, 0x2a, 0x0a, 0x11, 0x74, 0x77, 0x65, 0x61, 0x6b, 0x65, 0x64, 0x5f, + 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, + 0x0f, 0x74, 0x77, 0x65, 0x61, 0x6b, 0x65, 0x64, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4b, 0x65, 0x79, + 0x12, 0x23, 0x0a, 0x0d, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x77, 0x69, 0x74, 0x6e, 0x65, 0x73, + 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0c, 0x61, 0x73, 0x73, 0x65, 0x74, 0x57, 0x69, + 0x74, 0x6e, 0x65, 0x73, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x74, 0x61, 0x70, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0d, 0x74, + 0x61, 0x70, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x52, 0x6f, 0x6f, 0x74, 0x22, 0x5b, 0x0a, 0x0e, + 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x76, 0x65, 0x61, 0x6c, 0x12, 0x22, + 0x0a, 0x0d, 0x72, 0x61, 0x77, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6b, 0x65, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0b, 0x72, 0x61, 0x77, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4b, + 0x65, 0x79, 0x12, 0x25, 0x0a, 0x0e, 0x74, 0x61, 0x70, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x5f, + 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0d, 0x74, 0x61, 0x70, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x52, 0x6f, 0x6f, 0x74, 0x22, 0x54, 0x0a, 0x0d, 0x47, 0x65, 0x6e, + 0x65, 0x73, 0x69, 0x73, 0x52, 0x65, 0x76, 0x65, 0x61, 0x6c, 0x12, 0x43, 0x0a, 0x13, 0x67, 0x65, + 0x6e, 0x65, 0x73, 0x69, 0x73, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x72, 0x65, 0x76, 0x65, 0x61, + 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, + 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x11, 0x67, 0x65, + 0x6e, 0x65, 0x73, 0x69, 0x73, 0x42, 0x61, 0x73, 0x65, 0x52, 0x65, 0x76, 0x65, 0x61, 0x6c, 0x22, + 0x39, 0x0a, 0x0e, 0x44, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x44, 0x69, 0x73, 0x70, 0x6c, 0x61, + 0x79, 0x12, 0x27, 0x0a, 0x0f, 0x64, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x5f, 0x64, 0x69, 0x73, + 0x70, 0x6c, 0x61, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0e, 0x64, 0x65, 0x63, 0x69, + 0x6d, 0x61, 0x6c, 0x44, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x22, 0xe0, 0x06, 0x0a, 0x05, 0x41, + 0x73, 0x73, 0x65, 0x74, 0x12, 0x2e, 0x0a, 0x07, 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, 0x07, 0x76, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x38, 0x0a, 0x0d, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x67, 0x65, + 0x6e, 0x65, 0x73, 0x69, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x74, 0x61, + 0x70, 0x72, 0x70, 0x63, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x49, 0x6e, 0x66, 0x6f, + 0x52, 0x0c, 0x61, 0x73, 0x73, 0x65, 0x74, 0x47, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 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, 0x1b, 0x0a, 0x09, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x74, + 0x69, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x6b, 0x54, + 0x69, 0x6d, 0x65, 0x12, 0x2c, 0x0a, 0x12, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, + 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x10, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x4c, 0x6f, 0x63, 0x6b, 0x54, 0x69, 0x6d, + 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x5f, 0x76, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x4b, 0x65, 0x79, 0x12, 0x2d, 0x0a, 0x13, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x69, 0x73, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x18, 0x0a, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x4b, 0x65, 0x79, 0x49, + 0x73, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x12, 0x33, 0x0a, 0x0b, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, + 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x74, 0x61, + 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, + 0x0a, 0x61, 0x73, 0x73, 0x65, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x35, 0x0a, 0x0c, 0x63, + 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x18, 0x0c, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x12, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x6e, 0x63, 0x68, 0x6f, + 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x41, 0x6e, 0x63, 0x68, + 0x6f, 0x72, 0x12, 0x3a, 0x0a, 0x0e, 0x70, 0x72, 0x65, 0x76, 0x5f, 0x77, 0x69, 0x74, 0x6e, 0x65, + 0x73, 0x73, 0x65, 0x73, 0x18, 0x0d, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x74, 0x61, 0x70, + 0x72, 0x70, 0x63, 0x2e, 0x50, 0x72, 0x65, 0x76, 0x57, 0x69, 0x74, 0x6e, 0x65, 0x73, 0x73, 0x52, + 0x0d, 0x70, 0x72, 0x65, 0x76, 0x57, 0x69, 0x74, 0x6e, 0x65, 0x73, 0x73, 0x65, 0x73, 0x12, 0x19, + 0x0a, 0x08, 0x69, 0x73, 0x5f, 0x73, 0x70, 0x65, 0x6e, 0x74, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x07, 0x69, 0x73, 0x53, 0x70, 0x65, 0x6e, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x6c, 0x65, 0x61, + 0x73, 0x65, 0x5f, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0a, + 0x6c, 0x65, 0x61, 0x73, 0x65, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x12, 0x21, 0x0a, 0x0c, 0x6c, 0x65, + 0x61, 0x73, 0x65, 0x5f, 0x65, 0x78, 0x70, 0x69, 0x72, 0x79, 0x18, 0x10, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x0b, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x45, 0x78, 0x70, 0x69, 0x72, 0x79, 0x12, 0x17, 0x0a, + 0x07, 0x69, 0x73, 0x5f, 0x62, 0x75, 0x72, 0x6e, 0x18, 0x11, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, + 0x69, 0x73, 0x42, 0x75, 0x72, 0x6e, 0x12, 0x39, 0x0a, 0x19, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x65, 0x64, 0x5f, 0x6b, 0x6e, + 0x6f, 0x77, 0x6e, 0x18, 0x12, 0x20, 0x01, 0x28, 0x08, 0x52, 0x16, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x4b, 0x65, 0x79, 0x44, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x65, 0x64, 0x4b, 0x6e, 0x6f, 0x77, + 0x6e, 0x12, 0x3a, 0x0a, 0x1a, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x5f, + 0x68, 0x61, 0x73, 0x5f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, + 0x13, 0x20, 0x01, 0x28, 0x08, 0x52, 0x16, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x4b, 0x65, 0x79, + 0x48, 0x61, 0x73, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x50, 0x61, 0x74, 0x68, 0x12, 0x3f, 0x0a, 0x0f, 0x64, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x5f, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0e, 0x64, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x44, - 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x22, 0xa1, 0x06, 0x0a, 0x05, 0x41, 0x73, 0x73, 0x65, 0x74, - 0x12, 0x2e, 0x0a, 0x07, 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, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x12, 0x38, 0x0a, 0x0d, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x73, 0x69, - 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, - 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0c, 0x61, 0x73, - 0x73, 0x65, 0x74, 0x47, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 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, 0x1b, 0x0a, 0x09, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x6b, 0x54, 0x69, 0x6d, 0x65, 0x12, - 0x2c, 0x0a, 0x12, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x6c, 0x6f, 0x63, 0x6b, - 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x10, 0x72, 0x65, 0x6c, - 0x61, 0x74, 0x69, 0x76, 0x65, 0x4c, 0x6f, 0x63, 0x6b, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x25, 0x0a, - 0x0e, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, - 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x56, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x5f, 0x6b, - 0x65, 0x79, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, - 0x4b, 0x65, 0x79, 0x12, 0x2d, 0x0a, 0x13, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x5f, 0x6b, 0x65, - 0x79, 0x5f, 0x69, 0x73, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x10, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x4b, 0x65, 0x79, 0x49, 0x73, 0x4c, 0x6f, 0x63, - 0x61, 0x6c, 0x12, 0x33, 0x0a, 0x0b, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x67, 0x72, 0x6f, 0x75, - 0x70, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, - 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x0a, 0x61, 0x73, 0x73, - 0x65, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x35, 0x0a, 0x0c, 0x63, 0x68, 0x61, 0x69, 0x6e, - 0x5f, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, - 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x49, 0x6e, 0x66, - 0x6f, 0x52, 0x0b, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x41, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x12, 0x3a, - 0x0a, 0x0e, 0x70, 0x72, 0x65, 0x76, 0x5f, 0x77, 0x69, 0x74, 0x6e, 0x65, 0x73, 0x73, 0x65, 0x73, - 0x18, 0x0d, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, - 0x50, 0x72, 0x65, 0x76, 0x57, 0x69, 0x74, 0x6e, 0x65, 0x73, 0x73, 0x52, 0x0d, 0x70, 0x72, 0x65, - 0x76, 0x57, 0x69, 0x74, 0x6e, 0x65, 0x73, 0x73, 0x65, 0x73, 0x12, 0x19, 0x0a, 0x08, 0x69, 0x73, - 0x5f, 0x73, 0x70, 0x65, 0x6e, 0x74, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x69, 0x73, - 0x53, 0x70, 0x65, 0x6e, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x5f, 0x6f, - 0x77, 0x6e, 0x65, 0x72, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0a, 0x6c, 0x65, 0x61, 0x73, - 0x65, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x12, 0x21, 0x0a, 0x0c, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x5f, - 0x65, 0x78, 0x70, 0x69, 0x72, 0x79, 0x18, 0x10, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x6c, 0x65, - 0x61, 0x73, 0x65, 0x45, 0x78, 0x70, 0x69, 0x72, 0x79, 0x12, 0x17, 0x0a, 0x07, 0x69, 0x73, 0x5f, - 0x62, 0x75, 0x72, 0x6e, 0x18, 0x11, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x69, 0x73, 0x42, 0x75, - 0x72, 0x6e, 0x12, 0x39, 0x0a, 0x19, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x5f, 0x6b, 0x65, 0x79, - 0x5f, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x65, 0x64, 0x5f, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x18, - 0x12, 0x20, 0x01, 0x28, 0x08, 0x52, 0x16, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x4b, 0x65, 0x79, - 0x44, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x65, 0x64, 0x4b, 0x6e, 0x6f, 0x77, 0x6e, 0x12, 0x3a, 0x0a, - 0x1a, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x68, 0x61, 0x73, 0x5f, - 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x13, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x16, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x4b, 0x65, 0x79, 0x48, 0x61, 0x73, 0x53, - 0x63, 0x72, 0x69, 0x70, 0x74, 0x50, 0x61, 0x74, 0x68, 0x12, 0x3f, 0x0a, 0x0f, 0x64, 0x65, 0x63, - 0x69, 0x6d, 0x61, 0x6c, 0x5f, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x18, 0x14, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x44, 0x65, 0x63, 0x69, - 0x6d, 0x61, 0x6c, 0x44, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x52, 0x0e, 0x64, 0x65, 0x63, 0x69, - 0x6d, 0x61, 0x6c, 0x44, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x22, 0xa1, 0x01, 0x0a, 0x0b, 0x50, - 0x72, 0x65, 0x76, 0x57, 0x69, 0x74, 0x6e, 0x65, 0x73, 0x73, 0x12, 0x2f, 0x0a, 0x07, 0x70, 0x72, - 0x65, 0x76, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x74, 0x61, - 0x70, 0x72, 0x70, 0x63, 0x2e, 0x50, 0x72, 0x65, 0x76, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x41, 0x73, - 0x73, 0x65, 0x74, 0x52, 0x06, 0x70, 0x72, 0x65, 0x76, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x74, - 0x78, 0x5f, 0x77, 0x69, 0x74, 0x6e, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0c, 0x52, - 0x09, 0x74, 0x78, 0x57, 0x69, 0x74, 0x6e, 0x65, 0x73, 0x73, 0x12, 0x42, 0x0a, 0x10, 0x73, 0x70, - 0x6c, 0x69, 0x74, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x70, - 0x6c, 0x69, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0f, 0x73, - 0x70, 0x6c, 0x69, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x3f, - 0x0a, 0x0f, 0x53, 0x70, 0x6c, 0x69, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, - 0x74, 0x12, 0x2c, 0x0a, 0x0a, 0x72, 0x6f, 0x6f, 0x74, 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, 0x09, 0x72, 0x6f, 0x6f, 0x74, 0x41, 0x73, 0x73, 0x65, 0x74, 0x22, - 0x9c, 0x01, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x25, 0x0a, 0x06, 0x61, 0x73, 0x73, 0x65, 0x74, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, - 0x73, 0x73, 0x65, 0x74, 0x52, 0x06, 0x61, 0x73, 0x73, 0x65, 0x74, 0x73, 0x12, 0x33, 0x0a, 0x15, - 0x75, 0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x65, 0x64, 0x5f, 0x74, 0x72, 0x61, 0x6e, - 0x73, 0x66, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x14, 0x75, 0x6e, 0x63, - 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x65, 0x64, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, - 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x75, 0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x65, 0x64, - 0x5f, 0x6d, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x10, 0x75, 0x6e, - 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x65, 0x64, 0x4d, 0x69, 0x6e, 0x74, 0x73, 0x22, 0x39, - 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x74, 0x78, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x6c, 0x65, - 0x61, 0x73, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x69, 0x6e, 0x63, 0x6c, - 0x75, 0x64, 0x65, 0x4c, 0x65, 0x61, 0x73, 0x65, 0x64, 0x22, 0xa9, 0x02, 0x0a, 0x0b, 0x4d, 0x61, - 0x6e, 0x61, 0x67, 0x65, 0x64, 0x55, 0x74, 0x78, 0x6f, 0x12, 0x1b, 0x0a, 0x09, 0x6f, 0x75, 0x74, - 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6f, 0x75, - 0x74, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x61, 0x6d, 0x74, 0x5f, 0x73, 0x61, - 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x61, 0x6d, 0x74, 0x53, 0x61, 0x74, 0x12, - 0x21, 0x0a, 0x0c, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x6b, 0x65, 0x79, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0b, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x4b, - 0x65, 0x79, 0x12, 0x2c, 0x0a, 0x12, 0x74, 0x61, 0x70, 0x72, 0x6f, 0x6f, 0x74, 0x5f, 0x61, 0x73, - 0x73, 0x65, 0x74, 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x10, - 0x74, 0x61, 0x70, 0x72, 0x6f, 0x6f, 0x74, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x6f, 0x6f, 0x74, - 0x12, 0x1f, 0x0a, 0x0b, 0x6d, 0x65, 0x72, 0x6b, 0x6c, 0x65, 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0a, 0x6d, 0x65, 0x72, 0x6b, 0x6c, 0x65, 0x52, 0x6f, 0x6f, - 0x74, 0x12, 0x25, 0x0a, 0x06, 0x61, 0x73, 0x73, 0x65, 0x74, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x0d, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, - 0x52, 0x06, 0x61, 0x73, 0x73, 0x65, 0x74, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x6c, 0x65, 0x61, 0x73, - 0x65, 0x5f, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0a, 0x6c, - 0x65, 0x61, 0x73, 0x65, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x12, 0x2a, 0x0a, 0x11, 0x6c, 0x65, 0x61, - 0x73, 0x65, 0x5f, 0x65, 0x78, 0x70, 0x69, 0x72, 0x79, 0x5f, 0x75, 0x6e, 0x69, 0x78, 0x18, 0x08, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x45, 0x78, 0x70, 0x69, 0x72, - 0x79, 0x55, 0x6e, 0x69, 0x78, 0x22, 0xbb, 0x01, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x74, - 0x78, 0x6f, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x50, 0x0a, 0x0d, 0x6d, - 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x5f, 0x75, 0x74, 0x78, 0x6f, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x2b, 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, 0x2e, 0x4d, 0x61, - 0x6e, 0x61, 0x67, 0x65, 0x64, 0x55, 0x74, 0x78, 0x6f, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, - 0x0c, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x55, 0x74, 0x78, 0x6f, 0x73, 0x1a, 0x54, 0x0a, - 0x11, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x55, 0x74, 0x78, 0x6f, 0x73, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x03, 0x6b, 0x65, 0x79, 0x12, 0x29, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4d, 0x61, 0x6e, - 0x61, 0x67, 0x65, 0x64, 0x55, 0x74, 0x78, 0x6f, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, - 0x02, 0x38, 0x01, 0x22, 0x13, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x8d, 0x02, 0x0a, 0x12, 0x41, 0x73, 0x73, - 0x65, 0x74, 0x48, 0x75, 0x6d, 0x61, 0x6e, 0x52, 0x65, 0x61, 0x64, 0x61, 0x62, 0x6c, 0x65, 0x12, - 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x02, 0x69, 0x64, 0x12, - 0x16, 0x0a, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, - 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, - 0x74, 0x69, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x6b, - 0x54, 0x69, 0x6d, 0x65, 0x12, 0x2c, 0x0a, 0x12, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, - 0x5f, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x10, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x4c, 0x6f, 0x63, 0x6b, 0x54, 0x69, - 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x61, 0x67, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x03, 0x74, 0x61, 0x67, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x65, 0x74, 0x61, 0x5f, 0x68, 0x61, 0x73, - 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x48, 0x61, 0x73, - 0x68, 0x12, 0x25, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, - 0x11, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x54, 0x79, - 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x2e, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, - 0x69, 0x6f, 0x6e, 0x18, 0x08, 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, - 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x43, 0x0a, 0x0d, 0x47, 0x72, 0x6f, 0x75, - 0x70, 0x65, 0x64, 0x41, 0x73, 0x73, 0x65, 0x74, 0x73, 0x12, 0x32, 0x0a, 0x06, 0x61, 0x73, 0x73, - 0x65, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x74, 0x61, 0x70, 0x72, - 0x70, 0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x48, 0x75, 0x6d, 0x61, 0x6e, 0x52, 0x65, 0x61, - 0x64, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x06, 0x61, 0x73, 0x73, 0x65, 0x74, 0x73, 0x22, 0xa6, 0x01, - 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3e, 0x0a, 0x06, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 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, - 0x2e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x06, 0x67, 0x72, - 0x6f, 0x75, 0x70, 0x73, 0x1a, 0x50, 0x0a, 0x0b, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2b, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x47, 0x72, - 0x6f, 0x75, 0x70, 0x65, 0x64, 0x41, 0x73, 0x73, 0x65, 0x74, 0x73, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xd1, 0x01, 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74, 0x42, - 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, - 0x0a, 0x08, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, - 0x48, 0x00, 0x52, 0x07, 0x61, 0x73, 0x73, 0x65, 0x74, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x09, 0x67, - 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, - 0x52, 0x08, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x4b, 0x65, 0x79, 0x12, 0x21, 0x0a, 0x0c, 0x61, 0x73, - 0x73, 0x65, 0x74, 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, - 0x52, 0x0b, 0x61, 0x73, 0x73, 0x65, 0x74, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x28, 0x0a, - 0x10, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, - 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x4b, 0x65, - 0x79, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x25, 0x0a, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, - 0x64, 0x65, 0x5f, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x0d, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x4c, 0x65, 0x61, 0x73, 0x65, 0x64, 0x42, 0x0a, - 0x0a, 0x08, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x62, 0x79, 0x22, 0x62, 0x0a, 0x0c, 0x41, 0x73, - 0x73, 0x65, 0x74, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x38, 0x0a, 0x0d, 0x61, 0x73, - 0x73, 0x65, 0x74, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x13, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x73, - 0x69, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0c, 0x61, 0x73, 0x73, 0x65, 0x74, 0x47, 0x65, 0x6e, - 0x65, 0x73, 0x69, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x22, 0x4a, - 0x0a, 0x11, 0x41, 0x73, 0x73, 0x65, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x42, 0x61, 0x6c, 0x61, - 0x6e, 0x63, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6b, 0x65, 0x79, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x4b, 0x65, 0x79, - 0x12, 0x18, 0x0a, 0x07, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x04, 0x52, 0x07, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x22, 0x90, 0x03, 0x0a, 0x14, 0x4c, - 0x69, 0x73, 0x74, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x56, 0x0a, 0x0e, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x62, 0x61, 0x6c, - 0x61, 0x6e, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, 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, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x42, - 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0d, 0x61, 0x73, - 0x73, 0x65, 0x74, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x12, 0x66, 0x0a, 0x14, 0x61, - 0x73, 0x73, 0x65, 0x74, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x62, 0x61, 0x6c, 0x61, 0x6e, - 0x63, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 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, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x47, 0x72, 0x6f, - 0x75, 0x70, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, - 0x12, 0x61, 0x73, 0x73, 0x65, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x42, 0x61, 0x6c, 0x61, 0x6e, - 0x63, 0x65, 0x73, 0x1a, 0x56, 0x0a, 0x12, 0x41, 0x73, 0x73, 0x65, 0x74, 0x42, 0x61, 0x6c, 0x61, - 0x6e, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2a, 0x0a, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x74, 0x61, 0x70, - 0x72, 0x70, 0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, - 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x60, 0x0a, 0x17, 0x41, - 0x73, 0x73, 0x65, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, - 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2f, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, - 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x42, 0x61, 0x6c, 0x61, 0x6e, - 0x63, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x37, 0x0a, - 0x14, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x5f, - 0x74, 0x78, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x61, 0x6e, 0x63, 0x68, - 0x6f, 0x72, 0x54, 0x78, 0x69, 0x64, 0x22, 0x4c, 0x0a, 0x15, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x72, - 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x33, 0x0a, 0x09, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, - 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, 0x09, 0x74, 0x72, 0x61, 0x6e, 0x73, - 0x66, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x0a, 0x09, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x48, 0x61, 0x73, - 0x68, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x61, 0x73, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, - 0x04, 0x68, 0x61, 0x73, 0x68, 0x12, 0x19, 0x0a, 0x08, 0x68, 0x61, 0x73, 0x68, 0x5f, 0x73, 0x74, - 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x68, 0x61, 0x73, 0x68, 0x53, 0x74, 0x72, - 0x22, 0xb8, 0x03, 0x0a, 0x0d, 0x41, 0x73, 0x73, 0x65, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, - 0x65, 0x72, 0x12, 0x2d, 0x0a, 0x12, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x5f, 0x74, - 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, - 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, - 0x70, 0x12, 0x24, 0x0a, 0x0e, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x5f, 0x74, 0x78, 0x5f, 0x68, - 0x61, 0x73, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0c, 0x61, 0x6e, 0x63, 0x68, 0x6f, - 0x72, 0x54, 0x78, 0x48, 0x61, 0x73, 0x68, 0x12, 0x31, 0x0a, 0x15, 0x61, 0x6e, 0x63, 0x68, 0x6f, - 0x72, 0x5f, 0x74, 0x78, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x68, 0x69, 0x6e, 0x74, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x12, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x54, 0x78, - 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x48, 0x69, 0x6e, 0x74, 0x12, 0x2f, 0x0a, 0x14, 0x61, 0x6e, - 0x63, 0x68, 0x6f, 0x72, 0x5f, 0x74, 0x78, 0x5f, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x66, 0x65, - 0x65, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, - 0x54, 0x78, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x46, 0x65, 0x65, 0x73, 0x12, 0x2d, 0x0a, 0x06, 0x69, - 0x6e, 0x70, 0x75, 0x74, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x61, - 0x70, 0x72, 0x70, 0x63, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x49, 0x6e, 0x70, - 0x75, 0x74, 0x52, 0x06, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x12, 0x30, 0x0a, 0x07, 0x6f, 0x75, - 0x74, 0x70, 0x75, 0x74, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x74, 0x61, - 0x70, 0x72, 0x70, 0x63, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x4f, 0x75, 0x74, - 0x70, 0x75, 0x74, 0x52, 0x07, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x73, 0x12, 0x42, 0x0a, 0x14, - 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x5f, 0x74, 0x78, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, - 0x68, 0x61, 0x73, 0x68, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x74, 0x61, 0x70, - 0x72, 0x70, 0x63, 0x2e, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x48, 0x61, 0x73, 0x68, 0x52, 0x11, 0x61, - 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x54, 0x78, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x61, 0x73, 0x68, - 0x12, 0x33, 0x0a, 0x16, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x5f, 0x74, 0x78, 0x5f, 0x62, 0x6c, - 0x6f, 0x63, 0x6b, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0d, - 0x52, 0x13, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x54, 0x78, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, - 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x09, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x22, 0x84, 0x01, 0x0a, 0x0d, - 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x49, 0x6e, 0x70, 0x75, 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, 0xb2, 0x02, 0x0a, 0x14, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x4f, - 0x75, 0x74, 0x70, 0x75, 0x74, 0x41, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x12, 0x1a, 0x0a, 0x08, 0x6f, - 0x75, 0x74, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6f, - 0x75, 0x74, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x21, 0x0a, - 0x0c, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x0c, 0x52, 0x0b, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x4b, 0x65, 0x79, - 0x12, 0x2c, 0x0a, 0x12, 0x74, 0x61, 0x70, 0x72, 0x6f, 0x6f, 0x74, 0x5f, 0x61, 0x73, 0x73, 0x65, - 0x74, 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x10, 0x74, 0x61, - 0x70, 0x72, 0x6f, 0x6f, 0x74, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x6f, 0x6f, 0x74, 0x12, 0x1f, - 0x0a, 0x0b, 0x6d, 0x65, 0x72, 0x6b, 0x6c, 0x65, 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x0c, 0x52, 0x0a, 0x6d, 0x65, 0x72, 0x6b, 0x6c, 0x65, 0x52, 0x6f, 0x6f, 0x74, 0x12, - 0x2b, 0x0a, 0x11, 0x74, 0x61, 0x70, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x5f, 0x73, 0x69, 0x62, - 0x6c, 0x69, 0x6e, 0x67, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x10, 0x74, 0x61, 0x70, 0x73, - 0x63, 0x72, 0x69, 0x70, 0x74, 0x53, 0x69, 0x62, 0x6c, 0x69, 0x6e, 0x67, 0x12, 0x2c, 0x0a, 0x12, - 0x6e, 0x75, 0x6d, 0x5f, 0x70, 0x61, 0x73, 0x73, 0x69, 0x76, 0x65, 0x5f, 0x61, 0x73, 0x73, 0x65, - 0x74, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x10, 0x6e, 0x75, 0x6d, 0x50, 0x61, 0x73, - 0x73, 0x69, 0x76, 0x65, 0x41, 0x73, 0x73, 0x65, 0x74, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6b, - 0x5f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x70, - 0x6b, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x22, 0xae, 0x04, 0x0a, 0x0e, 0x54, 0x72, 0x61, 0x6e, - 0x73, 0x66, 0x65, 0x72, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x34, 0x0a, 0x06, 0x61, 0x6e, - 0x63, 0x68, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x74, 0x61, 0x70, - 0x72, 0x70, 0x63, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x4f, 0x75, 0x74, 0x70, - 0x75, 0x74, 0x41, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x52, 0x06, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, + 0x18, 0x14, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, + 0x44, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x44, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x52, 0x0e, + 0x64, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x44, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x12, 0x3d, + 0x0a, 0x0f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x74, 0x79, 0x70, + 0x65, 0x18, 0x15, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, + 0x2e, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x4b, 0x65, 0x79, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0d, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x4b, 0x65, 0x79, 0x54, 0x79, 0x70, 0x65, 0x22, 0xa1, 0x01, + 0x0a, 0x0b, 0x50, 0x72, 0x65, 0x76, 0x57, 0x69, 0x74, 0x6e, 0x65, 0x73, 0x73, 0x12, 0x2f, 0x0a, + 0x07, 0x70, 0x72, 0x65, 0x76, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, + 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x50, 0x72, 0x65, 0x76, 0x49, 0x6e, 0x70, 0x75, + 0x74, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x06, 0x70, 0x72, 0x65, 0x76, 0x49, 0x64, 0x12, 0x1d, + 0x0a, 0x0a, 0x74, 0x78, 0x5f, 0x77, 0x69, 0x74, 0x6e, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x03, + 0x28, 0x0c, 0x52, 0x09, 0x74, 0x78, 0x57, 0x69, 0x74, 0x6e, 0x65, 0x73, 0x73, 0x12, 0x42, 0x0a, + 0x10, 0x73, 0x70, 0x6c, 0x69, 0x74, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, + 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, + 0x2e, 0x53, 0x70, 0x6c, 0x69, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, + 0x52, 0x0f, 0x73, 0x70, 0x6c, 0x69, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, + 0x74, 0x22, 0x3f, 0x0a, 0x0f, 0x53, 0x70, 0x6c, 0x69, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, + 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x2c, 0x0a, 0x0a, 0x72, 0x6f, 0x6f, 0x74, 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, 0x09, 0x72, 0x6f, 0x6f, 0x74, 0x41, 0x73, 0x73, + 0x65, 0x74, 0x22, 0x9c, 0x01, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x73, 0x73, 0x65, 0x74, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x25, 0x0a, 0x06, 0x61, 0x73, 0x73, 0x65, + 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, + 0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x06, 0x61, 0x73, 0x73, 0x65, 0x74, 0x73, 0x12, + 0x33, 0x0a, 0x15, 0x75, 0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x65, 0x64, 0x5f, 0x74, + 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x14, + 0x75, 0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x65, 0x64, 0x54, 0x72, 0x61, 0x6e, 0x73, + 0x66, 0x65, 0x72, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x75, 0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, + 0x6d, 0x65, 0x64, 0x5f, 0x6d, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, + 0x10, 0x75, 0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x65, 0x64, 0x4d, 0x69, 0x6e, 0x74, + 0x73, 0x22, 0x7d, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x74, 0x78, 0x6f, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, + 0x5f, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x69, + 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x4c, 0x65, 0x61, 0x73, 0x65, 0x64, 0x12, 0x42, 0x0a, 0x0f, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x53, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x4b, 0x65, 0x79, 0x54, 0x79, 0x70, 0x65, 0x51, 0x75, 0x65, 0x72, + 0x79, 0x52, 0x0d, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x4b, 0x65, 0x79, 0x54, 0x79, 0x70, 0x65, + 0x22, 0xa9, 0x02, 0x0a, 0x0b, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x55, 0x74, 0x78, 0x6f, + 0x12, 0x1b, 0x0a, 0x09, 0x6f, 0x75, 0x74, 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x6f, 0x75, 0x74, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x17, 0x0a, + 0x07, 0x61, 0x6d, 0x74, 0x5f, 0x73, 0x61, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, + 0x61, 0x6d, 0x74, 0x53, 0x61, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, + 0x61, 0x6c, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0b, 0x69, 0x6e, + 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x4b, 0x65, 0x79, 0x12, 0x2c, 0x0a, 0x12, 0x74, 0x61, 0x70, + 0x72, 0x6f, 0x6f, 0x74, 0x5f, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x10, 0x74, 0x61, 0x70, 0x72, 0x6f, 0x6f, 0x74, 0x41, 0x73, + 0x73, 0x65, 0x74, 0x52, 0x6f, 0x6f, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x6d, 0x65, 0x72, 0x6b, 0x6c, + 0x65, 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0a, 0x6d, 0x65, + 0x72, 0x6b, 0x6c, 0x65, 0x52, 0x6f, 0x6f, 0x74, 0x12, 0x25, 0x0a, 0x06, 0x61, 0x73, 0x73, 0x65, + 0x74, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, + 0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x06, 0x61, 0x73, 0x73, 0x65, 0x74, 0x73, 0x12, + 0x1f, 0x0a, 0x0b, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x5f, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, 0x07, + 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0a, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x4f, 0x77, 0x6e, 0x65, 0x72, + 0x12, 0x2a, 0x0a, 0x11, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x5f, 0x65, 0x78, 0x70, 0x69, 0x72, 0x79, + 0x5f, 0x75, 0x6e, 0x69, 0x78, 0x18, 0x08, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x6c, 0x65, 0x61, + 0x73, 0x65, 0x45, 0x78, 0x70, 0x69, 0x72, 0x79, 0x55, 0x6e, 0x69, 0x78, 0x22, 0xbb, 0x01, 0x0a, + 0x11, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x74, 0x78, 0x6f, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x50, 0x0a, 0x0d, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x5f, 0x75, 0x74, + 0x78, 0x6f, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2b, 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, 0x2e, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x55, 0x74, 0x78, 0x6f, + 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x55, + 0x74, 0x78, 0x6f, 0x73, 0x1a, 0x54, 0x0a, 0x11, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x55, + 0x74, 0x78, 0x6f, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x29, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x74, 0x61, 0x70, + 0x72, 0x70, 0x63, 0x2e, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x55, 0x74, 0x78, 0x6f, 0x52, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x13, 0x0a, 0x11, 0x4c, 0x69, + 0x73, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, + 0x8d, 0x02, 0x0a, 0x12, 0x41, 0x73, 0x73, 0x65, 0x74, 0x48, 0x75, 0x6d, 0x61, 0x6e, 0x52, 0x65, + 0x61, 0x64, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0c, 0x52, 0x02, 0x69, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1b, + 0x0a, 0x09, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x6b, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x2c, 0x0a, 0x12, 0x72, + 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x74, 0x69, 0x6d, + 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x10, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, + 0x65, 0x4c, 0x6f, 0x63, 0x6b, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x61, 0x67, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x74, 0x61, 0x67, 0x12, 0x1b, 0x0a, 0x09, 0x6d, + 0x65, 0x74, 0x61, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, + 0x6d, 0x65, 0x74, 0x61, 0x48, 0x61, 0x73, 0x68, 0x12, 0x25, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, + 0x18, 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x11, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, + 0x41, 0x73, 0x73, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, + 0x2e, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x08, 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, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, + 0x43, 0x0a, 0x0d, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x65, 0x64, 0x41, 0x73, 0x73, 0x65, 0x74, 0x73, + 0x12, 0x32, 0x0a, 0x06, 0x61, 0x73, 0x73, 0x65, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x1a, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x48, + 0x75, 0x6d, 0x61, 0x6e, 0x52, 0x65, 0x61, 0x64, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x06, 0x61, 0x73, + 0x73, 0x65, 0x74, 0x73, 0x22, 0xa6, 0x01, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x72, 0x6f, + 0x75, 0x70, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3e, 0x0a, 0x06, 0x67, + 0x72, 0x6f, 0x75, 0x70, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 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, 0x2e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x52, 0x06, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x1a, 0x50, 0x0a, 0x0b, 0x47, + 0x72, 0x6f, 0x75, 0x70, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, + 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2b, 0x0a, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x61, + 0x70, 0x72, 0x70, 0x63, 0x2e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x65, 0x64, 0x41, 0x73, 0x73, 0x65, + 0x74, 0x73, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x95, 0x02, + 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x08, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x07, 0x61, 0x73, 0x73, 0x65, 0x74, + 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x09, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6b, 0x65, 0x79, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x08, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x4b, 0x65, + 0x79, 0x12, 0x21, 0x0a, 0x0c, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, + 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0b, 0x61, 0x73, 0x73, 0x65, 0x74, 0x46, 0x69, + 0x6c, 0x74, 0x65, 0x72, 0x12, 0x28, 0x0a, 0x10, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6b, 0x65, + 0x79, 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0e, + 0x67, 0x72, 0x6f, 0x75, 0x70, 0x4b, 0x65, 0x79, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x25, + 0x0a, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x64, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x4c, + 0x65, 0x61, 0x73, 0x65, 0x64, 0x12, 0x42, 0x0a, 0x0f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x5f, + 0x6b, 0x65, 0x79, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, + 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x4b, 0x65, + 0x79, 0x54, 0x79, 0x70, 0x65, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x0d, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x4b, 0x65, 0x79, 0x54, 0x79, 0x70, 0x65, 0x42, 0x0a, 0x0a, 0x08, 0x67, 0x72, 0x6f, + 0x75, 0x70, 0x5f, 0x62, 0x79, 0x22, 0x62, 0x0a, 0x0c, 0x41, 0x73, 0x73, 0x65, 0x74, 0x42, 0x61, + 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x38, 0x0a, 0x0d, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x67, + 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x74, + 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x49, 0x6e, 0x66, + 0x6f, 0x52, 0x0c, 0x61, 0x73, 0x73, 0x65, 0x74, 0x47, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x12, + 0x18, 0x0a, 0x07, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, + 0x52, 0x07, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x22, 0x4a, 0x0a, 0x11, 0x41, 0x73, 0x73, + 0x65, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x1b, + 0x0a, 0x09, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0c, 0x52, 0x08, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x4b, 0x65, 0x79, 0x12, 0x18, 0x0a, 0x07, 0x62, + 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x62, 0x61, + 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x22, 0x90, 0x03, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x61, + 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x56, + 0x0a, 0x0e, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, 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, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, + 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0d, 0x61, 0x73, 0x73, 0x65, 0x74, 0x42, 0x61, + 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x12, 0x66, 0x0a, 0x14, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, + 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x18, 0x02, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 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, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x42, 0x61, 0x6c, + 0x61, 0x6e, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x12, 0x61, 0x73, 0x73, 0x65, + 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x1a, 0x56, + 0x0a, 0x12, 0x41, 0x73, 0x73, 0x65, 0x74, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2a, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, + 0x73, 0x73, 0x65, 0x74, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x60, 0x0a, 0x17, 0x41, 0x73, 0x73, 0x65, 0x74, 0x47, + 0x72, 0x6f, 0x75, 0x70, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, + 0x6b, 0x65, 0x79, 0x12, 0x2f, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, + 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x37, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, + 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x5f, 0x74, 0x78, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x54, 0x78, 0x69, + 0x64, 0x22, 0x4c, 0x0a, 0x15, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, + 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x33, 0x0a, 0x09, 0x74, 0x72, + 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 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, 0x09, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x73, 0x22, + 0x3a, 0x0a, 0x09, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x48, 0x61, 0x73, 0x68, 0x12, 0x12, 0x0a, 0x04, + 0x68, 0x61, 0x73, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x68, 0x61, 0x73, 0x68, + 0x12, 0x19, 0x0a, 0x08, 0x68, 0x61, 0x73, 0x68, 0x5f, 0x73, 0x74, 0x72, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x07, 0x68, 0x61, 0x73, 0x68, 0x53, 0x74, 0x72, 0x22, 0xb8, 0x03, 0x0a, 0x0d, + 0x41, 0x73, 0x73, 0x65, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x12, 0x2d, 0x0a, + 0x12, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x74, 0x72, 0x61, 0x6e, 0x73, + 0x66, 0x65, 0x72, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x24, 0x0a, 0x0e, + 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x5f, 0x74, 0x78, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0c, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x54, 0x78, 0x48, 0x61, + 0x73, 0x68, 0x12, 0x31, 0x0a, 0x15, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x5f, 0x74, 0x78, 0x5f, + 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x68, 0x69, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x12, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x54, 0x78, 0x48, 0x65, 0x69, 0x67, 0x68, + 0x74, 0x48, 0x69, 0x6e, 0x74, 0x12, 0x2f, 0x0a, 0x14, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x5f, + 0x74, 0x78, 0x5f, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x66, 0x65, 0x65, 0x73, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x11, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x54, 0x78, 0x43, 0x68, 0x61, + 0x69, 0x6e, 0x46, 0x65, 0x65, 0x73, 0x12, 0x2d, 0x0a, 0x06, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x73, + 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, + 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x52, 0x06, 0x69, + 0x6e, 0x70, 0x75, 0x74, 0x73, 0x12, 0x30, 0x0a, 0x07, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x73, + 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, + 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x52, 0x07, + 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x73, 0x12, 0x42, 0x0a, 0x14, 0x61, 0x6e, 0x63, 0x68, 0x6f, + 0x72, 0x5f, 0x74, 0x78, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, + 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x43, + 0x68, 0x61, 0x69, 0x6e, 0x48, 0x61, 0x73, 0x68, 0x52, 0x11, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, + 0x54, 0x78, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x61, 0x73, 0x68, 0x12, 0x33, 0x0a, 0x16, 0x61, + 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x5f, 0x74, 0x78, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x68, + 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x13, 0x61, 0x6e, 0x63, + 0x68, 0x6f, 0x72, 0x54, 0x78, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, + 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x22, 0x84, 0x01, 0x0a, 0x0d, 0x54, 0x72, 0x61, 0x6e, 0x73, + 0x66, 0x65, 0x72, 0x49, 0x6e, 0x70, 0x75, 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, 0xb2, 0x02, + 0x0a, 0x14, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, + 0x41, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x12, 0x1a, 0x0a, 0x08, 0x6f, 0x75, 0x74, 0x70, 0x6f, 0x69, + 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6f, 0x75, 0x74, 0x70, 0x6f, 0x69, + 0x6e, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x69, 0x6e, 0x74, 0x65, + 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0b, + 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x4b, 0x65, 0x79, 0x12, 0x2c, 0x0a, 0x12, 0x74, + 0x61, 0x70, 0x72, 0x6f, 0x6f, 0x74, 0x5f, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x72, 0x6f, 0x6f, + 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x10, 0x74, 0x61, 0x70, 0x72, 0x6f, 0x6f, 0x74, + 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x6f, 0x6f, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x6d, 0x65, 0x72, + 0x6b, 0x6c, 0x65, 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0a, + 0x6d, 0x65, 0x72, 0x6b, 0x6c, 0x65, 0x52, 0x6f, 0x6f, 0x74, 0x12, 0x2b, 0x0a, 0x11, 0x74, 0x61, + 0x70, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x5f, 0x73, 0x69, 0x62, 0x6c, 0x69, 0x6e, 0x67, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x10, 0x74, 0x61, 0x70, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x53, 0x69, 0x62, 0x6c, 0x69, 0x6e, 0x67, 0x12, 0x2c, 0x0a, 0x12, 0x6e, 0x75, 0x6d, 0x5f, 0x70, + 0x61, 0x73, 0x73, 0x69, 0x76, 0x65, 0x5f, 0x61, 0x73, 0x73, 0x65, 0x74, 0x73, 0x18, 0x07, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x10, 0x6e, 0x75, 0x6d, 0x50, 0x61, 0x73, 0x73, 0x69, 0x76, 0x65, 0x41, + 0x73, 0x73, 0x65, 0x74, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6b, 0x5f, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x70, 0x6b, 0x53, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x22, 0xae, 0x04, 0x0a, 0x0e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x4f, + 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x34, 0x0a, 0x06, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x54, + 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x41, 0x6e, 0x63, + 0x68, 0x6f, 0x72, 0x52, 0x06, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 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, 0x2d, 0x0a, 0x13, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x69, 0x73, 0x5f, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x4b, + 0x65, 0x79, 0x49, 0x73, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 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, 0x24, 0x0a, 0x0e, 0x6e, 0x65, 0x77, 0x5f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x5f, 0x62, + 0x6c, 0x6f, 0x62, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0c, 0x6e, 0x65, 0x77, 0x50, 0x72, + 0x6f, 0x6f, 0x66, 0x42, 0x6c, 0x6f, 0x62, 0x12, 0x33, 0x0a, 0x16, 0x73, 0x70, 0x6c, 0x69, 0x74, + 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x5f, 0x68, 0x61, 0x73, + 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x13, 0x73, 0x70, 0x6c, 0x69, 0x74, 0x43, 0x6f, + 0x6d, 0x6d, 0x69, 0x74, 0x52, 0x6f, 0x6f, 0x74, 0x48, 0x61, 0x73, 0x68, 0x12, 0x33, 0x0a, 0x0b, + 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x12, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4f, 0x75, 0x74, 0x70, 0x75, + 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0a, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x54, 0x79, 0x70, + 0x65, 0x12, 0x39, 0x0a, 0x0d, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x18, 0x08, 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, 0x1b, 0x0a, 0x09, + 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x04, 0x52, + 0x08, 0x6c, 0x6f, 0x63, 0x6b, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x2c, 0x0a, 0x12, 0x72, 0x65, 0x6c, + 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, + 0x0a, 0x20, 0x01, 0x28, 0x04, 0x52, 0x10, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x4c, + 0x6f, 0x63, 0x6b, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x4f, 0x0a, 0x15, 0x70, 0x72, 0x6f, 0x6f, 0x66, + 0x5f, 0x64, 0x65, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x79, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1b, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, + 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x44, 0x65, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x79, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x52, 0x13, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x44, 0x65, 0x6c, 0x69, 0x76, 0x65, + 0x72, 0x79, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x73, 0x73, 0x65, + 0x74, 0x5f, 0x69, 0x64, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x61, 0x73, 0x73, 0x65, + 0x74, 0x49, 0x64, 0x22, 0x0d, 0x0a, 0x0b, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x22, 0x0e, 0x0a, 0x0c, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x46, 0x0a, 0x11, 0x44, 0x65, 0x62, 0x75, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x68, 0x6f, 0x77, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x73, 0x68, 0x6f, 0x77, 0x12, 0x1d, 0x0a, 0x0a, 0x6c, + 0x65, 0x76, 0x65, 0x6c, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x09, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x53, 0x70, 0x65, 0x63, 0x22, 0x35, 0x0a, 0x12, 0x44, 0x65, + 0x62, 0x75, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x75, 0x62, 0x5f, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x73, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x75, 0x62, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, + 0x73, 0x22, 0xe6, 0x03, 0x0a, 0x04, 0x41, 0x64, 0x64, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, + 0x63, 0x6f, 0x64, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x65, 0x6e, 0x63, + 0x6f, 0x64, 0x65, 0x64, 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, + 0x30, 0x0a, 0x0a, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 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, 0x16, 0x0a, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x67, 0x72, 0x6f, + 0x75, 0x70, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x05, 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, 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x4b, 0x65, 0x79, 0x12, 0x21, 0x0a, 0x0c, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, + 0x6c, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0b, 0x69, 0x6e, 0x74, + 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x4b, 0x65, 0x79, 0x12, 0x2b, 0x0a, 0x11, 0x74, 0x61, 0x70, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x5f, 0x73, 0x69, 0x62, 0x6c, 0x69, 0x6e, 0x67, 0x18, 0x08, 0x20, + 0x01, 0x28, 0x0c, 0x52, 0x10, 0x74, 0x61, 0x70, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x53, 0x69, + 0x62, 0x6c, 0x69, 0x6e, 0x67, 0x12, 0x2c, 0x0a, 0x12, 0x74, 0x61, 0x70, 0x72, 0x6f, 0x6f, 0x74, + 0x5f, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x09, 0x20, 0x01, 0x28, + 0x0c, 0x52, 0x10, 0x74, 0x61, 0x70, 0x72, 0x6f, 0x6f, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, + 0x4b, 0x65, 0x79, 0x12, 0x2c, 0x0a, 0x12, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x5f, 0x63, 0x6f, 0x75, + 0x72, 0x69, 0x65, 0x72, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x10, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x43, 0x6f, 0x75, 0x72, 0x69, 0x65, 0x72, 0x41, 0x64, 0x64, + 0x72, 0x12, 0x39, 0x0a, 0x0d, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x18, 0x0b, 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, 0x3c, 0x0a, 0x0f, + 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, + 0x0c, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x13, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, + 0x64, 0x64, 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x0e, 0x61, 0x64, 0x64, 0x72, + 0x65, 0x73, 0x73, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x8c, 0x01, 0x0a, 0x10, 0x51, + 0x75, 0x65, 0x72, 0x79, 0x41, 0x64, 0x64, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x23, 0x0a, 0x0d, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x66, 0x74, 0x65, 0x72, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, + 0x66, 0x74, 0x65, 0x72, 0x12, 0x25, 0x0a, 0x0e, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, + 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x63, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x64, 0x42, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6c, + 0x69, 0x6d, 0x69, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, + 0x74, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x22, 0x37, 0x0a, 0x11, 0x51, 0x75, 0x65, + 0x72, 0x79, 0x41, 0x64, 0x64, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x22, + 0x0a, 0x05, 0x61, 0x64, 0x64, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0c, 0x2e, + 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x52, 0x05, 0x61, 0x64, 0x64, + 0x72, 0x73, 0x22, 0xfd, 0x02, 0x0a, 0x0e, 0x4e, 0x65, 0x77, 0x41, 0x64, 0x64, 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, 0x10, 0x0a, 0x03, 0x61, 0x6d, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x03, 0x61, + 0x6d, 0x74, 0x12, 0x30, 0x0a, 0x0a, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x5f, 0x6b, 0x65, 0x79, + 0x18, 0x03, 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, 0x38, 0x0a, 0x0c, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, + 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x04, 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, 0x12, 0x2b, + 0x0a, 0x11, 0x74, 0x61, 0x70, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x5f, 0x73, 0x69, 0x62, 0x6c, + 0x69, 0x6e, 0x67, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x10, 0x74, 0x61, 0x70, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x53, 0x69, 0x62, 0x6c, 0x69, 0x6e, 0x67, 0x12, 0x2c, 0x0a, 0x12, 0x70, + 0x72, 0x6f, 0x6f, 0x66, 0x5f, 0x63, 0x6f, 0x75, 0x72, 0x69, 0x65, 0x72, 0x5f, 0x61, 0x64, 0x64, + 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x43, 0x6f, + 0x75, 0x72, 0x69, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x12, 0x39, 0x0a, 0x0d, 0x61, 0x73, 0x73, + 0x65, 0x74, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x07, 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, 0x3c, 0x0a, 0x0f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x5f, + 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x13, 0x2e, + 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x52, 0x0e, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x56, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x22, 0x79, 0x0a, 0x12, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x4b, 0x65, 0x79, 0x54, + 0x79, 0x70, 0x65, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x3c, 0x0a, 0x0d, 0x65, 0x78, 0x70, 0x6c, + 0x69, 0x63, 0x69, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x15, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x4b, + 0x65, 0x79, 0x54, 0x79, 0x70, 0x65, 0x48, 0x00, 0x52, 0x0c, 0x65, 0x78, 0x70, 0x6c, 0x69, 0x63, + 0x69, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1d, 0x0a, 0x09, 0x61, 0x6c, 0x6c, 0x5f, 0x74, 0x79, + 0x70, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x08, 0x61, 0x6c, 0x6c, + 0x54, 0x79, 0x70, 0x65, 0x73, 0x42, 0x06, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x9e, 0x01, + 0x0a, 0x09, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x4b, 0x65, 0x79, 0x12, 0x17, 0x0a, 0x07, 0x70, + 0x75, 0x62, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x70, 0x75, + 0x62, 0x4b, 0x65, 0x79, 0x12, 0x30, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x5f, 0x64, 0x65, 0x73, 0x63, + 0x18, 0x02, 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, 0x07, 0x6b, + 0x65, 0x79, 0x44, 0x65, 0x73, 0x63, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x61, 0x70, 0x5f, 0x74, 0x77, + 0x65, 0x61, 0x6b, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x74, 0x61, 0x70, 0x54, 0x77, + 0x65, 0x61, 0x6b, 0x12, 0x29, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x15, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x4b, 0x65, 0x79, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x48, + 0x0a, 0x0a, 0x4b, 0x65, 0x79, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x1d, 0x0a, 0x0a, + 0x6b, 0x65, 0x79, 0x5f, 0x66, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x09, 0x6b, 0x65, 0x79, 0x46, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x12, 0x1b, 0x0a, 0x09, 0x6b, + 0x65, 0x79, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, + 0x6b, 0x65, 0x79, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x60, 0x0a, 0x0d, 0x4b, 0x65, 0x79, 0x44, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x12, 0x22, 0x0a, 0x0d, 0x72, 0x61, 0x77, + 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, + 0x52, 0x0b, 0x72, 0x61, 0x77, 0x4b, 0x65, 0x79, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x2b, 0x0a, + 0x07, 0x6b, 0x65, 0x79, 0x5f, 0x6c, 0x6f, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, + 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4b, 0x65, 0x79, 0x4c, 0x6f, 0x63, 0x61, 0x74, + 0x6f, 0x72, 0x52, 0x06, 0x6b, 0x65, 0x79, 0x4c, 0x6f, 0x63, 0x22, 0x43, 0x0a, 0x11, 0x54, 0x61, + 0x70, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x46, 0x75, 0x6c, 0x6c, 0x54, 0x72, 0x65, 0x65, 0x12, + 0x2e, 0x0a, 0x0a, 0x61, 0x6c, 0x6c, 0x5f, 0x6c, 0x65, 0x61, 0x76, 0x65, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x54, 0x61, 0x70, + 0x4c, 0x65, 0x61, 0x66, 0x52, 0x09, 0x61, 0x6c, 0x6c, 0x4c, 0x65, 0x61, 0x76, 0x65, 0x73, 0x22, + 0x21, 0x0a, 0x07, 0x54, 0x61, 0x70, 0x4c, 0x65, 0x61, 0x66, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x22, 0x53, 0x0a, 0x09, 0x54, 0x61, 0x70, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x12, + 0x21, 0x0a, 0x0c, 0x6c, 0x65, 0x66, 0x74, 0x5f, 0x74, 0x61, 0x70, 0x68, 0x61, 0x73, 0x68, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0b, 0x6c, 0x65, 0x66, 0x74, 0x54, 0x61, 0x70, 0x68, 0x61, + 0x73, 0x68, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x74, 0x61, 0x70, 0x68, + 0x61, 0x73, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0c, 0x72, 0x69, 0x67, 0x68, 0x74, + 0x54, 0x61, 0x70, 0x68, 0x61, 0x73, 0x68, 0x22, 0x27, 0x0a, 0x11, 0x44, 0x65, 0x63, 0x6f, 0x64, + 0x65, 0x41, 0x64, 0x64, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, + 0x61, 0x64, 0x64, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x61, 0x64, 0x64, 0x72, + 0x22, 0x56, 0x0a, 0x09, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x24, 0x0a, + 0x0e, 0x72, 0x61, 0x77, 0x5f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0c, 0x72, 0x61, 0x77, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x46, + 0x69, 0x6c, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x67, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x5f, 0x70, + 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x67, 0x65, 0x6e, 0x65, + 0x73, 0x69, 0x73, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x22, 0xf6, 0x04, 0x0a, 0x0c, 0x44, 0x65, 0x63, + 0x6f, 0x64, 0x65, 0x64, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x24, 0x0a, 0x0e, 0x70, 0x72, 0x6f, + 0x6f, 0x66, 0x5f, 0x61, 0x74, 0x5f, 0x64, 0x65, 0x70, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x41, 0x74, 0x44, 0x65, 0x70, 0x74, 0x68, 0x12, + 0x28, 0x0a, 0x10, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x5f, 0x6f, 0x66, 0x5f, 0x70, 0x72, 0x6f, + 0x6f, 0x66, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0e, 0x6e, 0x75, 0x6d, 0x62, 0x65, + 0x72, 0x4f, 0x66, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x73, 0x12, 0x23, 0x0a, 0x05, 0x61, 0x73, 0x73, + 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, + 0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x05, 0x61, 0x73, 0x73, 0x65, 0x74, 0x12, 0x32, + 0x0a, 0x0b, 0x6d, 0x65, 0x74, 0x61, 0x5f, 0x72, 0x65, 0x76, 0x65, 0x61, 0x6c, 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, 0x0a, 0x6d, 0x65, 0x74, 0x61, 0x52, 0x65, 0x76, 0x65, + 0x61, 0x6c, 0x12, 0x26, 0x0a, 0x0f, 0x74, 0x78, 0x5f, 0x6d, 0x65, 0x72, 0x6b, 0x6c, 0x65, 0x5f, + 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0d, 0x74, 0x78, 0x4d, + 0x65, 0x72, 0x6b, 0x6c, 0x65, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x27, 0x0a, 0x0f, 0x69, 0x6e, + 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x0c, 0x52, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, + 0x6f, 0x6f, 0x66, 0x12, 0x29, 0x0a, 0x10, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, + 0x5f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x0f, 0x65, + 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x73, 0x12, 0x28, + 0x0a, 0x10, 0x73, 0x70, 0x6c, 0x69, 0x74, 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x5f, 0x70, 0x72, 0x6f, + 0x6f, 0x66, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0e, 0x73, 0x70, 0x6c, 0x69, 0x74, 0x52, + 0x6f, 0x6f, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x32, 0x0a, 0x15, 0x6e, 0x75, 0x6d, 0x5f, + 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x69, 0x6e, 0x70, 0x75, 0x74, + 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x13, 0x6e, 0x75, 0x6d, 0x41, 0x64, 0x64, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x12, 0x2b, 0x0a, 0x11, + 0x63, 0x68, 0x61, 0x6c, 0x6c, 0x65, 0x6e, 0x67, 0x65, 0x5f, 0x77, 0x69, 0x74, 0x6e, 0x65, 0x73, + 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x10, 0x63, 0x68, 0x61, 0x6c, 0x6c, 0x65, 0x6e, + 0x67, 0x65, 0x57, 0x69, 0x74, 0x6e, 0x65, 0x73, 0x73, 0x12, 0x17, 0x0a, 0x07, 0x69, 0x73, 0x5f, + 0x62, 0x75, 0x72, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x69, 0x73, 0x42, 0x75, + 0x72, 0x6e, 0x12, 0x3c, 0x0a, 0x0e, 0x67, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x5f, 0x72, 0x65, + 0x76, 0x65, 0x61, 0x6c, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x61, 0x70, + 0x72, 0x70, 0x63, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x52, 0x65, 0x76, 0x65, 0x61, + 0x6c, 0x52, 0x0d, 0x67, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x52, 0x65, 0x76, 0x65, 0x61, 0x6c, + 0x12, 0x40, 0x0a, 0x10, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x72, 0x65, + 0x76, 0x65, 0x61, 0x6c, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x74, 0x61, 0x70, + 0x72, 0x70, 0x63, 0x2e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x76, 0x65, + 0x61, 0x6c, 0x52, 0x0e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x76, 0x65, + 0x61, 0x6c, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x6c, 0x74, 0x5f, 0x6c, 0x65, 0x61, 0x76, 0x65, 0x73, + 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x61, 0x6c, 0x74, 0x4c, 0x65, 0x61, 0x76, 0x65, + 0x73, 0x22, 0x66, 0x0a, 0x13, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x50, 0x72, 0x6f, 0x6f, 0x66, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x12, 0x39, + 0x0a, 0x0d, 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x64, 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, 0x0c, 0x64, 0x65, 0x63, + 0x6f, 0x64, 0x65, 0x64, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x22, 0xb1, 0x01, 0x0a, 0x12, 0x44, 0x65, + 0x63, 0x6f, 0x64, 0x65, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x1b, 0x0a, 0x09, 0x72, 0x61, 0x77, 0x5f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0c, 0x52, 0x08, 0x72, 0x61, 0x77, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x24, 0x0a, + 0x0e, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x5f, 0x61, 0x74, 0x5f, 0x64, 0x65, 0x70, 0x74, 0x68, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x41, 0x74, 0x44, 0x65, + 0x70, 0x74, 0x68, 0x12, 0x2e, 0x0a, 0x13, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x70, 0x72, 0x65, 0x76, + 0x5f, 0x77, 0x69, 0x74, 0x6e, 0x65, 0x73, 0x73, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x11, 0x77, 0x69, 0x74, 0x68, 0x50, 0x72, 0x65, 0x76, 0x57, 0x69, 0x74, 0x6e, 0x65, 0x73, + 0x73, 0x65, 0x73, 0x12, 0x28, 0x0a, 0x10, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x61, + 0x5f, 0x72, 0x65, 0x76, 0x65, 0x61, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x77, + 0x69, 0x74, 0x68, 0x4d, 0x65, 0x74, 0x61, 0x52, 0x65, 0x76, 0x65, 0x61, 0x6c, 0x22, 0x50, 0x0a, + 0x13, 0x44, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x39, 0x0a, 0x0d, 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x5f, + 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x01, 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, 0x0c, 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x22, + 0x7c, 0x0a, 0x12, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 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, - 0x2d, 0x0a, 0x13, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x69, 0x73, - 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x73, 0x63, - 0x72, 0x69, 0x70, 0x74, 0x4b, 0x65, 0x79, 0x49, 0x73, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 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, 0x24, 0x0a, 0x0e, 0x6e, 0x65, 0x77, 0x5f, 0x70, 0x72, - 0x6f, 0x6f, 0x66, 0x5f, 0x62, 0x6c, 0x6f, 0x62, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0c, - 0x6e, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x42, 0x6c, 0x6f, 0x62, 0x12, 0x33, 0x0a, 0x16, - 0x73, 0x70, 0x6c, 0x69, 0x74, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x5f, 0x72, 0x6f, 0x6f, - 0x74, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x13, 0x73, 0x70, - 0x6c, 0x69, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x52, 0x6f, 0x6f, 0x74, 0x48, 0x61, 0x73, - 0x68, 0x12, 0x33, 0x0a, 0x0b, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, - 0x18, 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x12, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, - 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0a, 0x6f, 0x75, 0x74, 0x70, - 0x75, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x39, 0x0a, 0x0d, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, - 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x08, 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, 0x1b, 0x0a, 0x09, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x09, - 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x6b, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x2c, - 0x0a, 0x12, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, - 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x04, 0x52, 0x10, 0x72, 0x65, 0x6c, 0x61, - 0x74, 0x69, 0x76, 0x65, 0x4c, 0x6f, 0x63, 0x6b, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x4f, 0x0a, 0x15, - 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x5f, 0x64, 0x65, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x79, 0x5f, 0x73, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1b, 0x2e, 0x74, 0x61, - 0x70, 0x72, 0x70, 0x63, 0x2e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x44, 0x65, 0x6c, 0x69, 0x76, 0x65, - 0x72, 0x79, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x13, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x44, - 0x65, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x79, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x19, 0x0a, - 0x08, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0c, 0x52, - 0x07, 0x61, 0x73, 0x73, 0x65, 0x74, 0x49, 0x64, 0x22, 0x0d, 0x0a, 0x0b, 0x53, 0x74, 0x6f, 0x70, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x0e, 0x0a, 0x0c, 0x53, 0x74, 0x6f, 0x70, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x46, 0x0a, 0x11, 0x44, 0x65, 0x62, 0x75, 0x67, - 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, - 0x73, 0x68, 0x6f, 0x77, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x73, 0x68, 0x6f, 0x77, - 0x12, 0x1d, 0x0a, 0x0a, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x53, 0x70, 0x65, 0x63, 0x22, - 0x35, 0x0a, 0x12, 0x44, 0x65, 0x62, 0x75, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x75, 0x62, 0x5f, 0x73, 0x79, 0x73, - 0x74, 0x65, 0x6d, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x75, 0x62, 0x53, - 0x79, 0x73, 0x74, 0x65, 0x6d, 0x73, 0x22, 0xe6, 0x03, 0x0a, 0x04, 0x41, 0x64, 0x64, 0x72, 0x12, - 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x07, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 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, 0x30, 0x0a, 0x0a, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x74, 0x79, - 0x70, 0x65, 0x18, 0x03, 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, 0x16, 0x0a, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1b, - 0x0a, 0x09, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x05, 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, 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, - 0x09, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x4b, 0x65, 0x79, 0x12, 0x21, 0x0a, 0x0c, 0x69, 0x6e, - 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0c, - 0x52, 0x0b, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x4b, 0x65, 0x79, 0x12, 0x2b, 0x0a, - 0x11, 0x74, 0x61, 0x70, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x5f, 0x73, 0x69, 0x62, 0x6c, 0x69, - 0x6e, 0x67, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x10, 0x74, 0x61, 0x70, 0x73, 0x63, 0x72, - 0x69, 0x70, 0x74, 0x53, 0x69, 0x62, 0x6c, 0x69, 0x6e, 0x67, 0x12, 0x2c, 0x0a, 0x12, 0x74, 0x61, - 0x70, 0x72, 0x6f, 0x6f, 0x74, 0x5f, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x5f, 0x6b, 0x65, 0x79, - 0x18, 0x09, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x10, 0x74, 0x61, 0x70, 0x72, 0x6f, 0x6f, 0x74, 0x4f, - 0x75, 0x74, 0x70, 0x75, 0x74, 0x4b, 0x65, 0x79, 0x12, 0x2c, 0x0a, 0x12, 0x70, 0x72, 0x6f, 0x6f, - 0x66, 0x5f, 0x63, 0x6f, 0x75, 0x72, 0x69, 0x65, 0x72, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x0a, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x43, 0x6f, 0x75, 0x72, 0x69, - 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x12, 0x39, 0x0a, 0x0d, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, - 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0b, 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, 0x3c, 0x0a, 0x0f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x5f, 0x76, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x13, 0x2e, 0x74, 0x61, 0x70, - 0x72, 0x70, 0x63, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, - 0x0e, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, - 0x8c, 0x01, 0x0a, 0x10, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x64, 0x64, 0x72, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, - 0x61, 0x66, 0x74, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x63, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x64, 0x41, 0x66, 0x74, 0x65, 0x72, 0x12, 0x25, 0x0a, 0x0e, 0x63, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x64, 0x5f, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x0d, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x42, 0x65, 0x66, 0x6f, 0x72, 0x65, - 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x22, 0x37, - 0x0a, 0x11, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x64, 0x64, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x22, 0x0a, 0x05, 0x61, 0x64, 0x64, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x64, 0x64, 0x72, - 0x52, 0x05, 0x61, 0x64, 0x64, 0x72, 0x73, 0x22, 0xfd, 0x02, 0x0a, 0x0e, 0x4e, 0x65, 0x77, 0x41, - 0x64, 0x64, 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, 0x10, 0x0a, 0x03, 0x61, 0x6d, 0x74, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x04, 0x52, 0x03, 0x61, 0x6d, 0x74, 0x12, 0x30, 0x0a, 0x0a, 0x73, 0x63, 0x72, 0x69, 0x70, - 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x03, 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, 0x38, 0x0a, 0x0c, 0x69, 0x6e, 0x74, - 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x04, 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, 0x12, 0x2b, 0x0a, 0x11, 0x74, 0x61, 0x70, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, - 0x5f, 0x73, 0x69, 0x62, 0x6c, 0x69, 0x6e, 0x67, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x10, - 0x74, 0x61, 0x70, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x53, 0x69, 0x62, 0x6c, 0x69, 0x6e, 0x67, - 0x12, 0x2c, 0x0a, 0x12, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x5f, 0x63, 0x6f, 0x75, 0x72, 0x69, 0x65, - 0x72, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x70, 0x72, - 0x6f, 0x6f, 0x66, 0x43, 0x6f, 0x75, 0x72, 0x69, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x12, 0x39, - 0x0a, 0x0d, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, - 0x07, 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, 0x3c, 0x0a, 0x0f, 0x61, 0x64, 0x64, - 0x72, 0x65, 0x73, 0x73, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, - 0x28, 0x0e, 0x32, 0x13, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x64, 0x64, 0x72, - 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x0e, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, - 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x73, 0x0a, 0x09, 0x53, 0x63, 0x72, 0x69, 0x70, - 0x74, 0x4b, 0x65, 0x79, 0x12, 0x17, 0x0a, 0x07, 0x70, 0x75, 0x62, 0x5f, 0x6b, 0x65, 0x79, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x70, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x12, 0x30, 0x0a, - 0x08, 0x6b, 0x65, 0x79, 0x5f, 0x64, 0x65, 0x73, 0x63, 0x18, 0x02, 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, 0x07, 0x6b, 0x65, 0x79, 0x44, 0x65, 0x73, 0x63, 0x12, - 0x1b, 0x0a, 0x09, 0x74, 0x61, 0x70, 0x5f, 0x74, 0x77, 0x65, 0x61, 0x6b, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x0c, 0x52, 0x08, 0x74, 0x61, 0x70, 0x54, 0x77, 0x65, 0x61, 0x6b, 0x22, 0x48, 0x0a, 0x0a, - 0x4b, 0x65, 0x79, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x1d, 0x0a, 0x0a, 0x6b, 0x65, - 0x79, 0x5f, 0x66, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, - 0x6b, 0x65, 0x79, 0x46, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x12, 0x1b, 0x0a, 0x09, 0x6b, 0x65, 0x79, - 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x6b, 0x65, - 0x79, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x60, 0x0a, 0x0d, 0x4b, 0x65, 0x79, 0x44, 0x65, 0x73, - 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x12, 0x22, 0x0a, 0x0d, 0x72, 0x61, 0x77, 0x5f, 0x6b, - 0x65, 0x79, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0b, - 0x72, 0x61, 0x77, 0x4b, 0x65, 0x79, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x2b, 0x0a, 0x07, 0x6b, - 0x65, 0x79, 0x5f, 0x6c, 0x6f, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x74, - 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4b, 0x65, 0x79, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x6f, 0x72, - 0x52, 0x06, 0x6b, 0x65, 0x79, 0x4c, 0x6f, 0x63, 0x22, 0x43, 0x0a, 0x11, 0x54, 0x61, 0x70, 0x73, - 0x63, 0x72, 0x69, 0x70, 0x74, 0x46, 0x75, 0x6c, 0x6c, 0x54, 0x72, 0x65, 0x65, 0x12, 0x2e, 0x0a, - 0x0a, 0x61, 0x6c, 0x6c, 0x5f, 0x6c, 0x65, 0x61, 0x76, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x0f, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x54, 0x61, 0x70, 0x4c, 0x65, - 0x61, 0x66, 0x52, 0x09, 0x61, 0x6c, 0x6c, 0x4c, 0x65, 0x61, 0x76, 0x65, 0x73, 0x22, 0x21, 0x0a, - 0x07, 0x54, 0x61, 0x70, 0x4c, 0x65, 0x61, 0x66, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x63, 0x72, 0x69, - 0x70, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, - 0x22, 0x53, 0x0a, 0x09, 0x54, 0x61, 0x70, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x12, 0x21, 0x0a, - 0x0c, 0x6c, 0x65, 0x66, 0x74, 0x5f, 0x74, 0x61, 0x70, 0x68, 0x61, 0x73, 0x68, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0c, 0x52, 0x0b, 0x6c, 0x65, 0x66, 0x74, 0x54, 0x61, 0x70, 0x68, 0x61, 0x73, 0x68, - 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x74, 0x61, 0x70, 0x68, 0x61, 0x73, - 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0c, 0x72, 0x69, 0x67, 0x68, 0x74, 0x54, 0x61, - 0x70, 0x68, 0x61, 0x73, 0x68, 0x22, 0x27, 0x0a, 0x11, 0x44, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x41, - 0x64, 0x64, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x61, 0x64, - 0x64, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x61, 0x64, 0x64, 0x72, 0x22, 0x56, - 0x0a, 0x09, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x24, 0x0a, 0x0e, 0x72, - 0x61, 0x77, 0x5f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0c, 0x52, 0x0c, 0x72, 0x61, 0x77, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x46, 0x69, 0x6c, - 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x67, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x5f, 0x70, 0x6f, 0x69, - 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x67, 0x65, 0x6e, 0x65, 0x73, 0x69, - 0x73, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x22, 0xf6, 0x04, 0x0a, 0x0c, 0x44, 0x65, 0x63, 0x6f, 0x64, - 0x65, 0x64, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x24, 0x0a, 0x0e, 0x70, 0x72, 0x6f, 0x6f, 0x66, - 0x5f, 0x61, 0x74, 0x5f, 0x64, 0x65, 0x70, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x0c, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x41, 0x74, 0x44, 0x65, 0x70, 0x74, 0x68, 0x12, 0x28, 0x0a, - 0x10, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x5f, 0x6f, 0x66, 0x5f, 0x70, 0x72, 0x6f, 0x6f, 0x66, - 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0e, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x4f, - 0x66, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x73, 0x12, 0x23, 0x0a, 0x05, 0x61, 0x73, 0x73, 0x65, 0x74, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, - 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x05, 0x61, 0x73, 0x73, 0x65, 0x74, 0x12, 0x32, 0x0a, 0x0b, - 0x6d, 0x65, 0x74, 0x61, 0x5f, 0x72, 0x65, 0x76, 0x65, 0x61, 0x6c, 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, 0x0a, 0x6d, 0x65, 0x74, 0x61, 0x52, 0x65, 0x76, 0x65, 0x61, 0x6c, - 0x12, 0x26, 0x0a, 0x0f, 0x74, 0x78, 0x5f, 0x6d, 0x65, 0x72, 0x6b, 0x6c, 0x65, 0x5f, 0x70, 0x72, - 0x6f, 0x6f, 0x66, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0d, 0x74, 0x78, 0x4d, 0x65, 0x72, - 0x6b, 0x6c, 0x65, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x27, 0x0a, 0x0f, 0x69, 0x6e, 0x63, 0x6c, - 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x0c, 0x52, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, - 0x66, 0x12, 0x29, 0x0a, 0x10, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x70, - 0x72, 0x6f, 0x6f, 0x66, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x0f, 0x65, 0x78, 0x63, - 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x73, 0x12, 0x28, 0x0a, 0x10, - 0x73, 0x70, 0x6c, 0x69, 0x74, 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x5f, 0x70, 0x72, 0x6f, 0x6f, 0x66, - 0x18, 0x08, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0e, 0x73, 0x70, 0x6c, 0x69, 0x74, 0x52, 0x6f, 0x6f, - 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x32, 0x0a, 0x15, 0x6e, 0x75, 0x6d, 0x5f, 0x61, 0x64, - 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x18, - 0x09, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x13, 0x6e, 0x75, 0x6d, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, - 0x6f, 0x6e, 0x61, 0x6c, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x63, 0x68, - 0x61, 0x6c, 0x6c, 0x65, 0x6e, 0x67, 0x65, 0x5f, 0x77, 0x69, 0x74, 0x6e, 0x65, 0x73, 0x73, 0x18, - 0x0a, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x10, 0x63, 0x68, 0x61, 0x6c, 0x6c, 0x65, 0x6e, 0x67, 0x65, - 0x57, 0x69, 0x74, 0x6e, 0x65, 0x73, 0x73, 0x12, 0x17, 0x0a, 0x07, 0x69, 0x73, 0x5f, 0x62, 0x75, - 0x72, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x69, 0x73, 0x42, 0x75, 0x72, 0x6e, - 0x12, 0x3c, 0x0a, 0x0e, 0x67, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x5f, 0x72, 0x65, 0x76, 0x65, - 0x61, 0x6c, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, - 0x63, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x52, 0x65, 0x76, 0x65, 0x61, 0x6c, 0x52, - 0x0d, 0x67, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x52, 0x65, 0x76, 0x65, 0x61, 0x6c, 0x12, 0x40, - 0x0a, 0x10, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x72, 0x65, 0x76, 0x65, - 0x61, 0x6c, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, - 0x63, 0x2e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x76, 0x65, 0x61, 0x6c, - 0x52, 0x0e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x76, 0x65, 0x61, 0x6c, - 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x6c, 0x74, 0x5f, 0x6c, 0x65, 0x61, 0x76, 0x65, 0x73, 0x18, 0x0e, - 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x61, 0x6c, 0x74, 0x4c, 0x65, 0x61, 0x76, 0x65, 0x73, 0x22, - 0x66, 0x0a, 0x13, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x12, 0x39, 0x0a, 0x0d, - 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x64, 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, 0x0c, 0x64, 0x65, 0x63, 0x6f, 0x64, - 0x65, 0x64, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x22, 0xb1, 0x01, 0x0a, 0x12, 0x44, 0x65, 0x63, 0x6f, - 0x64, 0x65, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, - 0x0a, 0x09, 0x72, 0x61, 0x77, 0x5f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0c, 0x52, 0x08, 0x72, 0x61, 0x77, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x24, 0x0a, 0x0e, 0x70, - 0x72, 0x6f, 0x6f, 0x66, 0x5f, 0x61, 0x74, 0x5f, 0x64, 0x65, 0x70, 0x74, 0x68, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x41, 0x74, 0x44, 0x65, 0x70, 0x74, - 0x68, 0x12, 0x2e, 0x0a, 0x13, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x70, 0x72, 0x65, 0x76, 0x5f, 0x77, - 0x69, 0x74, 0x6e, 0x65, 0x73, 0x73, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, - 0x77, 0x69, 0x74, 0x68, 0x50, 0x72, 0x65, 0x76, 0x57, 0x69, 0x74, 0x6e, 0x65, 0x73, 0x73, 0x65, - 0x73, 0x12, 0x28, 0x0a, 0x10, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x5f, 0x72, - 0x65, 0x76, 0x65, 0x61, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x77, 0x69, 0x74, - 0x68, 0x4d, 0x65, 0x74, 0x61, 0x52, 0x65, 0x76, 0x65, 0x61, 0x6c, 0x22, 0x50, 0x0a, 0x13, 0x44, - 0x65, 0x63, 0x6f, 0x64, 0x65, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x39, 0x0a, 0x0d, 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x5f, 0x70, 0x72, - 0x6f, 0x6f, 0x66, 0x18, 0x01, 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, - 0x0c, 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x22, 0x7c, 0x0a, - 0x12, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 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, 0x22, 0x3e, 0x0a, 0x16, 0x55, - 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x24, 0x0a, 0x0e, 0x72, 0x61, 0x77, 0x5f, 0x70, 0x72, 0x6f, - 0x6f, 0x66, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0c, 0x72, - 0x61, 0x77, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x46, 0x69, 0x6c, 0x65, 0x22, 0x38, 0x0a, 0x17, 0x55, - 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x72, 0x61, 0x77, 0x5f, 0x70, 0x72, - 0x6f, 0x6f, 0x66, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x09, 0x72, 0x61, 0x77, 0x50, - 0x72, 0x6f, 0x6f, 0x66, 0x73, 0x22, 0xd0, 0x02, 0x0a, 0x09, 0x41, 0x64, 0x64, 0x72, 0x45, 0x76, - 0x65, 0x6e, 0x74, 0x12, 0x3b, 0x0a, 0x1a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, - 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x75, 0x6e, 0x69, 0x78, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, - 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x17, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x78, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, - 0x12, 0x20, 0x0a, 0x04, 0x61, 0x64, 0x64, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, - 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x52, 0x04, 0x61, 0x64, - 0x64, 0x72, 0x12, 0x2f, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x03, 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, 0x1a, 0x0a, 0x08, 0x6f, 0x75, 0x74, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6f, 0x75, 0x74, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, - 0x20, 0x0a, 0x0c, 0x75, 0x74, 0x78, 0x6f, 0x5f, 0x61, 0x6d, 0x74, 0x5f, 0x73, 0x61, 0x74, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, 0x75, 0x74, 0x78, 0x6f, 0x41, 0x6d, 0x74, 0x53, 0x61, - 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x74, 0x61, 0x70, 0x72, 0x6f, 0x6f, 0x74, 0x5f, 0x73, 0x69, 0x62, - 0x6c, 0x69, 0x6e, 0x67, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0e, 0x74, 0x61, 0x70, 0x72, - 0x6f, 0x6f, 0x74, 0x53, 0x69, 0x62, 0x6c, 0x69, 0x6e, 0x67, 0x12, 0x2f, 0x0a, 0x13, 0x63, 0x6f, - 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, - 0x74, 0x18, 0x07, 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, 0x1b, 0x0a, 0x09, 0x68, - 0x61, 0x73, 0x5f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, - 0x68, 0x61, 0x73, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x22, 0x74, 0x0a, 0x13, 0x41, 0x64, 0x64, 0x72, - 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 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, 0x3c, 0x0a, 0x0d, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x18, 0x02, 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, 0x0c, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x41, - 0x0a, 0x14, 0x41, 0x64, 0x64, 0x72, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x73, 0x52, 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, 0xa2, 0x01, 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, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x66, 0x65, 0x65, 0x52, 0x61, 0x74, 0x65, 0x12, 0x14, - 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, - 0x61, 0x62, 0x65, 0x6c, 0x12, 0x40, 0x0a, 0x1d, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x70, 0x72, 0x6f, - 0x6f, 0x66, 0x5f, 0x63, 0x6f, 0x75, 0x72, 0x69, 0x65, 0x72, 0x5f, 0x70, 0x69, 0x6e, 0x67, 0x5f, - 0x63, 0x68, 0x65, 0x63, 0x6b, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x19, 0x73, 0x6b, 0x69, - 0x70, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x43, 0x6f, 0x75, 0x72, 0x69, 0x65, 0x72, 0x50, 0x69, 0x6e, - 0x67, 0x43, 0x68, 0x65, 0x63, 0x6b, 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, - 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, 0x41, 0x0a, 0x08, 0x4f, 0x75, 0x74, 0x50, - 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x78, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0c, 0x52, 0x04, 0x74, 0x78, 0x69, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x6f, 0x75, 0x74, 0x70, - 0x75, 0x74, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, - 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 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, + 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, 0x22, 0x3e, 0x0a, + 0x16, 0x55, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x46, 0x69, 0x6c, 0x65, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x24, 0x0a, 0x0e, 0x72, 0x61, 0x77, 0x5f, 0x70, + 0x72, 0x6f, 0x6f, 0x66, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, + 0x0c, 0x72, 0x61, 0x77, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x46, 0x69, 0x6c, 0x65, 0x22, 0x38, 0x0a, + 0x17, 0x55, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x46, 0x69, 0x6c, 0x65, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x72, 0x61, 0x77, 0x5f, + 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x09, 0x72, 0x61, + 0x77, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x73, 0x22, 0xd0, 0x02, 0x0a, 0x09, 0x41, 0x64, 0x64, 0x72, + 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x3b, 0x0a, 0x1a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x75, 0x6e, 0x69, 0x78, 0x5f, 0x73, 0x65, 0x63, 0x6f, + 0x6e, 0x64, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x17, 0x63, 0x72, 0x65, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x78, 0x53, 0x65, 0x63, 0x6f, 0x6e, + 0x64, 0x73, 0x12, 0x20, 0x0a, 0x04, 0x61, 0x64, 0x64, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x0c, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x52, 0x04, + 0x61, 0x64, 0x64, 0x72, 0x12, 0x2f, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x03, + 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, 0x1a, 0x0a, 0x08, 0x6f, 0x75, 0x74, 0x70, 0x6f, 0x69, 0x6e, + 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6f, 0x75, 0x74, 0x70, 0x6f, 0x69, 0x6e, + 0x74, 0x12, 0x20, 0x0a, 0x0c, 0x75, 0x74, 0x78, 0x6f, 0x5f, 0x61, 0x6d, 0x74, 0x5f, 0x73, 0x61, + 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, 0x75, 0x74, 0x78, 0x6f, 0x41, 0x6d, 0x74, + 0x53, 0x61, 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x74, 0x61, 0x70, 0x72, 0x6f, 0x6f, 0x74, 0x5f, 0x73, + 0x69, 0x62, 0x6c, 0x69, 0x6e, 0x67, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0e, 0x74, 0x61, + 0x70, 0x72, 0x6f, 0x6f, 0x74, 0x53, 0x69, 0x62, 0x6c, 0x69, 0x6e, 0x67, 0x12, 0x2f, 0x0a, 0x13, + 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x68, 0x65, 0x69, + 0x67, 0x68, 0x74, 0x18, 0x07, 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, 0x1b, 0x0a, + 0x09, 0x68, 0x61, 0x73, 0x5f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x08, 0x68, 0x61, 0x73, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x22, 0x74, 0x0a, 0x13, 0x41, 0x64, + 0x64, 0x72, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 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, 0x3c, 0x0a, 0x0d, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x5f, 0x73, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x18, 0x02, 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, 0x6b, 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, 0x22, 0xc4, - 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, + 0x75, 0x73, 0x52, 0x0c, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x22, 0x41, 0x0a, 0x14, 0x41, 0x64, 0x64, 0x72, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x73, + 0x52, 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, 0xa2, 0x01, 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, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x66, 0x65, 0x65, 0x52, 0x61, 0x74, 0x65, + 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x40, 0x0a, 0x1d, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x70, + 0x72, 0x6f, 0x6f, 0x66, 0x5f, 0x63, 0x6f, 0x75, 0x72, 0x69, 0x65, 0x72, 0x5f, 0x70, 0x69, 0x6e, + 0x67, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x19, 0x73, + 0x6b, 0x69, 0x70, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x43, 0x6f, 0x75, 0x72, 0x69, 0x65, 0x72, 0x50, + 0x69, 0x6e, 0x67, 0x43, 0x68, 0x65, 0x63, 0x6b, 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, 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, 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, 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, 0x55, 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, 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, 0xc5, 0x0c, 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, 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, + 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, 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, 0x41, 0x0a, 0x08, 0x4f, 0x75, + 0x74, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x78, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x74, 0x78, 0x69, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x6f, 0x75, + 0x74, 0x70, 0x75, 0x74, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x0b, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 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, 0x6b, 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, + 0x22, 0xc4, 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, 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, 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, 0x55, 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, 0x2a, 0xa9, 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, 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, 0xc5, 0x0c, 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, 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, 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, 0x42, 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, 0x11, 0x2e, 0x74, 0x61, - 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x4d, 0x65, 0x74, 0x61, 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, + 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, 0x42, 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, 0x11, 0x2e, 0x74, 0x61, 0x70, 0x72, + 0x70, 0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x4d, 0x65, 0x74, 0x61, 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 ( @@ -7530,230 +7795,238 @@ func file_taprootassets_proto_rawDescGZIP() []byte { return file_taprootassets_proto_rawDescData } -var file_taprootassets_proto_enumTypes = make([]protoimpl.EnumInfo, 9) -var file_taprootassets_proto_msgTypes = make([]protoimpl.MessageInfo, 84) -var file_taprootassets_proto_goTypes = []interface{}{ +var file_taprootassets_proto_enumTypes = make([]protoimpl.EnumInfo, 10) +var file_taprootassets_proto_msgTypes = make([]protoimpl.MessageInfo, 85) +var file_taprootassets_proto_goTypes = []any{ (AssetType)(0), // 0: taprpc.AssetType (AssetMetaType)(0), // 1: taprpc.AssetMetaType (AssetVersion)(0), // 2: taprpc.AssetVersion (OutputType)(0), // 3: taprpc.OutputType (ProofDeliveryStatus)(0), // 4: taprpc.ProofDeliveryStatus (AddrVersion)(0), // 5: taprpc.AddrVersion - (AddrEventStatus)(0), // 6: taprpc.AddrEventStatus - (SendState)(0), // 7: taprpc.SendState - (ParcelType)(0), // 8: taprpc.ParcelType - (*AssetMeta)(nil), // 9: taprpc.AssetMeta - (*ListAssetRequest)(nil), // 10: taprpc.ListAssetRequest - (*AnchorInfo)(nil), // 11: taprpc.AnchorInfo - (*GenesisInfo)(nil), // 12: taprpc.GenesisInfo - (*ExternalKey)(nil), // 13: taprpc.ExternalKey - (*GroupKeyRequest)(nil), // 14: taprpc.GroupKeyRequest - (*TxOut)(nil), // 15: taprpc.TxOut - (*GroupVirtualTx)(nil), // 16: taprpc.GroupVirtualTx - (*GroupWitness)(nil), // 17: taprpc.GroupWitness - (*AssetGroup)(nil), // 18: taprpc.AssetGroup - (*GroupKeyReveal)(nil), // 19: taprpc.GroupKeyReveal - (*GenesisReveal)(nil), // 20: taprpc.GenesisReveal - (*DecimalDisplay)(nil), // 21: taprpc.DecimalDisplay - (*Asset)(nil), // 22: taprpc.Asset - (*PrevWitness)(nil), // 23: taprpc.PrevWitness - (*SplitCommitment)(nil), // 24: taprpc.SplitCommitment - (*ListAssetResponse)(nil), // 25: taprpc.ListAssetResponse - (*ListUtxosRequest)(nil), // 26: taprpc.ListUtxosRequest - (*ManagedUtxo)(nil), // 27: taprpc.ManagedUtxo - (*ListUtxosResponse)(nil), // 28: taprpc.ListUtxosResponse - (*ListGroupsRequest)(nil), // 29: taprpc.ListGroupsRequest - (*AssetHumanReadable)(nil), // 30: taprpc.AssetHumanReadable - (*GroupedAssets)(nil), // 31: taprpc.GroupedAssets - (*ListGroupsResponse)(nil), // 32: taprpc.ListGroupsResponse - (*ListBalancesRequest)(nil), // 33: taprpc.ListBalancesRequest - (*AssetBalance)(nil), // 34: taprpc.AssetBalance - (*AssetGroupBalance)(nil), // 35: taprpc.AssetGroupBalance - (*ListBalancesResponse)(nil), // 36: taprpc.ListBalancesResponse - (*ListTransfersRequest)(nil), // 37: taprpc.ListTransfersRequest - (*ListTransfersResponse)(nil), // 38: taprpc.ListTransfersResponse - (*ChainHash)(nil), // 39: taprpc.ChainHash - (*AssetTransfer)(nil), // 40: taprpc.AssetTransfer - (*TransferInput)(nil), // 41: taprpc.TransferInput - (*TransferOutputAnchor)(nil), // 42: taprpc.TransferOutputAnchor - (*TransferOutput)(nil), // 43: taprpc.TransferOutput - (*StopRequest)(nil), // 44: taprpc.StopRequest - (*StopResponse)(nil), // 45: taprpc.StopResponse - (*DebugLevelRequest)(nil), // 46: taprpc.DebugLevelRequest - (*DebugLevelResponse)(nil), // 47: taprpc.DebugLevelResponse - (*Addr)(nil), // 48: taprpc.Addr - (*QueryAddrRequest)(nil), // 49: taprpc.QueryAddrRequest - (*QueryAddrResponse)(nil), // 50: taprpc.QueryAddrResponse - (*NewAddrRequest)(nil), // 51: taprpc.NewAddrRequest - (*ScriptKey)(nil), // 52: taprpc.ScriptKey - (*KeyLocator)(nil), // 53: taprpc.KeyLocator - (*KeyDescriptor)(nil), // 54: taprpc.KeyDescriptor - (*TapscriptFullTree)(nil), // 55: taprpc.TapscriptFullTree - (*TapLeaf)(nil), // 56: taprpc.TapLeaf - (*TapBranch)(nil), // 57: taprpc.TapBranch - (*DecodeAddrRequest)(nil), // 58: taprpc.DecodeAddrRequest - (*ProofFile)(nil), // 59: taprpc.ProofFile - (*DecodedProof)(nil), // 60: taprpc.DecodedProof - (*VerifyProofResponse)(nil), // 61: taprpc.VerifyProofResponse - (*DecodeProofRequest)(nil), // 62: taprpc.DecodeProofRequest - (*DecodeProofResponse)(nil), // 63: taprpc.DecodeProofResponse - (*ExportProofRequest)(nil), // 64: taprpc.ExportProofRequest - (*UnpackProofFileRequest)(nil), // 65: taprpc.UnpackProofFileRequest - (*UnpackProofFileResponse)(nil), // 66: taprpc.UnpackProofFileResponse - (*AddrEvent)(nil), // 67: taprpc.AddrEvent - (*AddrReceivesRequest)(nil), // 68: taprpc.AddrReceivesRequest - (*AddrReceivesResponse)(nil), // 69: taprpc.AddrReceivesResponse - (*SendAssetRequest)(nil), // 70: taprpc.SendAssetRequest - (*PrevInputAsset)(nil), // 71: taprpc.PrevInputAsset - (*SendAssetResponse)(nil), // 72: taprpc.SendAssetResponse - (*GetInfoRequest)(nil), // 73: taprpc.GetInfoRequest - (*GetInfoResponse)(nil), // 74: taprpc.GetInfoResponse - (*FetchAssetMetaRequest)(nil), // 75: taprpc.FetchAssetMetaRequest - (*BurnAssetRequest)(nil), // 76: taprpc.BurnAssetRequest - (*BurnAssetResponse)(nil), // 77: taprpc.BurnAssetResponse - (*ListBurnsRequest)(nil), // 78: taprpc.ListBurnsRequest - (*AssetBurn)(nil), // 79: taprpc.AssetBurn - (*ListBurnsResponse)(nil), // 80: taprpc.ListBurnsResponse - (*OutPoint)(nil), // 81: taprpc.OutPoint - (*SubscribeReceiveEventsRequest)(nil), // 82: taprpc.SubscribeReceiveEventsRequest - (*ReceiveEvent)(nil), // 83: taprpc.ReceiveEvent - (*SubscribeSendEventsRequest)(nil), // 84: taprpc.SubscribeSendEventsRequest - (*SendEvent)(nil), // 85: taprpc.SendEvent - (*AnchorTransaction)(nil), // 86: taprpc.AnchorTransaction - (*RegisterTransferRequest)(nil), // 87: taprpc.RegisterTransferRequest - (*RegisterTransferResponse)(nil), // 88: taprpc.RegisterTransferResponse - nil, // 89: taprpc.ListUtxosResponse.ManagedUtxosEntry - nil, // 90: taprpc.ListGroupsResponse.GroupsEntry - nil, // 91: taprpc.ListBalancesResponse.AssetBalancesEntry - nil, // 92: taprpc.ListBalancesResponse.AssetGroupBalancesEntry + (ScriptKeyType)(0), // 6: taprpc.ScriptKeyType + (AddrEventStatus)(0), // 7: taprpc.AddrEventStatus + (SendState)(0), // 8: taprpc.SendState + (ParcelType)(0), // 9: taprpc.ParcelType + (*AssetMeta)(nil), // 10: taprpc.AssetMeta + (*ListAssetRequest)(nil), // 11: taprpc.ListAssetRequest + (*AnchorInfo)(nil), // 12: taprpc.AnchorInfo + (*GenesisInfo)(nil), // 13: taprpc.GenesisInfo + (*ExternalKey)(nil), // 14: taprpc.ExternalKey + (*GroupKeyRequest)(nil), // 15: taprpc.GroupKeyRequest + (*TxOut)(nil), // 16: taprpc.TxOut + (*GroupVirtualTx)(nil), // 17: taprpc.GroupVirtualTx + (*GroupWitness)(nil), // 18: taprpc.GroupWitness + (*AssetGroup)(nil), // 19: taprpc.AssetGroup + (*GroupKeyReveal)(nil), // 20: taprpc.GroupKeyReveal + (*GenesisReveal)(nil), // 21: taprpc.GenesisReveal + (*DecimalDisplay)(nil), // 22: taprpc.DecimalDisplay + (*Asset)(nil), // 23: taprpc.Asset + (*PrevWitness)(nil), // 24: taprpc.PrevWitness + (*SplitCommitment)(nil), // 25: taprpc.SplitCommitment + (*ListAssetResponse)(nil), // 26: taprpc.ListAssetResponse + (*ListUtxosRequest)(nil), // 27: taprpc.ListUtxosRequest + (*ManagedUtxo)(nil), // 28: taprpc.ManagedUtxo + (*ListUtxosResponse)(nil), // 29: taprpc.ListUtxosResponse + (*ListGroupsRequest)(nil), // 30: taprpc.ListGroupsRequest + (*AssetHumanReadable)(nil), // 31: taprpc.AssetHumanReadable + (*GroupedAssets)(nil), // 32: taprpc.GroupedAssets + (*ListGroupsResponse)(nil), // 33: taprpc.ListGroupsResponse + (*ListBalancesRequest)(nil), // 34: taprpc.ListBalancesRequest + (*AssetBalance)(nil), // 35: taprpc.AssetBalance + (*AssetGroupBalance)(nil), // 36: taprpc.AssetGroupBalance + (*ListBalancesResponse)(nil), // 37: taprpc.ListBalancesResponse + (*ListTransfersRequest)(nil), // 38: taprpc.ListTransfersRequest + (*ListTransfersResponse)(nil), // 39: taprpc.ListTransfersResponse + (*ChainHash)(nil), // 40: taprpc.ChainHash + (*AssetTransfer)(nil), // 41: taprpc.AssetTransfer + (*TransferInput)(nil), // 42: taprpc.TransferInput + (*TransferOutputAnchor)(nil), // 43: taprpc.TransferOutputAnchor + (*TransferOutput)(nil), // 44: taprpc.TransferOutput + (*StopRequest)(nil), // 45: taprpc.StopRequest + (*StopResponse)(nil), // 46: taprpc.StopResponse + (*DebugLevelRequest)(nil), // 47: taprpc.DebugLevelRequest + (*DebugLevelResponse)(nil), // 48: taprpc.DebugLevelResponse + (*Addr)(nil), // 49: taprpc.Addr + (*QueryAddrRequest)(nil), // 50: taprpc.QueryAddrRequest + (*QueryAddrResponse)(nil), // 51: taprpc.QueryAddrResponse + (*NewAddrRequest)(nil), // 52: taprpc.NewAddrRequest + (*ScriptKeyTypeQuery)(nil), // 53: taprpc.ScriptKeyTypeQuery + (*ScriptKey)(nil), // 54: taprpc.ScriptKey + (*KeyLocator)(nil), // 55: taprpc.KeyLocator + (*KeyDescriptor)(nil), // 56: taprpc.KeyDescriptor + (*TapscriptFullTree)(nil), // 57: taprpc.TapscriptFullTree + (*TapLeaf)(nil), // 58: taprpc.TapLeaf + (*TapBranch)(nil), // 59: taprpc.TapBranch + (*DecodeAddrRequest)(nil), // 60: taprpc.DecodeAddrRequest + (*ProofFile)(nil), // 61: taprpc.ProofFile + (*DecodedProof)(nil), // 62: taprpc.DecodedProof + (*VerifyProofResponse)(nil), // 63: taprpc.VerifyProofResponse + (*DecodeProofRequest)(nil), // 64: taprpc.DecodeProofRequest + (*DecodeProofResponse)(nil), // 65: taprpc.DecodeProofResponse + (*ExportProofRequest)(nil), // 66: taprpc.ExportProofRequest + (*UnpackProofFileRequest)(nil), // 67: taprpc.UnpackProofFileRequest + (*UnpackProofFileResponse)(nil), // 68: taprpc.UnpackProofFileResponse + (*AddrEvent)(nil), // 69: taprpc.AddrEvent + (*AddrReceivesRequest)(nil), // 70: taprpc.AddrReceivesRequest + (*AddrReceivesResponse)(nil), // 71: taprpc.AddrReceivesResponse + (*SendAssetRequest)(nil), // 72: taprpc.SendAssetRequest + (*PrevInputAsset)(nil), // 73: taprpc.PrevInputAsset + (*SendAssetResponse)(nil), // 74: taprpc.SendAssetResponse + (*GetInfoRequest)(nil), // 75: taprpc.GetInfoRequest + (*GetInfoResponse)(nil), // 76: taprpc.GetInfoResponse + (*FetchAssetMetaRequest)(nil), // 77: taprpc.FetchAssetMetaRequest + (*BurnAssetRequest)(nil), // 78: taprpc.BurnAssetRequest + (*BurnAssetResponse)(nil), // 79: taprpc.BurnAssetResponse + (*ListBurnsRequest)(nil), // 80: taprpc.ListBurnsRequest + (*AssetBurn)(nil), // 81: taprpc.AssetBurn + (*ListBurnsResponse)(nil), // 82: taprpc.ListBurnsResponse + (*OutPoint)(nil), // 83: taprpc.OutPoint + (*SubscribeReceiveEventsRequest)(nil), // 84: taprpc.SubscribeReceiveEventsRequest + (*ReceiveEvent)(nil), // 85: taprpc.ReceiveEvent + (*SubscribeSendEventsRequest)(nil), // 86: taprpc.SubscribeSendEventsRequest + (*SendEvent)(nil), // 87: taprpc.SendEvent + (*AnchorTransaction)(nil), // 88: taprpc.AnchorTransaction + (*RegisterTransferRequest)(nil), // 89: taprpc.RegisterTransferRequest + (*RegisterTransferResponse)(nil), // 90: taprpc.RegisterTransferResponse + nil, // 91: taprpc.ListUtxosResponse.ManagedUtxosEntry + nil, // 92: taprpc.ListGroupsResponse.GroupsEntry + nil, // 93: taprpc.ListBalancesResponse.AssetBalancesEntry + nil, // 94: taprpc.ListBalancesResponse.AssetGroupBalancesEntry } var file_taprootassets_proto_depIdxs = []int32{ - 1, // 0: taprpc.AssetMeta.type:type_name -> taprpc.AssetMetaType - 52, // 1: taprpc.ListAssetRequest.script_key:type_name -> taprpc.ScriptKey - 81, // 2: taprpc.ListAssetRequest.anchor_outpoint:type_name -> taprpc.OutPoint - 0, // 3: taprpc.GenesisInfo.asset_type:type_name -> taprpc.AssetType - 54, // 4: taprpc.GroupKeyRequest.raw_key:type_name -> taprpc.KeyDescriptor - 12, // 5: taprpc.GroupKeyRequest.anchor_genesis:type_name -> taprpc.GenesisInfo - 13, // 6: taprpc.GroupKeyRequest.external_key:type_name -> taprpc.ExternalKey - 15, // 7: taprpc.GroupVirtualTx.prev_out:type_name -> taprpc.TxOut - 12, // 8: taprpc.GenesisReveal.genesis_base_reveal:type_name -> taprpc.GenesisInfo - 2, // 9: taprpc.Asset.version:type_name -> taprpc.AssetVersion - 12, // 10: taprpc.Asset.asset_genesis:type_name -> taprpc.GenesisInfo - 18, // 11: taprpc.Asset.asset_group:type_name -> taprpc.AssetGroup - 11, // 12: taprpc.Asset.chain_anchor:type_name -> taprpc.AnchorInfo - 23, // 13: taprpc.Asset.prev_witnesses:type_name -> taprpc.PrevWitness - 21, // 14: taprpc.Asset.decimal_display:type_name -> taprpc.DecimalDisplay - 71, // 15: taprpc.PrevWitness.prev_id:type_name -> taprpc.PrevInputAsset - 24, // 16: taprpc.PrevWitness.split_commitment:type_name -> taprpc.SplitCommitment - 22, // 17: taprpc.SplitCommitment.root_asset:type_name -> taprpc.Asset - 22, // 18: taprpc.ListAssetResponse.assets:type_name -> taprpc.Asset - 22, // 19: taprpc.ManagedUtxo.assets:type_name -> taprpc.Asset - 89, // 20: taprpc.ListUtxosResponse.managed_utxos:type_name -> taprpc.ListUtxosResponse.ManagedUtxosEntry - 0, // 21: taprpc.AssetHumanReadable.type:type_name -> taprpc.AssetType - 2, // 22: taprpc.AssetHumanReadable.version:type_name -> taprpc.AssetVersion - 30, // 23: taprpc.GroupedAssets.assets:type_name -> taprpc.AssetHumanReadable - 90, // 24: taprpc.ListGroupsResponse.groups:type_name -> taprpc.ListGroupsResponse.GroupsEntry - 12, // 25: taprpc.AssetBalance.asset_genesis:type_name -> taprpc.GenesisInfo - 91, // 26: taprpc.ListBalancesResponse.asset_balances:type_name -> taprpc.ListBalancesResponse.AssetBalancesEntry - 92, // 27: taprpc.ListBalancesResponse.asset_group_balances:type_name -> taprpc.ListBalancesResponse.AssetGroupBalancesEntry - 40, // 28: taprpc.ListTransfersResponse.transfers:type_name -> taprpc.AssetTransfer - 41, // 29: taprpc.AssetTransfer.inputs:type_name -> taprpc.TransferInput - 43, // 30: taprpc.AssetTransfer.outputs:type_name -> taprpc.TransferOutput - 39, // 31: taprpc.AssetTransfer.anchor_tx_block_hash:type_name -> taprpc.ChainHash - 42, // 32: taprpc.TransferOutput.anchor:type_name -> taprpc.TransferOutputAnchor - 3, // 33: taprpc.TransferOutput.output_type:type_name -> taprpc.OutputType - 2, // 34: taprpc.TransferOutput.asset_version:type_name -> taprpc.AssetVersion - 4, // 35: taprpc.TransferOutput.proof_delivery_status:type_name -> taprpc.ProofDeliveryStatus - 0, // 36: taprpc.Addr.asset_type:type_name -> taprpc.AssetType - 2, // 37: taprpc.Addr.asset_version:type_name -> taprpc.AssetVersion - 5, // 38: taprpc.Addr.address_version:type_name -> taprpc.AddrVersion - 48, // 39: taprpc.QueryAddrResponse.addrs:type_name -> taprpc.Addr - 52, // 40: taprpc.NewAddrRequest.script_key:type_name -> taprpc.ScriptKey - 54, // 41: taprpc.NewAddrRequest.internal_key:type_name -> taprpc.KeyDescriptor - 2, // 42: taprpc.NewAddrRequest.asset_version:type_name -> taprpc.AssetVersion - 5, // 43: taprpc.NewAddrRequest.address_version:type_name -> taprpc.AddrVersion - 54, // 44: taprpc.ScriptKey.key_desc:type_name -> taprpc.KeyDescriptor - 53, // 45: taprpc.KeyDescriptor.key_loc:type_name -> taprpc.KeyLocator - 56, // 46: taprpc.TapscriptFullTree.all_leaves:type_name -> taprpc.TapLeaf - 22, // 47: taprpc.DecodedProof.asset:type_name -> taprpc.Asset - 9, // 48: taprpc.DecodedProof.meta_reveal:type_name -> taprpc.AssetMeta - 20, // 49: taprpc.DecodedProof.genesis_reveal:type_name -> taprpc.GenesisReveal - 19, // 50: taprpc.DecodedProof.group_key_reveal:type_name -> taprpc.GroupKeyReveal - 60, // 51: taprpc.VerifyProofResponse.decoded_proof:type_name -> taprpc.DecodedProof - 60, // 52: taprpc.DecodeProofResponse.decoded_proof:type_name -> taprpc.DecodedProof - 81, // 53: taprpc.ExportProofRequest.outpoint:type_name -> taprpc.OutPoint - 48, // 54: taprpc.AddrEvent.addr:type_name -> taprpc.Addr - 6, // 55: taprpc.AddrEvent.status:type_name -> taprpc.AddrEventStatus - 6, // 56: taprpc.AddrReceivesRequest.filter_status:type_name -> taprpc.AddrEventStatus - 67, // 57: taprpc.AddrReceivesResponse.events:type_name -> taprpc.AddrEvent - 40, // 58: taprpc.SendAssetResponse.transfer:type_name -> taprpc.AssetTransfer - 40, // 59: taprpc.BurnAssetResponse.burn_transfer:type_name -> taprpc.AssetTransfer - 60, // 60: taprpc.BurnAssetResponse.burn_proof:type_name -> taprpc.DecodedProof - 79, // 61: taprpc.ListBurnsResponse.burns:type_name -> taprpc.AssetBurn - 48, // 62: taprpc.ReceiveEvent.address:type_name -> taprpc.Addr - 6, // 63: taprpc.ReceiveEvent.status:type_name -> taprpc.AddrEventStatus - 8, // 64: taprpc.SendEvent.parcel_type:type_name -> taprpc.ParcelType - 48, // 65: taprpc.SendEvent.addresses:type_name -> taprpc.Addr - 86, // 66: taprpc.SendEvent.anchor_transaction:type_name -> taprpc.AnchorTransaction - 40, // 67: taprpc.SendEvent.transfer:type_name -> taprpc.AssetTransfer - 81, // 68: taprpc.AnchorTransaction.lnd_locked_utxos:type_name -> taprpc.OutPoint - 81, // 69: taprpc.RegisterTransferRequest.outpoint:type_name -> taprpc.OutPoint - 22, // 70: taprpc.RegisterTransferResponse.registered_asset:type_name -> taprpc.Asset - 27, // 71: taprpc.ListUtxosResponse.ManagedUtxosEntry.value:type_name -> taprpc.ManagedUtxo - 31, // 72: taprpc.ListGroupsResponse.GroupsEntry.value:type_name -> taprpc.GroupedAssets - 34, // 73: taprpc.ListBalancesResponse.AssetBalancesEntry.value:type_name -> taprpc.AssetBalance - 35, // 74: taprpc.ListBalancesResponse.AssetGroupBalancesEntry.value:type_name -> taprpc.AssetGroupBalance - 10, // 75: taprpc.TaprootAssets.ListAssets:input_type -> taprpc.ListAssetRequest - 26, // 76: taprpc.TaprootAssets.ListUtxos:input_type -> taprpc.ListUtxosRequest - 29, // 77: taprpc.TaprootAssets.ListGroups:input_type -> taprpc.ListGroupsRequest - 33, // 78: taprpc.TaprootAssets.ListBalances:input_type -> taprpc.ListBalancesRequest - 37, // 79: taprpc.TaprootAssets.ListTransfers:input_type -> taprpc.ListTransfersRequest - 44, // 80: taprpc.TaprootAssets.StopDaemon:input_type -> taprpc.StopRequest - 46, // 81: taprpc.TaprootAssets.DebugLevel:input_type -> taprpc.DebugLevelRequest - 49, // 82: taprpc.TaprootAssets.QueryAddrs:input_type -> taprpc.QueryAddrRequest - 51, // 83: taprpc.TaprootAssets.NewAddr:input_type -> taprpc.NewAddrRequest - 58, // 84: taprpc.TaprootAssets.DecodeAddr:input_type -> taprpc.DecodeAddrRequest - 68, // 85: taprpc.TaprootAssets.AddrReceives:input_type -> taprpc.AddrReceivesRequest - 59, // 86: taprpc.TaprootAssets.VerifyProof:input_type -> taprpc.ProofFile - 62, // 87: taprpc.TaprootAssets.DecodeProof:input_type -> taprpc.DecodeProofRequest - 64, // 88: taprpc.TaprootAssets.ExportProof:input_type -> taprpc.ExportProofRequest - 65, // 89: taprpc.TaprootAssets.UnpackProofFile:input_type -> taprpc.UnpackProofFileRequest - 70, // 90: taprpc.TaprootAssets.SendAsset:input_type -> taprpc.SendAssetRequest - 76, // 91: taprpc.TaprootAssets.BurnAsset:input_type -> taprpc.BurnAssetRequest - 78, // 92: taprpc.TaprootAssets.ListBurns:input_type -> taprpc.ListBurnsRequest - 73, // 93: taprpc.TaprootAssets.GetInfo:input_type -> taprpc.GetInfoRequest - 75, // 94: taprpc.TaprootAssets.FetchAssetMeta:input_type -> taprpc.FetchAssetMetaRequest - 82, // 95: taprpc.TaprootAssets.SubscribeReceiveEvents:input_type -> taprpc.SubscribeReceiveEventsRequest - 84, // 96: taprpc.TaprootAssets.SubscribeSendEvents:input_type -> taprpc.SubscribeSendEventsRequest - 87, // 97: taprpc.TaprootAssets.RegisterTransfer:input_type -> taprpc.RegisterTransferRequest - 25, // 98: taprpc.TaprootAssets.ListAssets:output_type -> taprpc.ListAssetResponse - 28, // 99: taprpc.TaprootAssets.ListUtxos:output_type -> taprpc.ListUtxosResponse - 32, // 100: taprpc.TaprootAssets.ListGroups:output_type -> taprpc.ListGroupsResponse - 36, // 101: taprpc.TaprootAssets.ListBalances:output_type -> taprpc.ListBalancesResponse - 38, // 102: taprpc.TaprootAssets.ListTransfers:output_type -> taprpc.ListTransfersResponse - 45, // 103: taprpc.TaprootAssets.StopDaemon:output_type -> taprpc.StopResponse - 47, // 104: taprpc.TaprootAssets.DebugLevel:output_type -> taprpc.DebugLevelResponse - 50, // 105: taprpc.TaprootAssets.QueryAddrs:output_type -> taprpc.QueryAddrResponse - 48, // 106: taprpc.TaprootAssets.NewAddr:output_type -> taprpc.Addr - 48, // 107: taprpc.TaprootAssets.DecodeAddr:output_type -> taprpc.Addr - 69, // 108: taprpc.TaprootAssets.AddrReceives:output_type -> taprpc.AddrReceivesResponse - 61, // 109: taprpc.TaprootAssets.VerifyProof:output_type -> taprpc.VerifyProofResponse - 63, // 110: taprpc.TaprootAssets.DecodeProof:output_type -> taprpc.DecodeProofResponse - 59, // 111: taprpc.TaprootAssets.ExportProof:output_type -> taprpc.ProofFile - 66, // 112: taprpc.TaprootAssets.UnpackProofFile:output_type -> taprpc.UnpackProofFileResponse - 72, // 113: taprpc.TaprootAssets.SendAsset:output_type -> taprpc.SendAssetResponse - 77, // 114: taprpc.TaprootAssets.BurnAsset:output_type -> taprpc.BurnAssetResponse - 80, // 115: taprpc.TaprootAssets.ListBurns:output_type -> taprpc.ListBurnsResponse - 74, // 116: taprpc.TaprootAssets.GetInfo:output_type -> taprpc.GetInfoResponse - 9, // 117: taprpc.TaprootAssets.FetchAssetMeta:output_type -> taprpc.AssetMeta - 83, // 118: taprpc.TaprootAssets.SubscribeReceiveEvents:output_type -> taprpc.ReceiveEvent - 85, // 119: taprpc.TaprootAssets.SubscribeSendEvents:output_type -> taprpc.SendEvent - 88, // 120: taprpc.TaprootAssets.RegisterTransfer:output_type -> taprpc.RegisterTransferResponse - 98, // [98:121] is the sub-list for method output_type - 75, // [75:98] is the sub-list for method input_type - 75, // [75:75] is the sub-list for extension type_name - 75, // [75:75] is the sub-list for extension extendee - 0, // [0:75] is the sub-list for field type_name + 1, // 0: taprpc.AssetMeta.type:type_name -> taprpc.AssetMetaType + 54, // 1: taprpc.ListAssetRequest.script_key:type_name -> taprpc.ScriptKey + 83, // 2: taprpc.ListAssetRequest.anchor_outpoint:type_name -> taprpc.OutPoint + 53, // 3: taprpc.ListAssetRequest.script_key_type:type_name -> taprpc.ScriptKeyTypeQuery + 0, // 4: taprpc.GenesisInfo.asset_type:type_name -> taprpc.AssetType + 56, // 5: taprpc.GroupKeyRequest.raw_key:type_name -> taprpc.KeyDescriptor + 13, // 6: taprpc.GroupKeyRequest.anchor_genesis:type_name -> taprpc.GenesisInfo + 14, // 7: taprpc.GroupKeyRequest.external_key:type_name -> taprpc.ExternalKey + 16, // 8: taprpc.GroupVirtualTx.prev_out:type_name -> taprpc.TxOut + 13, // 9: taprpc.GenesisReveal.genesis_base_reveal:type_name -> taprpc.GenesisInfo + 2, // 10: taprpc.Asset.version:type_name -> taprpc.AssetVersion + 13, // 11: taprpc.Asset.asset_genesis:type_name -> taprpc.GenesisInfo + 19, // 12: taprpc.Asset.asset_group:type_name -> taprpc.AssetGroup + 12, // 13: taprpc.Asset.chain_anchor:type_name -> taprpc.AnchorInfo + 24, // 14: taprpc.Asset.prev_witnesses:type_name -> taprpc.PrevWitness + 22, // 15: taprpc.Asset.decimal_display:type_name -> taprpc.DecimalDisplay + 6, // 16: taprpc.Asset.script_key_type:type_name -> taprpc.ScriptKeyType + 73, // 17: taprpc.PrevWitness.prev_id:type_name -> taprpc.PrevInputAsset + 25, // 18: taprpc.PrevWitness.split_commitment:type_name -> taprpc.SplitCommitment + 23, // 19: taprpc.SplitCommitment.root_asset:type_name -> taprpc.Asset + 23, // 20: taprpc.ListAssetResponse.assets:type_name -> taprpc.Asset + 53, // 21: taprpc.ListUtxosRequest.script_key_type:type_name -> taprpc.ScriptKeyTypeQuery + 23, // 22: taprpc.ManagedUtxo.assets:type_name -> taprpc.Asset + 91, // 23: taprpc.ListUtxosResponse.managed_utxos:type_name -> taprpc.ListUtxosResponse.ManagedUtxosEntry + 0, // 24: taprpc.AssetHumanReadable.type:type_name -> taprpc.AssetType + 2, // 25: taprpc.AssetHumanReadable.version:type_name -> taprpc.AssetVersion + 31, // 26: taprpc.GroupedAssets.assets:type_name -> taprpc.AssetHumanReadable + 92, // 27: taprpc.ListGroupsResponse.groups:type_name -> taprpc.ListGroupsResponse.GroupsEntry + 53, // 28: taprpc.ListBalancesRequest.script_key_type:type_name -> taprpc.ScriptKeyTypeQuery + 13, // 29: taprpc.AssetBalance.asset_genesis:type_name -> taprpc.GenesisInfo + 93, // 30: taprpc.ListBalancesResponse.asset_balances:type_name -> taprpc.ListBalancesResponse.AssetBalancesEntry + 94, // 31: taprpc.ListBalancesResponse.asset_group_balances:type_name -> taprpc.ListBalancesResponse.AssetGroupBalancesEntry + 41, // 32: taprpc.ListTransfersResponse.transfers:type_name -> taprpc.AssetTransfer + 42, // 33: taprpc.AssetTransfer.inputs:type_name -> taprpc.TransferInput + 44, // 34: taprpc.AssetTransfer.outputs:type_name -> taprpc.TransferOutput + 40, // 35: taprpc.AssetTransfer.anchor_tx_block_hash:type_name -> taprpc.ChainHash + 43, // 36: taprpc.TransferOutput.anchor:type_name -> taprpc.TransferOutputAnchor + 3, // 37: taprpc.TransferOutput.output_type:type_name -> taprpc.OutputType + 2, // 38: taprpc.TransferOutput.asset_version:type_name -> taprpc.AssetVersion + 4, // 39: taprpc.TransferOutput.proof_delivery_status:type_name -> taprpc.ProofDeliveryStatus + 0, // 40: taprpc.Addr.asset_type:type_name -> taprpc.AssetType + 2, // 41: taprpc.Addr.asset_version:type_name -> taprpc.AssetVersion + 5, // 42: taprpc.Addr.address_version:type_name -> taprpc.AddrVersion + 49, // 43: taprpc.QueryAddrResponse.addrs:type_name -> taprpc.Addr + 54, // 44: taprpc.NewAddrRequest.script_key:type_name -> taprpc.ScriptKey + 56, // 45: taprpc.NewAddrRequest.internal_key:type_name -> taprpc.KeyDescriptor + 2, // 46: taprpc.NewAddrRequest.asset_version:type_name -> taprpc.AssetVersion + 5, // 47: taprpc.NewAddrRequest.address_version:type_name -> taprpc.AddrVersion + 6, // 48: taprpc.ScriptKeyTypeQuery.explicit_type:type_name -> taprpc.ScriptKeyType + 56, // 49: taprpc.ScriptKey.key_desc:type_name -> taprpc.KeyDescriptor + 6, // 50: taprpc.ScriptKey.type:type_name -> taprpc.ScriptKeyType + 55, // 51: taprpc.KeyDescriptor.key_loc:type_name -> taprpc.KeyLocator + 58, // 52: taprpc.TapscriptFullTree.all_leaves:type_name -> taprpc.TapLeaf + 23, // 53: taprpc.DecodedProof.asset:type_name -> taprpc.Asset + 10, // 54: taprpc.DecodedProof.meta_reveal:type_name -> taprpc.AssetMeta + 21, // 55: taprpc.DecodedProof.genesis_reveal:type_name -> taprpc.GenesisReveal + 20, // 56: taprpc.DecodedProof.group_key_reveal:type_name -> taprpc.GroupKeyReveal + 62, // 57: taprpc.VerifyProofResponse.decoded_proof:type_name -> taprpc.DecodedProof + 62, // 58: taprpc.DecodeProofResponse.decoded_proof:type_name -> taprpc.DecodedProof + 83, // 59: taprpc.ExportProofRequest.outpoint:type_name -> taprpc.OutPoint + 49, // 60: taprpc.AddrEvent.addr:type_name -> taprpc.Addr + 7, // 61: taprpc.AddrEvent.status:type_name -> taprpc.AddrEventStatus + 7, // 62: taprpc.AddrReceivesRequest.filter_status:type_name -> taprpc.AddrEventStatus + 69, // 63: taprpc.AddrReceivesResponse.events:type_name -> taprpc.AddrEvent + 41, // 64: taprpc.SendAssetResponse.transfer:type_name -> taprpc.AssetTransfer + 41, // 65: taprpc.BurnAssetResponse.burn_transfer:type_name -> taprpc.AssetTransfer + 62, // 66: taprpc.BurnAssetResponse.burn_proof:type_name -> taprpc.DecodedProof + 81, // 67: taprpc.ListBurnsResponse.burns:type_name -> taprpc.AssetBurn + 49, // 68: taprpc.ReceiveEvent.address:type_name -> taprpc.Addr + 7, // 69: taprpc.ReceiveEvent.status:type_name -> taprpc.AddrEventStatus + 9, // 70: taprpc.SendEvent.parcel_type:type_name -> taprpc.ParcelType + 49, // 71: taprpc.SendEvent.addresses:type_name -> taprpc.Addr + 88, // 72: taprpc.SendEvent.anchor_transaction:type_name -> taprpc.AnchorTransaction + 41, // 73: taprpc.SendEvent.transfer:type_name -> taprpc.AssetTransfer + 83, // 74: taprpc.AnchorTransaction.lnd_locked_utxos:type_name -> taprpc.OutPoint + 83, // 75: taprpc.RegisterTransferRequest.outpoint:type_name -> taprpc.OutPoint + 23, // 76: taprpc.RegisterTransferResponse.registered_asset:type_name -> taprpc.Asset + 28, // 77: taprpc.ListUtxosResponse.ManagedUtxosEntry.value:type_name -> taprpc.ManagedUtxo + 32, // 78: taprpc.ListGroupsResponse.GroupsEntry.value:type_name -> taprpc.GroupedAssets + 35, // 79: taprpc.ListBalancesResponse.AssetBalancesEntry.value:type_name -> taprpc.AssetBalance + 36, // 80: taprpc.ListBalancesResponse.AssetGroupBalancesEntry.value:type_name -> taprpc.AssetGroupBalance + 11, // 81: taprpc.TaprootAssets.ListAssets:input_type -> taprpc.ListAssetRequest + 27, // 82: taprpc.TaprootAssets.ListUtxos:input_type -> taprpc.ListUtxosRequest + 30, // 83: taprpc.TaprootAssets.ListGroups:input_type -> taprpc.ListGroupsRequest + 34, // 84: taprpc.TaprootAssets.ListBalances:input_type -> taprpc.ListBalancesRequest + 38, // 85: taprpc.TaprootAssets.ListTransfers:input_type -> taprpc.ListTransfersRequest + 45, // 86: taprpc.TaprootAssets.StopDaemon:input_type -> taprpc.StopRequest + 47, // 87: taprpc.TaprootAssets.DebugLevel:input_type -> taprpc.DebugLevelRequest + 50, // 88: taprpc.TaprootAssets.QueryAddrs:input_type -> taprpc.QueryAddrRequest + 52, // 89: taprpc.TaprootAssets.NewAddr:input_type -> taprpc.NewAddrRequest + 60, // 90: taprpc.TaprootAssets.DecodeAddr:input_type -> taprpc.DecodeAddrRequest + 70, // 91: taprpc.TaprootAssets.AddrReceives:input_type -> taprpc.AddrReceivesRequest + 61, // 92: taprpc.TaprootAssets.VerifyProof:input_type -> taprpc.ProofFile + 64, // 93: taprpc.TaprootAssets.DecodeProof:input_type -> taprpc.DecodeProofRequest + 66, // 94: taprpc.TaprootAssets.ExportProof:input_type -> taprpc.ExportProofRequest + 67, // 95: taprpc.TaprootAssets.UnpackProofFile:input_type -> taprpc.UnpackProofFileRequest + 72, // 96: taprpc.TaprootAssets.SendAsset:input_type -> taprpc.SendAssetRequest + 78, // 97: taprpc.TaprootAssets.BurnAsset:input_type -> taprpc.BurnAssetRequest + 80, // 98: taprpc.TaprootAssets.ListBurns:input_type -> taprpc.ListBurnsRequest + 75, // 99: taprpc.TaprootAssets.GetInfo:input_type -> taprpc.GetInfoRequest + 77, // 100: taprpc.TaprootAssets.FetchAssetMeta:input_type -> taprpc.FetchAssetMetaRequest + 84, // 101: taprpc.TaprootAssets.SubscribeReceiveEvents:input_type -> taprpc.SubscribeReceiveEventsRequest + 86, // 102: taprpc.TaprootAssets.SubscribeSendEvents:input_type -> taprpc.SubscribeSendEventsRequest + 89, // 103: taprpc.TaprootAssets.RegisterTransfer:input_type -> taprpc.RegisterTransferRequest + 26, // 104: taprpc.TaprootAssets.ListAssets:output_type -> taprpc.ListAssetResponse + 29, // 105: taprpc.TaprootAssets.ListUtxos:output_type -> taprpc.ListUtxosResponse + 33, // 106: taprpc.TaprootAssets.ListGroups:output_type -> taprpc.ListGroupsResponse + 37, // 107: taprpc.TaprootAssets.ListBalances:output_type -> taprpc.ListBalancesResponse + 39, // 108: taprpc.TaprootAssets.ListTransfers:output_type -> taprpc.ListTransfersResponse + 46, // 109: taprpc.TaprootAssets.StopDaemon:output_type -> taprpc.StopResponse + 48, // 110: taprpc.TaprootAssets.DebugLevel:output_type -> taprpc.DebugLevelResponse + 51, // 111: taprpc.TaprootAssets.QueryAddrs:output_type -> taprpc.QueryAddrResponse + 49, // 112: taprpc.TaprootAssets.NewAddr:output_type -> taprpc.Addr + 49, // 113: taprpc.TaprootAssets.DecodeAddr:output_type -> taprpc.Addr + 71, // 114: taprpc.TaprootAssets.AddrReceives:output_type -> taprpc.AddrReceivesResponse + 63, // 115: taprpc.TaprootAssets.VerifyProof:output_type -> taprpc.VerifyProofResponse + 65, // 116: taprpc.TaprootAssets.DecodeProof:output_type -> taprpc.DecodeProofResponse + 61, // 117: taprpc.TaprootAssets.ExportProof:output_type -> taprpc.ProofFile + 68, // 118: taprpc.TaprootAssets.UnpackProofFile:output_type -> taprpc.UnpackProofFileResponse + 74, // 119: taprpc.TaprootAssets.SendAsset:output_type -> taprpc.SendAssetResponse + 79, // 120: taprpc.TaprootAssets.BurnAsset:output_type -> taprpc.BurnAssetResponse + 82, // 121: taprpc.TaprootAssets.ListBurns:output_type -> taprpc.ListBurnsResponse + 76, // 122: taprpc.TaprootAssets.GetInfo:output_type -> taprpc.GetInfoResponse + 10, // 123: taprpc.TaprootAssets.FetchAssetMeta:output_type -> taprpc.AssetMeta + 85, // 124: taprpc.TaprootAssets.SubscribeReceiveEvents:output_type -> taprpc.ReceiveEvent + 87, // 125: taprpc.TaprootAssets.SubscribeSendEvents:output_type -> taprpc.SendEvent + 90, // 126: taprpc.TaprootAssets.RegisterTransfer:output_type -> taprpc.RegisterTransferResponse + 104, // [104:127] is the sub-list for method output_type + 81, // [81:104] is the sub-list for method input_type + 81, // [81:81] is the sub-list for extension type_name + 81, // [81:81] is the sub-list for extension extendee + 0, // [0:81] is the sub-list for field type_name } func init() { file_taprootassets_proto_init() } @@ -7762,7 +8035,7 @@ func file_taprootassets_proto_init() { return } if !protoimpl.UnsafeEnabled { - file_taprootassets_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + file_taprootassets_proto_msgTypes[0].Exporter = func(v any, i int) any { switch v := v.(*AssetMeta); i { case 0: return &v.state @@ -7774,7 +8047,7 @@ func file_taprootassets_proto_init() { return nil } } - file_taprootassets_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + file_taprootassets_proto_msgTypes[1].Exporter = func(v any, i int) any { switch v := v.(*ListAssetRequest); i { case 0: return &v.state @@ -7786,7 +8059,7 @@ func file_taprootassets_proto_init() { return nil } } - file_taprootassets_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + file_taprootassets_proto_msgTypes[2].Exporter = func(v any, i int) any { switch v := v.(*AnchorInfo); i { case 0: return &v.state @@ -7798,7 +8071,7 @@ func file_taprootassets_proto_init() { return nil } } - file_taprootassets_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + file_taprootassets_proto_msgTypes[3].Exporter = func(v any, i int) any { switch v := v.(*GenesisInfo); i { case 0: return &v.state @@ -7810,7 +8083,7 @@ func file_taprootassets_proto_init() { return nil } } - file_taprootassets_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + file_taprootassets_proto_msgTypes[4].Exporter = func(v any, i int) any { switch v := v.(*ExternalKey); i { case 0: return &v.state @@ -7822,7 +8095,7 @@ func file_taprootassets_proto_init() { return nil } } - file_taprootassets_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + file_taprootassets_proto_msgTypes[5].Exporter = func(v any, i int) any { switch v := v.(*GroupKeyRequest); i { case 0: return &v.state @@ -7834,7 +8107,7 @@ func file_taprootassets_proto_init() { return nil } } - file_taprootassets_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { + file_taprootassets_proto_msgTypes[6].Exporter = func(v any, i int) any { switch v := v.(*TxOut); i { case 0: return &v.state @@ -7846,7 +8119,7 @@ func file_taprootassets_proto_init() { return nil } } - file_taprootassets_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { + file_taprootassets_proto_msgTypes[7].Exporter = func(v any, i int) any { switch v := v.(*GroupVirtualTx); i { case 0: return &v.state @@ -7858,7 +8131,7 @@ func file_taprootassets_proto_init() { return nil } } - file_taprootassets_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { + file_taprootassets_proto_msgTypes[8].Exporter = func(v any, i int) any { switch v := v.(*GroupWitness); i { case 0: return &v.state @@ -7870,7 +8143,7 @@ func file_taprootassets_proto_init() { return nil } } - file_taprootassets_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { + file_taprootassets_proto_msgTypes[9].Exporter = func(v any, i int) any { switch v := v.(*AssetGroup); i { case 0: return &v.state @@ -7882,7 +8155,7 @@ func file_taprootassets_proto_init() { return nil } } - file_taprootassets_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { + file_taprootassets_proto_msgTypes[10].Exporter = func(v any, i int) any { switch v := v.(*GroupKeyReveal); i { case 0: return &v.state @@ -7894,7 +8167,7 @@ func file_taprootassets_proto_init() { return nil } } - file_taprootassets_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { + file_taprootassets_proto_msgTypes[11].Exporter = func(v any, i int) any { switch v := v.(*GenesisReveal); i { case 0: return &v.state @@ -7906,7 +8179,7 @@ func file_taprootassets_proto_init() { return nil } } - file_taprootassets_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { + file_taprootassets_proto_msgTypes[12].Exporter = func(v any, i int) any { switch v := v.(*DecimalDisplay); i { case 0: return &v.state @@ -7918,7 +8191,7 @@ func file_taprootassets_proto_init() { return nil } } - file_taprootassets_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { + file_taprootassets_proto_msgTypes[13].Exporter = func(v any, i int) any { switch v := v.(*Asset); i { case 0: return &v.state @@ -7930,7 +8203,7 @@ func file_taprootassets_proto_init() { return nil } } - file_taprootassets_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { + file_taprootassets_proto_msgTypes[14].Exporter = func(v any, i int) any { switch v := v.(*PrevWitness); i { case 0: return &v.state @@ -7942,7 +8215,7 @@ func file_taprootassets_proto_init() { return nil } } - file_taprootassets_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { + file_taprootassets_proto_msgTypes[15].Exporter = func(v any, i int) any { switch v := v.(*SplitCommitment); i { case 0: return &v.state @@ -7954,7 +8227,7 @@ func file_taprootassets_proto_init() { return nil } } - file_taprootassets_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { + file_taprootassets_proto_msgTypes[16].Exporter = func(v any, i int) any { switch v := v.(*ListAssetResponse); i { case 0: return &v.state @@ -7966,7 +8239,7 @@ func file_taprootassets_proto_init() { return nil } } - file_taprootassets_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { + file_taprootassets_proto_msgTypes[17].Exporter = func(v any, i int) any { switch v := v.(*ListUtxosRequest); i { case 0: return &v.state @@ -7978,7 +8251,7 @@ func file_taprootassets_proto_init() { return nil } } - file_taprootassets_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { + file_taprootassets_proto_msgTypes[18].Exporter = func(v any, i int) any { switch v := v.(*ManagedUtxo); i { case 0: return &v.state @@ -7990,7 +8263,7 @@ func file_taprootassets_proto_init() { return nil } } - file_taprootassets_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { + file_taprootassets_proto_msgTypes[19].Exporter = func(v any, i int) any { switch v := v.(*ListUtxosResponse); i { case 0: return &v.state @@ -8002,7 +8275,7 @@ func file_taprootassets_proto_init() { return nil } } - file_taprootassets_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { + file_taprootassets_proto_msgTypes[20].Exporter = func(v any, i int) any { switch v := v.(*ListGroupsRequest); i { case 0: return &v.state @@ -8014,7 +8287,7 @@ func file_taprootassets_proto_init() { return nil } } - file_taprootassets_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { + file_taprootassets_proto_msgTypes[21].Exporter = func(v any, i int) any { switch v := v.(*AssetHumanReadable); i { case 0: return &v.state @@ -8026,7 +8299,7 @@ func file_taprootassets_proto_init() { return nil } } - file_taprootassets_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { + file_taprootassets_proto_msgTypes[22].Exporter = func(v any, i int) any { switch v := v.(*GroupedAssets); i { case 0: return &v.state @@ -8038,7 +8311,7 @@ func file_taprootassets_proto_init() { return nil } } - file_taprootassets_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { + file_taprootassets_proto_msgTypes[23].Exporter = func(v any, i int) any { switch v := v.(*ListGroupsResponse); i { case 0: return &v.state @@ -8050,7 +8323,7 @@ func file_taprootassets_proto_init() { return nil } } - file_taprootassets_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { + file_taprootassets_proto_msgTypes[24].Exporter = func(v any, i int) any { switch v := v.(*ListBalancesRequest); i { case 0: return &v.state @@ -8062,7 +8335,7 @@ func file_taprootassets_proto_init() { return nil } } - file_taprootassets_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { + file_taprootassets_proto_msgTypes[25].Exporter = func(v any, i int) any { switch v := v.(*AssetBalance); i { case 0: return &v.state @@ -8074,7 +8347,7 @@ func file_taprootassets_proto_init() { return nil } } - file_taprootassets_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { + file_taprootassets_proto_msgTypes[26].Exporter = func(v any, i int) any { switch v := v.(*AssetGroupBalance); i { case 0: return &v.state @@ -8086,7 +8359,7 @@ func file_taprootassets_proto_init() { return nil } } - file_taprootassets_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { + file_taprootassets_proto_msgTypes[27].Exporter = func(v any, i int) any { switch v := v.(*ListBalancesResponse); i { case 0: return &v.state @@ -8098,7 +8371,7 @@ func file_taprootassets_proto_init() { return nil } } - file_taprootassets_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { + file_taprootassets_proto_msgTypes[28].Exporter = func(v any, i int) any { switch v := v.(*ListTransfersRequest); i { case 0: return &v.state @@ -8110,7 +8383,7 @@ func file_taprootassets_proto_init() { return nil } } - file_taprootassets_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} { + file_taprootassets_proto_msgTypes[29].Exporter = func(v any, i int) any { switch v := v.(*ListTransfersResponse); i { case 0: return &v.state @@ -8122,7 +8395,7 @@ func file_taprootassets_proto_init() { return nil } } - file_taprootassets_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} { + file_taprootassets_proto_msgTypes[30].Exporter = func(v any, i int) any { switch v := v.(*ChainHash); i { case 0: return &v.state @@ -8134,7 +8407,7 @@ func file_taprootassets_proto_init() { return nil } } - file_taprootassets_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { + file_taprootassets_proto_msgTypes[31].Exporter = func(v any, i int) any { switch v := v.(*AssetTransfer); i { case 0: return &v.state @@ -8146,7 +8419,7 @@ func file_taprootassets_proto_init() { return nil } } - file_taprootassets_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} { + file_taprootassets_proto_msgTypes[32].Exporter = func(v any, i int) any { switch v := v.(*TransferInput); i { case 0: return &v.state @@ -8158,7 +8431,7 @@ func file_taprootassets_proto_init() { return nil } } - file_taprootassets_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} { + file_taprootassets_proto_msgTypes[33].Exporter = func(v any, i int) any { switch v := v.(*TransferOutputAnchor); i { case 0: return &v.state @@ -8170,7 +8443,7 @@ func file_taprootassets_proto_init() { return nil } } - file_taprootassets_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} { + file_taprootassets_proto_msgTypes[34].Exporter = func(v any, i int) any { switch v := v.(*TransferOutput); i { case 0: return &v.state @@ -8182,7 +8455,7 @@ func file_taprootassets_proto_init() { return nil } } - file_taprootassets_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} { + file_taprootassets_proto_msgTypes[35].Exporter = func(v any, i int) any { switch v := v.(*StopRequest); i { case 0: return &v.state @@ -8194,7 +8467,7 @@ func file_taprootassets_proto_init() { return nil } } - file_taprootassets_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} { + file_taprootassets_proto_msgTypes[36].Exporter = func(v any, i int) any { switch v := v.(*StopResponse); i { case 0: return &v.state @@ -8206,7 +8479,7 @@ func file_taprootassets_proto_init() { return nil } } - file_taprootassets_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} { + file_taprootassets_proto_msgTypes[37].Exporter = func(v any, i int) any { switch v := v.(*DebugLevelRequest); i { case 0: return &v.state @@ -8218,7 +8491,7 @@ func file_taprootassets_proto_init() { return nil } } - file_taprootassets_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} { + file_taprootassets_proto_msgTypes[38].Exporter = func(v any, i int) any { switch v := v.(*DebugLevelResponse); i { case 0: return &v.state @@ -8230,7 +8503,7 @@ func file_taprootassets_proto_init() { return nil } } - file_taprootassets_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} { + file_taprootassets_proto_msgTypes[39].Exporter = func(v any, i int) any { switch v := v.(*Addr); i { case 0: return &v.state @@ -8242,7 +8515,7 @@ func file_taprootassets_proto_init() { return nil } } - file_taprootassets_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} { + file_taprootassets_proto_msgTypes[40].Exporter = func(v any, i int) any { switch v := v.(*QueryAddrRequest); i { case 0: return &v.state @@ -8254,7 +8527,7 @@ func file_taprootassets_proto_init() { return nil } } - file_taprootassets_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} { + file_taprootassets_proto_msgTypes[41].Exporter = func(v any, i int) any { switch v := v.(*QueryAddrResponse); i { case 0: return &v.state @@ -8266,7 +8539,7 @@ func file_taprootassets_proto_init() { return nil } } - file_taprootassets_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} { + file_taprootassets_proto_msgTypes[42].Exporter = func(v any, i int) any { switch v := v.(*NewAddrRequest); i { case 0: return &v.state @@ -8278,7 +8551,19 @@ func file_taprootassets_proto_init() { return nil } } - file_taprootassets_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} { + file_taprootassets_proto_msgTypes[43].Exporter = func(v any, i int) any { + switch v := v.(*ScriptKeyTypeQuery); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_taprootassets_proto_msgTypes[44].Exporter = func(v any, i int) any { switch v := v.(*ScriptKey); i { case 0: return &v.state @@ -8290,7 +8575,7 @@ func file_taprootassets_proto_init() { return nil } } - file_taprootassets_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} { + file_taprootassets_proto_msgTypes[45].Exporter = func(v any, i int) any { switch v := v.(*KeyLocator); i { case 0: return &v.state @@ -8302,7 +8587,7 @@ func file_taprootassets_proto_init() { return nil } } - file_taprootassets_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} { + file_taprootassets_proto_msgTypes[46].Exporter = func(v any, i int) any { switch v := v.(*KeyDescriptor); i { case 0: return &v.state @@ -8314,7 +8599,7 @@ func file_taprootassets_proto_init() { return nil } } - file_taprootassets_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} { + file_taprootassets_proto_msgTypes[47].Exporter = func(v any, i int) any { switch v := v.(*TapscriptFullTree); i { case 0: return &v.state @@ -8326,7 +8611,7 @@ func file_taprootassets_proto_init() { return nil } } - file_taprootassets_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} { + file_taprootassets_proto_msgTypes[48].Exporter = func(v any, i int) any { switch v := v.(*TapLeaf); i { case 0: return &v.state @@ -8338,7 +8623,7 @@ func file_taprootassets_proto_init() { return nil } } - file_taprootassets_proto_msgTypes[48].Exporter = func(v interface{}, i int) interface{} { + file_taprootassets_proto_msgTypes[49].Exporter = func(v any, i int) any { switch v := v.(*TapBranch); i { case 0: return &v.state @@ -8350,7 +8635,7 @@ func file_taprootassets_proto_init() { return nil } } - file_taprootassets_proto_msgTypes[49].Exporter = func(v interface{}, i int) interface{} { + file_taprootassets_proto_msgTypes[50].Exporter = func(v any, i int) any { switch v := v.(*DecodeAddrRequest); i { case 0: return &v.state @@ -8362,7 +8647,7 @@ func file_taprootassets_proto_init() { return nil } } - file_taprootassets_proto_msgTypes[50].Exporter = func(v interface{}, i int) interface{} { + file_taprootassets_proto_msgTypes[51].Exporter = func(v any, i int) any { switch v := v.(*ProofFile); i { case 0: return &v.state @@ -8374,7 +8659,7 @@ func file_taprootassets_proto_init() { return nil } } - file_taprootassets_proto_msgTypes[51].Exporter = func(v interface{}, i int) interface{} { + file_taprootassets_proto_msgTypes[52].Exporter = func(v any, i int) any { switch v := v.(*DecodedProof); i { case 0: return &v.state @@ -8386,7 +8671,7 @@ func file_taprootassets_proto_init() { return nil } } - file_taprootassets_proto_msgTypes[52].Exporter = func(v interface{}, i int) interface{} { + file_taprootassets_proto_msgTypes[53].Exporter = func(v any, i int) any { switch v := v.(*VerifyProofResponse); i { case 0: return &v.state @@ -8398,7 +8683,7 @@ func file_taprootassets_proto_init() { return nil } } - file_taprootassets_proto_msgTypes[53].Exporter = func(v interface{}, i int) interface{} { + file_taprootassets_proto_msgTypes[54].Exporter = func(v any, i int) any { switch v := v.(*DecodeProofRequest); i { case 0: return &v.state @@ -8410,7 +8695,7 @@ func file_taprootassets_proto_init() { return nil } } - file_taprootassets_proto_msgTypes[54].Exporter = func(v interface{}, i int) interface{} { + file_taprootassets_proto_msgTypes[55].Exporter = func(v any, i int) any { switch v := v.(*DecodeProofResponse); i { case 0: return &v.state @@ -8422,7 +8707,7 @@ func file_taprootassets_proto_init() { return nil } } - file_taprootassets_proto_msgTypes[55].Exporter = func(v interface{}, i int) interface{} { + file_taprootassets_proto_msgTypes[56].Exporter = func(v any, i int) any { switch v := v.(*ExportProofRequest); i { case 0: return &v.state @@ -8434,7 +8719,7 @@ func file_taprootassets_proto_init() { return nil } } - file_taprootassets_proto_msgTypes[56].Exporter = func(v interface{}, i int) interface{} { + file_taprootassets_proto_msgTypes[57].Exporter = func(v any, i int) any { switch v := v.(*UnpackProofFileRequest); i { case 0: return &v.state @@ -8446,7 +8731,7 @@ func file_taprootassets_proto_init() { return nil } } - file_taprootassets_proto_msgTypes[57].Exporter = func(v interface{}, i int) interface{} { + file_taprootassets_proto_msgTypes[58].Exporter = func(v any, i int) any { switch v := v.(*UnpackProofFileResponse); i { case 0: return &v.state @@ -8458,7 +8743,7 @@ func file_taprootassets_proto_init() { return nil } } - file_taprootassets_proto_msgTypes[58].Exporter = func(v interface{}, i int) interface{} { + file_taprootassets_proto_msgTypes[59].Exporter = func(v any, i int) any { switch v := v.(*AddrEvent); i { case 0: return &v.state @@ -8470,7 +8755,7 @@ func file_taprootassets_proto_init() { return nil } } - file_taprootassets_proto_msgTypes[59].Exporter = func(v interface{}, i int) interface{} { + file_taprootassets_proto_msgTypes[60].Exporter = func(v any, i int) any { switch v := v.(*AddrReceivesRequest); i { case 0: return &v.state @@ -8482,7 +8767,7 @@ func file_taprootassets_proto_init() { return nil } } - file_taprootassets_proto_msgTypes[60].Exporter = func(v interface{}, i int) interface{} { + file_taprootassets_proto_msgTypes[61].Exporter = func(v any, i int) any { switch v := v.(*AddrReceivesResponse); i { case 0: return &v.state @@ -8494,7 +8779,7 @@ func file_taprootassets_proto_init() { return nil } } - file_taprootassets_proto_msgTypes[61].Exporter = func(v interface{}, i int) interface{} { + file_taprootassets_proto_msgTypes[62].Exporter = func(v any, i int) any { switch v := v.(*SendAssetRequest); i { case 0: return &v.state @@ -8506,7 +8791,7 @@ func file_taprootassets_proto_init() { return nil } } - file_taprootassets_proto_msgTypes[62].Exporter = func(v interface{}, i int) interface{} { + file_taprootassets_proto_msgTypes[63].Exporter = func(v any, i int) any { switch v := v.(*PrevInputAsset); i { case 0: return &v.state @@ -8518,7 +8803,7 @@ func file_taprootassets_proto_init() { return nil } } - file_taprootassets_proto_msgTypes[63].Exporter = func(v interface{}, i int) interface{} { + file_taprootassets_proto_msgTypes[64].Exporter = func(v any, i int) any { switch v := v.(*SendAssetResponse); i { case 0: return &v.state @@ -8530,7 +8815,7 @@ func file_taprootassets_proto_init() { return nil } } - file_taprootassets_proto_msgTypes[64].Exporter = func(v interface{}, i int) interface{} { + file_taprootassets_proto_msgTypes[65].Exporter = func(v any, i int) any { switch v := v.(*GetInfoRequest); i { case 0: return &v.state @@ -8542,7 +8827,7 @@ func file_taprootassets_proto_init() { return nil } } - file_taprootassets_proto_msgTypes[65].Exporter = func(v interface{}, i int) interface{} { + file_taprootassets_proto_msgTypes[66].Exporter = func(v any, i int) any { switch v := v.(*GetInfoResponse); i { case 0: return &v.state @@ -8554,7 +8839,7 @@ func file_taprootassets_proto_init() { return nil } } - file_taprootassets_proto_msgTypes[66].Exporter = func(v interface{}, i int) interface{} { + file_taprootassets_proto_msgTypes[67].Exporter = func(v any, i int) any { switch v := v.(*FetchAssetMetaRequest); i { case 0: return &v.state @@ -8566,7 +8851,7 @@ func file_taprootassets_proto_init() { return nil } } - file_taprootassets_proto_msgTypes[67].Exporter = func(v interface{}, i int) interface{} { + file_taprootassets_proto_msgTypes[68].Exporter = func(v any, i int) any { switch v := v.(*BurnAssetRequest); i { case 0: return &v.state @@ -8578,7 +8863,7 @@ func file_taprootassets_proto_init() { return nil } } - file_taprootassets_proto_msgTypes[68].Exporter = func(v interface{}, i int) interface{} { + file_taprootassets_proto_msgTypes[69].Exporter = func(v any, i int) any { switch v := v.(*BurnAssetResponse); i { case 0: return &v.state @@ -8590,7 +8875,7 @@ func file_taprootassets_proto_init() { return nil } } - file_taprootassets_proto_msgTypes[69].Exporter = func(v interface{}, i int) interface{} { + file_taprootassets_proto_msgTypes[70].Exporter = func(v any, i int) any { switch v := v.(*ListBurnsRequest); i { case 0: return &v.state @@ -8602,7 +8887,7 @@ func file_taprootassets_proto_init() { return nil } } - file_taprootassets_proto_msgTypes[70].Exporter = func(v interface{}, i int) interface{} { + file_taprootassets_proto_msgTypes[71].Exporter = func(v any, i int) any { switch v := v.(*AssetBurn); i { case 0: return &v.state @@ -8614,7 +8899,7 @@ func file_taprootassets_proto_init() { return nil } } - file_taprootassets_proto_msgTypes[71].Exporter = func(v interface{}, i int) interface{} { + file_taprootassets_proto_msgTypes[72].Exporter = func(v any, i int) any { switch v := v.(*ListBurnsResponse); i { case 0: return &v.state @@ -8626,7 +8911,7 @@ func file_taprootassets_proto_init() { return nil } } - file_taprootassets_proto_msgTypes[72].Exporter = func(v interface{}, i int) interface{} { + file_taprootassets_proto_msgTypes[73].Exporter = func(v any, i int) any { switch v := v.(*OutPoint); i { case 0: return &v.state @@ -8638,7 +8923,7 @@ func file_taprootassets_proto_init() { return nil } } - file_taprootassets_proto_msgTypes[73].Exporter = func(v interface{}, i int) interface{} { + file_taprootassets_proto_msgTypes[74].Exporter = func(v any, i int) any { switch v := v.(*SubscribeReceiveEventsRequest); i { case 0: return &v.state @@ -8650,7 +8935,7 @@ func file_taprootassets_proto_init() { return nil } } - file_taprootassets_proto_msgTypes[74].Exporter = func(v interface{}, i int) interface{} { + file_taprootassets_proto_msgTypes[75].Exporter = func(v any, i int) any { switch v := v.(*ReceiveEvent); i { case 0: return &v.state @@ -8662,7 +8947,7 @@ func file_taprootassets_proto_init() { return nil } } - file_taprootassets_proto_msgTypes[75].Exporter = func(v interface{}, i int) interface{} { + file_taprootassets_proto_msgTypes[76].Exporter = func(v any, i int) any { switch v := v.(*SubscribeSendEventsRequest); i { case 0: return &v.state @@ -8674,7 +8959,7 @@ func file_taprootassets_proto_init() { return nil } } - file_taprootassets_proto_msgTypes[76].Exporter = func(v interface{}, i int) interface{} { + file_taprootassets_proto_msgTypes[77].Exporter = func(v any, i int) any { switch v := v.(*SendEvent); i { case 0: return &v.state @@ -8686,7 +8971,7 @@ func file_taprootassets_proto_init() { return nil } } - file_taprootassets_proto_msgTypes[77].Exporter = func(v interface{}, i int) interface{} { + file_taprootassets_proto_msgTypes[78].Exporter = func(v any, i int) any { switch v := v.(*AnchorTransaction); i { case 0: return &v.state @@ -8698,7 +8983,7 @@ func file_taprootassets_proto_init() { return nil } } - file_taprootassets_proto_msgTypes[78].Exporter = func(v interface{}, i int) interface{} { + file_taprootassets_proto_msgTypes[79].Exporter = func(v any, i int) any { switch v := v.(*RegisterTransferRequest); i { case 0: return &v.state @@ -8710,7 +8995,7 @@ func file_taprootassets_proto_init() { return nil } } - file_taprootassets_proto_msgTypes[79].Exporter = func(v interface{}, i int) interface{} { + file_taprootassets_proto_msgTypes[80].Exporter = func(v any, i int) any { switch v := v.(*RegisterTransferResponse); i { case 0: return &v.state @@ -8723,17 +9008,21 @@ func file_taprootassets_proto_init() { } } } - file_taprootassets_proto_msgTypes[24].OneofWrappers = []interface{}{ + file_taprootassets_proto_msgTypes[24].OneofWrappers = []any{ (*ListBalancesRequest_AssetId)(nil), (*ListBalancesRequest_GroupKey)(nil), } - file_taprootassets_proto_msgTypes[66].OneofWrappers = []interface{}{ + file_taprootassets_proto_msgTypes[43].OneofWrappers = []any{ + (*ScriptKeyTypeQuery_ExplicitType)(nil), + (*ScriptKeyTypeQuery_AllTypes)(nil), + } + file_taprootassets_proto_msgTypes[67].OneofWrappers = []any{ (*FetchAssetMetaRequest_AssetId)(nil), (*FetchAssetMetaRequest_MetaHash)(nil), (*FetchAssetMetaRequest_AssetIdStr)(nil), (*FetchAssetMetaRequest_MetaHashStr)(nil), } - file_taprootassets_proto_msgTypes[67].OneofWrappers = []interface{}{ + file_taprootassets_proto_msgTypes[68].OneofWrappers = []any{ (*BurnAssetRequest_AssetId)(nil), (*BurnAssetRequest_AssetIdStr)(nil), } @@ -8742,8 +9031,8 @@ func file_taprootassets_proto_init() { File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_taprootassets_proto_rawDesc, - NumEnums: 9, - NumMessages: 84, + NumEnums: 10, + NumMessages: 85, NumExtensions: 0, NumServices: 1, }, diff --git a/taprpc/taprootassets.pb.gw.go b/taprpc/taprootassets.pb.gw.go index f6bfbad301..206f7c8a17 100644 --- a/taprpc/taprootassets.pb.gw.go +++ b/taprpc/taprootassets.pb.gw.go @@ -249,11 +249,7 @@ func request_TaprootAssets_StopDaemon_0(ctx context.Context, marshaler runtime.M var protoReq StopRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -266,11 +262,7 @@ func local_request_TaprootAssets_StopDaemon_0(ctx context.Context, marshaler run var protoReq StopRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -283,11 +275,7 @@ func request_TaprootAssets_DebugLevel_0(ctx context.Context, marshaler runtime.M var protoReq DebugLevelRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -300,11 +288,7 @@ func local_request_TaprootAssets_DebugLevel_0(ctx context.Context, marshaler run var protoReq DebugLevelRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -353,11 +337,7 @@ func request_TaprootAssets_NewAddr_0(ctx context.Context, marshaler runtime.Mars var protoReq NewAddrRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -370,11 +350,7 @@ func local_request_TaprootAssets_NewAddr_0(ctx context.Context, marshaler runtim var protoReq NewAddrRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -387,11 +363,7 @@ func request_TaprootAssets_DecodeAddr_0(ctx context.Context, marshaler runtime.M var protoReq DecodeAddrRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -404,11 +376,7 @@ func local_request_TaprootAssets_DecodeAddr_0(ctx context.Context, marshaler run var protoReq DecodeAddrRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -421,11 +389,7 @@ func request_TaprootAssets_AddrReceives_0(ctx context.Context, marshaler runtime var protoReq AddrReceivesRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -438,11 +402,7 @@ func local_request_TaprootAssets_AddrReceives_0(ctx context.Context, marshaler r var protoReq AddrReceivesRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -455,11 +415,7 @@ func request_TaprootAssets_VerifyProof_0(ctx context.Context, marshaler runtime. var protoReq ProofFile var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -472,11 +428,7 @@ func local_request_TaprootAssets_VerifyProof_0(ctx context.Context, marshaler ru var protoReq ProofFile var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -489,11 +441,7 @@ func request_TaprootAssets_DecodeProof_0(ctx context.Context, marshaler runtime. var protoReq DecodeProofRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -506,11 +454,7 @@ func local_request_TaprootAssets_DecodeProof_0(ctx context.Context, marshaler ru var protoReq DecodeProofRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -523,11 +467,7 @@ func request_TaprootAssets_ExportProof_0(ctx context.Context, marshaler runtime. var protoReq ExportProofRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -540,11 +480,7 @@ func local_request_TaprootAssets_ExportProof_0(ctx context.Context, marshaler ru var protoReq ExportProofRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -557,11 +493,7 @@ func request_TaprootAssets_UnpackProofFile_0(ctx context.Context, marshaler runt var protoReq UnpackProofFileRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -574,11 +506,7 @@ func local_request_TaprootAssets_UnpackProofFile_0(ctx context.Context, marshale var protoReq UnpackProofFileRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -591,11 +519,7 @@ func request_TaprootAssets_SendAsset_0(ctx context.Context, marshaler runtime.Ma var protoReq SendAssetRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -608,11 +532,7 @@ func local_request_TaprootAssets_SendAsset_0(ctx context.Context, marshaler runt var protoReq SendAssetRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -625,11 +545,7 @@ func request_TaprootAssets_BurnAsset_0(ctx context.Context, marshaler runtime.Ma var protoReq BurnAssetRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -642,11 +558,7 @@ func local_request_TaprootAssets_BurnAsset_0(ctx context.Context, marshaler runt var protoReq BurnAssetRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -710,7 +622,7 @@ func local_request_TaprootAssets_GetInfo_0(ctx context.Context, marshaler runtim } var ( - filter_TaprootAssets_FetchAssetMeta_0 = &utilities.DoubleArray{Encoding: map[string]int{"asset_id_str": 0, "assetIdStr": 1}, Base: []int{1, 1, 2, 0, 0}, Check: []int{0, 1, 1, 2, 3}} + filter_TaprootAssets_FetchAssetMeta_0 = &utilities.DoubleArray{Encoding: map[string]int{"asset_id_str": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} ) func request_TaprootAssets_FetchAssetMeta_0(ctx context.Context, marshaler runtime.Marshaler, client TaprootAssetsClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { @@ -790,7 +702,7 @@ func local_request_TaprootAssets_FetchAssetMeta_0(ctx context.Context, marshaler } var ( - filter_TaprootAssets_FetchAssetMeta_1 = &utilities.DoubleArray{Encoding: map[string]int{"meta_hash_str": 0, "metaHashStr": 1}, Base: []int{1, 1, 2, 0, 0}, Check: []int{0, 1, 1, 2, 3}} + filter_TaprootAssets_FetchAssetMeta_1 = &utilities.DoubleArray{Encoding: map[string]int{"meta_hash_str": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} ) func request_TaprootAssets_FetchAssetMeta_1(ctx context.Context, marshaler runtime.Marshaler, client TaprootAssetsClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { @@ -873,11 +785,7 @@ func request_TaprootAssets_SubscribeReceiveEvents_0(ctx context.Context, marshal var protoReq SubscribeReceiveEventsRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -898,11 +806,7 @@ func request_TaprootAssets_SubscribeSendEvents_0(ctx context.Context, marshaler var protoReq SubscribeSendEventsRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -923,11 +827,7 @@ func request_TaprootAssets_RegisterTransfer_0(ctx context.Context, marshaler run var protoReq RegisterTransferRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -940,11 +840,7 @@ func local_request_TaprootAssets_RegisterTransfer_0(ctx context.Context, marshal var protoReq RegisterTransferRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -1554,21 +1450,21 @@ func RegisterTaprootAssetsHandlerServer(ctx context.Context, mux *runtime.ServeM // RegisterTaprootAssetsHandlerFromEndpoint is same as RegisterTaprootAssetsHandler but // automatically dials to "endpoint" and closes the connection when "ctx" gets done. func RegisterTaprootAssetsHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) { - conn, err := grpc.DialContext(ctx, endpoint, opts...) + conn, err := grpc.NewClient(endpoint, opts...) if err != nil { return err } defer func() { if err != nil { if cerr := conn.Close(); cerr != nil { - grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr) + grpclog.Errorf("Failed to close conn to %s: %v", endpoint, cerr) } return } go func() { <-ctx.Done() if cerr := conn.Close(); cerr != nil { - grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr) + grpclog.Errorf("Failed to close conn to %s: %v", endpoint, cerr) } }() }() diff --git a/taprpc/taprootassets.proto b/taprpc/taprootassets.proto index 7bd8b3491f..fb86cd6612 100644 --- a/taprpc/taprootassets.proto +++ b/taprpc/taprootassets.proto @@ -231,6 +231,14 @@ message ListAssetRequest { // Return all assets that are currently anchored on this outpoint. OutPoint anchor_outpoint = 9; + + // The script key type to filter the assets by. If not set, only assets with + // a BIP-0086 script key will be returned (which is the equivalent of + // setting script_key_type.explicit_type = SCRIPT_KEY_BIP86). If the type + // is set to SCRIPT_KEY_BURN or SCRIPT_KEY_TOMBSTONE the include_spent flag + // will automatically be set to true, because assets of that type are always + // marked as spent. + ScriptKeyTypeQuery script_key_type = 10; } message AnchorInfo { @@ -517,6 +525,7 @@ message Asset { // assets in this output are destroyed and can no longer be spent. bool is_burn = 17; + // Deprecated, use script_key_type instead! // Indicates whether this script key has either been derived by the local // wallet or was explicitly declared to be known by using the // DeclareScriptKey RPC. Knowing the key conceptually means the key belongs @@ -527,6 +536,7 @@ message Asset { // script key will be shown in the wallet balance. bool script_key_declared_known = 18; + // Deprecated, use script_key_type instead! // Indicates whether the script key is known to have a Tapscript spend path, // meaning that the Taproot merkle root tweak is not empty. This will only // ever be true if either script_key_is_local or script_key_internals_known @@ -539,6 +549,12 @@ message Asset { // field is null, it means the presence of a decimal display field is // unknown in the current context. DecimalDisplay decimal_display = 20; + + // The type of the script key. This type is either user-declared when custom + // script keys are added, or automatically determined by the daemon for + // standard operations (e.g. BIP-86 keys, burn keys, tombstone keys, channel + // related keys). + ScriptKeyType script_key_type = 21; } message PrevWitness { @@ -568,6 +584,11 @@ message ListAssetResponse { message ListUtxosRequest { bool include_leased = 1; + + // The script key type to filter the assets by. If not set, only assets with + // a BIP-0086 script key will be returned (which is the equivalent of + // setting script_key_type.explicit_type = SCRIPT_KEY_BIP86). + ScriptKeyTypeQuery script_key_type = 2; } message ManagedUtxo { @@ -665,6 +686,14 @@ message ListBalancesRequest { // An option to include previous leased assets in the balances. bool include_leased = 5; + + // The script key type to filter the assets by. If not set, only assets with + // a BIP-0086 script key will be returned (which is the equivalent of + // setting script_key_type.explicit_type = SCRIPT_KEY_BIP86). If the type + // is set to SCRIPT_KEY_BURN or SCRIPT_KEY_TOMBSTONE the include_spent flag + // will automatically be set to true, because assets of that type are always + // marked as spent. + ScriptKeyTypeQuery script_key_type = 6; } message AssetBalance { @@ -1007,6 +1036,67 @@ message NewAddrRequest { AddrVersion address_version = 8; } +enum ScriptKeyType { + /* + The type of script key is not known. This should only be stored for assets + where we don't know the internal key of the script key (e.g. for + imported proofs). + */ + SCRIPT_KEY_UNKNOWN = 0; + + /* + The script key is a normal BIP-86 key. This means that the internal key is + turned into a Taproot output key by applying a BIP-86 tweak to it. + */ + SCRIPT_KEY_BIP86 = 1; + + /* + The script key is a key that contains a script path that is defined by the + user and is therefore external to the tapd wallet. Spending this key + requires providing a specific witness and must be signed through the vPSBT + signing flow. + */ + SCRIPT_KEY_SCRIPT_PATH_EXTERNAL = 2; + + /* + The script key is a specific un-spendable key that indicates a burnt asset. + Assets with this key type can never be spent again, as a burn key is a + tweaked NUMS key that nobody knows the private key for. + */ + SCRIPT_KEY_BURN = 3; + + /* + The script key is a specific un-spendable key that indicates a tombstone + output. This is only the case for zero-value assets that result from a + non-interactive (TAP address) send where no change was left over. + */ + SCRIPT_KEY_TOMBSTONE = 4; + + /* + The script key is used for an asset that resides within a Taproot Asset + Channel. That means the script key is either a funding key (OP_TRUE), a + commitment output key (to_local, to_remote, htlc), or a HTLC second-level + transaction output key. Keys related to channels are not shown in asset + balances (unless specifically requested) and are never used for coin + selection. + */ + SCRIPT_KEY_CHANNEL = 5; +} + +message ScriptKeyTypeQuery { + oneof type { + // Query for assets of a specific script key type. + ScriptKeyType explicit_type = 1; + + // Query for assets with all script key types. + bool all_types = 2; + + // TODO(guggero): Add a bit field that allows querying for multiple + // script key types at once. Need a way to do a WHERE ... IN () type SQL + // query that is compatible with all backends first though. + } +} + message ScriptKey { /* The full Taproot output key the asset is locked to. This is either a BIP-86 @@ -1025,6 +1115,14 @@ message ScriptKey { empty then a BIP-86 style tweak is applied to the internal key. */ bytes tap_tweak = 3; + + /* + The type of the script key. This type is either user-declared when custom + script keys are added, or automatically determined by the daemon for + standard operations (e.g. BIP-86 keys, burn keys, tombstone keys, channel + related keys). + */ + ScriptKeyType type = 4; } message KeyLocator { diff --git a/taprpc/taprootassets.swagger.json b/taprpc/taprootassets.swagger.json index 850138a3f3..835ab6ea66 100644 --- a/taprpc/taprootassets.swagger.json +++ b/taprpc/taprootassets.swagger.json @@ -278,6 +278,22 @@ "type": "string", "format": "byte" }, + { + "name": "script_key.type", + "description": "The type of the script key. This type is either user-declared when custom\nscript keys are added, or automatically determined by the daemon for\nstandard operations (e.g. BIP-86 keys, burn keys, tombstone keys, channel\nrelated keys).\n\n - SCRIPT_KEY_UNKNOWN: The type of script key is not known. This should only be stored for assets\nwhere we don't know the internal key of the script key (e.g. for\nimported proofs).\n - SCRIPT_KEY_BIP86: The script key is a normal BIP-86 key. This means that the internal key is\nturned into a Taproot output key by applying a BIP-86 tweak to it.\n - SCRIPT_KEY_SCRIPT_PATH_EXTERNAL: The script key is a key that contains a script path that is defined by the\nuser and is therefore external to the tapd wallet. Spending this key\nrequires providing a specific witness and must be signed through the vPSBT\nsigning flow.\n - SCRIPT_KEY_BURN: The script key is a specific un-spendable key that indicates a burnt asset.\nAssets with this key type can never be spent again, as a burn key is a\ntweaked NUMS key that nobody knows the private key for.\n - SCRIPT_KEY_TOMBSTONE: The script key is a specific un-spendable key that indicates a tombstone\noutput. This is only the case for zero-value assets that result from a\nnon-interactive (TAP address) send where no change was left over.\n - SCRIPT_KEY_CHANNEL: The script key is used for an asset that resides within a Taproot Asset\nChannel. That means the script key is either a funding key (OP_TRUE), a\ncommitment output key (to_local, to_remote, htlc), or a HTLC second-level\ntransaction output key. Keys related to channels are not shown in asset\nbalances (unless specifically requested) and are never used for coin\nselection.", + "in": "query", + "required": false, + "type": "string", + "enum": [ + "SCRIPT_KEY_UNKNOWN", + "SCRIPT_KEY_BIP86", + "SCRIPT_KEY_SCRIPT_PATH_EXTERNAL", + "SCRIPT_KEY_BURN", + "SCRIPT_KEY_TOMBSTONE", + "SCRIPT_KEY_CHANNEL" + ], + "default": "SCRIPT_KEY_UNKNOWN" + }, { "name": "anchor_outpoint.txid", "description": "Raw bytes representing the transaction id.", @@ -293,6 +309,29 @@ "required": false, "type": "integer", "format": "int64" + }, + { + "name": "script_key_type.explicit_type", + "description": "Query for assets of a specific script key type.\n\n - SCRIPT_KEY_UNKNOWN: The type of script key is not known. This should only be stored for assets\nwhere we don't know the internal key of the script key (e.g. for\nimported proofs).\n - SCRIPT_KEY_BIP86: The script key is a normal BIP-86 key. This means that the internal key is\nturned into a Taproot output key by applying a BIP-86 tweak to it.\n - SCRIPT_KEY_SCRIPT_PATH_EXTERNAL: The script key is a key that contains a script path that is defined by the\nuser and is therefore external to the tapd wallet. Spending this key\nrequires providing a specific witness and must be signed through the vPSBT\nsigning flow.\n - SCRIPT_KEY_BURN: The script key is a specific un-spendable key that indicates a burnt asset.\nAssets with this key type can never be spent again, as a burn key is a\ntweaked NUMS key that nobody knows the private key for.\n - SCRIPT_KEY_TOMBSTONE: The script key is a specific un-spendable key that indicates a tombstone\noutput. This is only the case for zero-value assets that result from a\nnon-interactive (TAP address) send where no change was left over.\n - SCRIPT_KEY_CHANNEL: The script key is used for an asset that resides within a Taproot Asset\nChannel. That means the script key is either a funding key (OP_TRUE), a\ncommitment output key (to_local, to_remote, htlc), or a HTLC second-level\ntransaction output key. Keys related to channels are not shown in asset\nbalances (unless specifically requested) and are never used for coin\nselection.", + "in": "query", + "required": false, + "type": "string", + "enum": [ + "SCRIPT_KEY_UNKNOWN", + "SCRIPT_KEY_BIP86", + "SCRIPT_KEY_SCRIPT_PATH_EXTERNAL", + "SCRIPT_KEY_BURN", + "SCRIPT_KEY_TOMBSTONE", + "SCRIPT_KEY_CHANNEL" + ], + "default": "SCRIPT_KEY_UNKNOWN" + }, + { + "name": "script_key_type.all_types", + "description": "Query for assets with all script key types.", + "in": "query", + "required": false, + "type": "boolean" } ], "tags": [ @@ -355,6 +394,29 @@ "in": "query", "required": false, "type": "boolean" + }, + { + "name": "script_key_type.explicit_type", + "description": "Query for assets of a specific script key type.\n\n - SCRIPT_KEY_UNKNOWN: The type of script key is not known. This should only be stored for assets\nwhere we don't know the internal key of the script key (e.g. for\nimported proofs).\n - SCRIPT_KEY_BIP86: The script key is a normal BIP-86 key. This means that the internal key is\nturned into a Taproot output key by applying a BIP-86 tweak to it.\n - SCRIPT_KEY_SCRIPT_PATH_EXTERNAL: The script key is a key that contains a script path that is defined by the\nuser and is therefore external to the tapd wallet. Spending this key\nrequires providing a specific witness and must be signed through the vPSBT\nsigning flow.\n - SCRIPT_KEY_BURN: The script key is a specific un-spendable key that indicates a burnt asset.\nAssets with this key type can never be spent again, as a burn key is a\ntweaked NUMS key that nobody knows the private key for.\n - SCRIPT_KEY_TOMBSTONE: The script key is a specific un-spendable key that indicates a tombstone\noutput. This is only the case for zero-value assets that result from a\nnon-interactive (TAP address) send where no change was left over.\n - SCRIPT_KEY_CHANNEL: The script key is used for an asset that resides within a Taproot Asset\nChannel. That means the script key is either a funding key (OP_TRUE), a\ncommitment output key (to_local, to_remote, htlc), or a HTLC second-level\ntransaction output key. Keys related to channels are not shown in asset\nbalances (unless specifically requested) and are never used for coin\nselection.", + "in": "query", + "required": false, + "type": "string", + "enum": [ + "SCRIPT_KEY_UNKNOWN", + "SCRIPT_KEY_BIP86", + "SCRIPT_KEY_SCRIPT_PATH_EXTERNAL", + "SCRIPT_KEY_BURN", + "SCRIPT_KEY_TOMBSTONE", + "SCRIPT_KEY_CHANNEL" + ], + "default": "SCRIPT_KEY_UNKNOWN" + }, + { + "name": "script_key_type.all_types", + "description": "Query for assets with all script key types.", + "in": "query", + "required": false, + "type": "boolean" } ], "tags": [ @@ -616,6 +678,29 @@ "in": "query", "required": false, "type": "boolean" + }, + { + "name": "script_key_type.explicit_type", + "description": "Query for assets of a specific script key type.\n\n - SCRIPT_KEY_UNKNOWN: The type of script key is not known. This should only be stored for assets\nwhere we don't know the internal key of the script key (e.g. for\nimported proofs).\n - SCRIPT_KEY_BIP86: The script key is a normal BIP-86 key. This means that the internal key is\nturned into a Taproot output key by applying a BIP-86 tweak to it.\n - SCRIPT_KEY_SCRIPT_PATH_EXTERNAL: The script key is a key that contains a script path that is defined by the\nuser and is therefore external to the tapd wallet. Spending this key\nrequires providing a specific witness and must be signed through the vPSBT\nsigning flow.\n - SCRIPT_KEY_BURN: The script key is a specific un-spendable key that indicates a burnt asset.\nAssets with this key type can never be spent again, as a burn key is a\ntweaked NUMS key that nobody knows the private key for.\n - SCRIPT_KEY_TOMBSTONE: The script key is a specific un-spendable key that indicates a tombstone\noutput. This is only the case for zero-value assets that result from a\nnon-interactive (TAP address) send where no change was left over.\n - SCRIPT_KEY_CHANNEL: The script key is used for an asset that resides within a Taproot Asset\nChannel. That means the script key is either a funding key (OP_TRUE), a\ncommitment output key (to_local, to_remote, htlc), or a HTLC second-level\ntransaction output key. Keys related to channels are not shown in asset\nbalances (unless specifically requested) and are never used for coin\nselection.", + "in": "query", + "required": false, + "type": "string", + "enum": [ + "SCRIPT_KEY_UNKNOWN", + "SCRIPT_KEY_BIP86", + "SCRIPT_KEY_SCRIPT_PATH_EXTERNAL", + "SCRIPT_KEY_BURN", + "SCRIPT_KEY_TOMBSTONE", + "SCRIPT_KEY_CHANNEL" + ], + "default": "SCRIPT_KEY_UNKNOWN" + }, + { + "name": "script_key_type.all_types", + "description": "Query for assets with all script key types.", + "in": "query", + "required": false, + "type": "boolean" } ], "tags": [ @@ -1376,15 +1461,19 @@ }, "script_key_declared_known": { "type": "boolean", - "description": "Indicates whether this script key has either been derived by the local\nwallet or was explicitly declared to be known by using the\nDeclareScriptKey RPC. Knowing the key conceptually means the key belongs\nto the local wallet or is at least known by a software that operates on\nthe local wallet. The flag is never serialized in proofs, so this is\nnever explicitly set for keys foreign to the local wallet. Therefore, if\nthis method returns true for a script key, it means the asset with the\nscript key will be shown in the wallet balance." + "description": "Deprecated, use script_key_type instead!\nIndicates whether this script key has either been derived by the local\nwallet or was explicitly declared to be known by using the\nDeclareScriptKey RPC. Knowing the key conceptually means the key belongs\nto the local wallet or is at least known by a software that operates on\nthe local wallet. The flag is never serialized in proofs, so this is\nnever explicitly set for keys foreign to the local wallet. Therefore, if\nthis method returns true for a script key, it means the asset with the\nscript key will be shown in the wallet balance." }, "script_key_has_script_path": { "type": "boolean", - "description": "Indicates whether the script key is known to have a Tapscript spend path,\nmeaning that the Taproot merkle root tweak is not empty. This will only\never be true if either script_key_is_local or script_key_internals_known\nis true as well, since the presence of a Tapscript spend path cannot be\ndetermined for script keys that aren't known to the wallet of the local\ntapd node." + "description": "Deprecated, use script_key_type instead!\nIndicates whether the script key is known to have a Tapscript spend path,\nmeaning that the Taproot merkle root tweak is not empty. This will only\never be true if either script_key_is_local or script_key_internals_known\nis true as well, since the presence of a Tapscript spend path cannot be\ndetermined for script keys that aren't known to the wallet of the local\ntapd node." }, "decimal_display": { "$ref": "#/definitions/taprpcDecimalDisplay", "description": "This field defines a decimal display value that may be present. If this\nfield is null, it means the presence of a decimal display field is\nunknown in the current context." + }, + "script_key_type": { + "$ref": "#/definitions/taprpcScriptKeyType", + "description": "The type of the script key. This type is either user-declared when custom\nscript keys are added, or automatically determined by the daemon for\nstandard operations (e.g. BIP-86 keys, burn keys, tombstone keys, channel\nrelated keys)." } } }, @@ -2313,6 +2402,36 @@ "type": "string", "format": "byte", "description": "The optional Taproot tweak to apply to the above internal key. If this is\nempty then a BIP-86 style tweak is applied to the internal key." + }, + "type": { + "$ref": "#/definitions/taprpcScriptKeyType", + "description": "The type of the script key. This type is either user-declared when custom\nscript keys are added, or automatically determined by the daemon for\nstandard operations (e.g. BIP-86 keys, burn keys, tombstone keys, channel\nrelated keys)." + } + } + }, + "taprpcScriptKeyType": { + "type": "string", + "enum": [ + "SCRIPT_KEY_UNKNOWN", + "SCRIPT_KEY_BIP86", + "SCRIPT_KEY_SCRIPT_PATH_EXTERNAL", + "SCRIPT_KEY_BURN", + "SCRIPT_KEY_TOMBSTONE", + "SCRIPT_KEY_CHANNEL" + ], + "default": "SCRIPT_KEY_UNKNOWN", + "description": " - SCRIPT_KEY_UNKNOWN: The type of script key is not known. This should only be stored for assets\nwhere we don't know the internal key of the script key (e.g. for\nimported proofs).\n - SCRIPT_KEY_BIP86: The script key is a normal BIP-86 key. This means that the internal key is\nturned into a Taproot output key by applying a BIP-86 tweak to it.\n - SCRIPT_KEY_SCRIPT_PATH_EXTERNAL: The script key is a key that contains a script path that is defined by the\nuser and is therefore external to the tapd wallet. Spending this key\nrequires providing a specific witness and must be signed through the vPSBT\nsigning flow.\n - SCRIPT_KEY_BURN: The script key is a specific un-spendable key that indicates a burnt asset.\nAssets with this key type can never be spent again, as a burn key is a\ntweaked NUMS key that nobody knows the private key for.\n - SCRIPT_KEY_TOMBSTONE: The script key is a specific un-spendable key that indicates a tombstone\noutput. This is only the case for zero-value assets that result from a\nnon-interactive (TAP address) send where no change was left over.\n - SCRIPT_KEY_CHANNEL: The script key is used for an asset that resides within a Taproot Asset\nChannel. That means the script key is either a funding key (OP_TRUE), a\ncommitment output key (to_local, to_remote, htlc), or a HTLC second-level\ntransaction output key. Keys related to channels are not shown in asset\nbalances (unless specifically requested) and are never used for coin\nselection." + }, + "taprpcScriptKeyTypeQuery": { + "type": "object", + "properties": { + "explicit_type": { + "$ref": "#/definitions/taprpcScriptKeyType", + "description": "Query for assets of a specific script key type." + }, + "all_types": { + "type": "boolean", + "description": "Query for assets with all script key types." } } }, diff --git a/taprpc/universerpc/universe.pb.go b/taprpc/universerpc/universe.pb.go index 27ce78663e..333da8a85e 100644 --- a/taprpc/universerpc/universe.pb.go +++ b/taprpc/universerpc/universe.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.33.0 +// protoc-gen-go v1.34.2 // protoc v3.21.12 // source: universerpc/universe.proto @@ -3837,7 +3837,7 @@ func file_universerpc_universe_proto_rawDescGZIP() []byte { var file_universerpc_universe_proto_enumTypes = make([]protoimpl.EnumInfo, 5) var file_universerpc_universe_proto_msgTypes = make([]protoimpl.MessageInfo, 52) -var file_universerpc_universe_proto_goTypes = []interface{}{ +var file_universerpc_universe_proto_goTypes = []any{ (ProofType)(0), // 0: universerpc.ProofType (UniverseSyncMode)(0), // 1: universerpc.UniverseSyncMode (AssetQuerySort)(0), // 2: universerpc.AssetQuerySort @@ -4006,7 +4006,7 @@ func file_universerpc_universe_proto_init() { return } if !protoimpl.UnsafeEnabled { - file_universerpc_universe_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + file_universerpc_universe_proto_msgTypes[0].Exporter = func(v any, i int) any { switch v := v.(*MultiverseRootRequest); i { case 0: return &v.state @@ -4018,7 +4018,7 @@ func file_universerpc_universe_proto_init() { return nil } } - file_universerpc_universe_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + file_universerpc_universe_proto_msgTypes[1].Exporter = func(v any, i int) any { switch v := v.(*MultiverseRootResponse); i { case 0: return &v.state @@ -4030,7 +4030,7 @@ func file_universerpc_universe_proto_init() { return nil } } - file_universerpc_universe_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + file_universerpc_universe_proto_msgTypes[2].Exporter = func(v any, i int) any { switch v := v.(*AssetRootRequest); i { case 0: return &v.state @@ -4042,7 +4042,7 @@ func file_universerpc_universe_proto_init() { return nil } } - file_universerpc_universe_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + file_universerpc_universe_proto_msgTypes[3].Exporter = func(v any, i int) any { switch v := v.(*MerkleSumNode); i { case 0: return &v.state @@ -4054,7 +4054,7 @@ func file_universerpc_universe_proto_init() { return nil } } - file_universerpc_universe_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + file_universerpc_universe_proto_msgTypes[4].Exporter = func(v any, i int) any { switch v := v.(*ID); i { case 0: return &v.state @@ -4066,7 +4066,7 @@ func file_universerpc_universe_proto_init() { return nil } } - file_universerpc_universe_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + file_universerpc_universe_proto_msgTypes[5].Exporter = func(v any, i int) any { switch v := v.(*UniverseRoot); i { case 0: return &v.state @@ -4078,7 +4078,7 @@ func file_universerpc_universe_proto_init() { return nil } } - file_universerpc_universe_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { + file_universerpc_universe_proto_msgTypes[6].Exporter = func(v any, i int) any { switch v := v.(*AssetRootResponse); i { case 0: return &v.state @@ -4090,7 +4090,7 @@ func file_universerpc_universe_proto_init() { return nil } } - file_universerpc_universe_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { + file_universerpc_universe_proto_msgTypes[7].Exporter = func(v any, i int) any { switch v := v.(*AssetRootQuery); i { case 0: return &v.state @@ -4102,7 +4102,7 @@ func file_universerpc_universe_proto_init() { return nil } } - file_universerpc_universe_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { + file_universerpc_universe_proto_msgTypes[8].Exporter = func(v any, i int) any { switch v := v.(*QueryRootResponse); i { case 0: return &v.state @@ -4114,7 +4114,7 @@ func file_universerpc_universe_proto_init() { return nil } } - file_universerpc_universe_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { + file_universerpc_universe_proto_msgTypes[9].Exporter = func(v any, i int) any { switch v := v.(*DeleteRootQuery); i { case 0: return &v.state @@ -4126,7 +4126,7 @@ func file_universerpc_universe_proto_init() { return nil } } - file_universerpc_universe_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { + file_universerpc_universe_proto_msgTypes[10].Exporter = func(v any, i int) any { switch v := v.(*DeleteRootResponse); i { case 0: return &v.state @@ -4138,7 +4138,7 @@ func file_universerpc_universe_proto_init() { return nil } } - file_universerpc_universe_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { + file_universerpc_universe_proto_msgTypes[11].Exporter = func(v any, i int) any { switch v := v.(*Outpoint); i { case 0: return &v.state @@ -4150,7 +4150,7 @@ func file_universerpc_universe_proto_init() { return nil } } - file_universerpc_universe_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { + file_universerpc_universe_proto_msgTypes[12].Exporter = func(v any, i int) any { switch v := v.(*AssetKey); i { case 0: return &v.state @@ -4162,7 +4162,7 @@ func file_universerpc_universe_proto_init() { return nil } } - file_universerpc_universe_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { + file_universerpc_universe_proto_msgTypes[13].Exporter = func(v any, i int) any { switch v := v.(*AssetLeafKeysRequest); i { case 0: return &v.state @@ -4174,7 +4174,7 @@ func file_universerpc_universe_proto_init() { return nil } } - file_universerpc_universe_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { + file_universerpc_universe_proto_msgTypes[14].Exporter = func(v any, i int) any { switch v := v.(*AssetLeafKeyResponse); i { case 0: return &v.state @@ -4186,7 +4186,7 @@ func file_universerpc_universe_proto_init() { return nil } } - file_universerpc_universe_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { + file_universerpc_universe_proto_msgTypes[15].Exporter = func(v any, i int) any { switch v := v.(*AssetLeaf); i { case 0: return &v.state @@ -4198,7 +4198,7 @@ func file_universerpc_universe_proto_init() { return nil } } - file_universerpc_universe_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { + file_universerpc_universe_proto_msgTypes[16].Exporter = func(v any, i int) any { switch v := v.(*AssetLeafResponse); i { case 0: return &v.state @@ -4210,7 +4210,7 @@ func file_universerpc_universe_proto_init() { return nil } } - file_universerpc_universe_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { + file_universerpc_universe_proto_msgTypes[17].Exporter = func(v any, i int) any { switch v := v.(*UniverseKey); i { case 0: return &v.state @@ -4222,7 +4222,7 @@ func file_universerpc_universe_proto_init() { return nil } } - file_universerpc_universe_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { + file_universerpc_universe_proto_msgTypes[18].Exporter = func(v any, i int) any { switch v := v.(*AssetProofResponse); i { case 0: return &v.state @@ -4234,7 +4234,7 @@ func file_universerpc_universe_proto_init() { return nil } } - file_universerpc_universe_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { + file_universerpc_universe_proto_msgTypes[19].Exporter = func(v any, i int) any { switch v := v.(*AssetProof); i { case 0: return &v.state @@ -4246,7 +4246,7 @@ func file_universerpc_universe_proto_init() { return nil } } - file_universerpc_universe_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { + file_universerpc_universe_proto_msgTypes[20].Exporter = func(v any, i int) any { switch v := v.(*PushProofRequest); i { case 0: return &v.state @@ -4258,7 +4258,7 @@ func file_universerpc_universe_proto_init() { return nil } } - file_universerpc_universe_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { + file_universerpc_universe_proto_msgTypes[21].Exporter = func(v any, i int) any { switch v := v.(*PushProofResponse); i { case 0: return &v.state @@ -4270,7 +4270,7 @@ func file_universerpc_universe_proto_init() { return nil } } - file_universerpc_universe_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { + file_universerpc_universe_proto_msgTypes[22].Exporter = func(v any, i int) any { switch v := v.(*InfoRequest); i { case 0: return &v.state @@ -4282,7 +4282,7 @@ func file_universerpc_universe_proto_init() { return nil } } - file_universerpc_universe_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { + file_universerpc_universe_proto_msgTypes[23].Exporter = func(v any, i int) any { switch v := v.(*InfoResponse); i { case 0: return &v.state @@ -4294,7 +4294,7 @@ func file_universerpc_universe_proto_init() { return nil } } - file_universerpc_universe_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { + file_universerpc_universe_proto_msgTypes[24].Exporter = func(v any, i int) any { switch v := v.(*SyncTarget); i { case 0: return &v.state @@ -4306,7 +4306,7 @@ func file_universerpc_universe_proto_init() { return nil } } - file_universerpc_universe_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { + file_universerpc_universe_proto_msgTypes[25].Exporter = func(v any, i int) any { switch v := v.(*SyncRequest); i { case 0: return &v.state @@ -4318,7 +4318,7 @@ func file_universerpc_universe_proto_init() { return nil } } - file_universerpc_universe_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { + file_universerpc_universe_proto_msgTypes[26].Exporter = func(v any, i int) any { switch v := v.(*SyncedUniverse); i { case 0: return &v.state @@ -4330,7 +4330,7 @@ func file_universerpc_universe_proto_init() { return nil } } - file_universerpc_universe_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { + file_universerpc_universe_proto_msgTypes[27].Exporter = func(v any, i int) any { switch v := v.(*StatsRequest); i { case 0: return &v.state @@ -4342,7 +4342,7 @@ func file_universerpc_universe_proto_init() { return nil } } - file_universerpc_universe_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { + file_universerpc_universe_proto_msgTypes[28].Exporter = func(v any, i int) any { switch v := v.(*SyncResponse); i { case 0: return &v.state @@ -4354,7 +4354,7 @@ func file_universerpc_universe_proto_init() { return nil } } - file_universerpc_universe_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} { + file_universerpc_universe_proto_msgTypes[29].Exporter = func(v any, i int) any { switch v := v.(*UniverseFederationServer); i { case 0: return &v.state @@ -4366,7 +4366,7 @@ func file_universerpc_universe_proto_init() { return nil } } - file_universerpc_universe_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} { + file_universerpc_universe_proto_msgTypes[30].Exporter = func(v any, i int) any { switch v := v.(*ListFederationServersRequest); i { case 0: return &v.state @@ -4378,7 +4378,7 @@ func file_universerpc_universe_proto_init() { return nil } } - file_universerpc_universe_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { + file_universerpc_universe_proto_msgTypes[31].Exporter = func(v any, i int) any { switch v := v.(*ListFederationServersResponse); i { case 0: return &v.state @@ -4390,7 +4390,7 @@ func file_universerpc_universe_proto_init() { return nil } } - file_universerpc_universe_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} { + file_universerpc_universe_proto_msgTypes[32].Exporter = func(v any, i int) any { switch v := v.(*AddFederationServerRequest); i { case 0: return &v.state @@ -4402,7 +4402,7 @@ func file_universerpc_universe_proto_init() { return nil } } - file_universerpc_universe_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} { + file_universerpc_universe_proto_msgTypes[33].Exporter = func(v any, i int) any { switch v := v.(*AddFederationServerResponse); i { case 0: return &v.state @@ -4414,7 +4414,7 @@ func file_universerpc_universe_proto_init() { return nil } } - file_universerpc_universe_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} { + file_universerpc_universe_proto_msgTypes[34].Exporter = func(v any, i int) any { switch v := v.(*DeleteFederationServerRequest); i { case 0: return &v.state @@ -4426,7 +4426,7 @@ func file_universerpc_universe_proto_init() { return nil } } - file_universerpc_universe_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} { + file_universerpc_universe_proto_msgTypes[35].Exporter = func(v any, i int) any { switch v := v.(*DeleteFederationServerResponse); i { case 0: return &v.state @@ -4438,7 +4438,7 @@ func file_universerpc_universe_proto_init() { return nil } } - file_universerpc_universe_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} { + file_universerpc_universe_proto_msgTypes[36].Exporter = func(v any, i int) any { switch v := v.(*StatsResponse); i { case 0: return &v.state @@ -4450,7 +4450,7 @@ func file_universerpc_universe_proto_init() { return nil } } - file_universerpc_universe_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} { + file_universerpc_universe_proto_msgTypes[37].Exporter = func(v any, i int) any { switch v := v.(*AssetStatsQuery); i { case 0: return &v.state @@ -4462,7 +4462,7 @@ func file_universerpc_universe_proto_init() { return nil } } - file_universerpc_universe_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} { + file_universerpc_universe_proto_msgTypes[38].Exporter = func(v any, i int) any { switch v := v.(*AssetStatsSnapshot); i { case 0: return &v.state @@ -4474,7 +4474,7 @@ func file_universerpc_universe_proto_init() { return nil } } - file_universerpc_universe_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} { + file_universerpc_universe_proto_msgTypes[39].Exporter = func(v any, i int) any { switch v := v.(*AssetStatsAsset); i { case 0: return &v.state @@ -4486,7 +4486,7 @@ func file_universerpc_universe_proto_init() { return nil } } - file_universerpc_universe_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} { + file_universerpc_universe_proto_msgTypes[40].Exporter = func(v any, i int) any { switch v := v.(*UniverseAssetStats); i { case 0: return &v.state @@ -4498,7 +4498,7 @@ func file_universerpc_universe_proto_init() { return nil } } - file_universerpc_universe_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} { + file_universerpc_universe_proto_msgTypes[41].Exporter = func(v any, i int) any { switch v := v.(*QueryEventsRequest); i { case 0: return &v.state @@ -4510,7 +4510,7 @@ func file_universerpc_universe_proto_init() { return nil } } - file_universerpc_universe_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} { + file_universerpc_universe_proto_msgTypes[42].Exporter = func(v any, i int) any { switch v := v.(*QueryEventsResponse); i { case 0: return &v.state @@ -4522,7 +4522,7 @@ func file_universerpc_universe_proto_init() { return nil } } - file_universerpc_universe_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} { + file_universerpc_universe_proto_msgTypes[43].Exporter = func(v any, i int) any { switch v := v.(*GroupedUniverseEvents); i { case 0: return &v.state @@ -4534,7 +4534,7 @@ func file_universerpc_universe_proto_init() { return nil } } - file_universerpc_universe_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} { + file_universerpc_universe_proto_msgTypes[44].Exporter = func(v any, i int) any { switch v := v.(*SetFederationSyncConfigRequest); i { case 0: return &v.state @@ -4546,7 +4546,7 @@ func file_universerpc_universe_proto_init() { return nil } } - file_universerpc_universe_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} { + file_universerpc_universe_proto_msgTypes[45].Exporter = func(v any, i int) any { switch v := v.(*SetFederationSyncConfigResponse); i { case 0: return &v.state @@ -4558,7 +4558,7 @@ func file_universerpc_universe_proto_init() { return nil } } - file_universerpc_universe_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} { + file_universerpc_universe_proto_msgTypes[46].Exporter = func(v any, i int) any { switch v := v.(*GlobalFederationSyncConfig); i { case 0: return &v.state @@ -4570,7 +4570,7 @@ func file_universerpc_universe_proto_init() { return nil } } - file_universerpc_universe_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} { + file_universerpc_universe_proto_msgTypes[47].Exporter = func(v any, i int) any { switch v := v.(*AssetFederationSyncConfig); i { case 0: return &v.state @@ -4582,7 +4582,7 @@ func file_universerpc_universe_proto_init() { return nil } } - file_universerpc_universe_proto_msgTypes[48].Exporter = func(v interface{}, i int) interface{} { + file_universerpc_universe_proto_msgTypes[48].Exporter = func(v any, i int) any { switch v := v.(*QueryFederationSyncConfigRequest); i { case 0: return &v.state @@ -4594,7 +4594,7 @@ func file_universerpc_universe_proto_init() { return nil } } - file_universerpc_universe_proto_msgTypes[49].Exporter = func(v interface{}, i int) interface{} { + file_universerpc_universe_proto_msgTypes[49].Exporter = func(v any, i int) any { switch v := v.(*QueryFederationSyncConfigResponse); i { case 0: return &v.state @@ -4607,13 +4607,13 @@ func file_universerpc_universe_proto_init() { } } } - file_universerpc_universe_proto_msgTypes[4].OneofWrappers = []interface{}{ + file_universerpc_universe_proto_msgTypes[4].OneofWrappers = []any{ (*ID_AssetId)(nil), (*ID_AssetIdStr)(nil), (*ID_GroupKey)(nil), (*ID_GroupKeyStr)(nil), } - file_universerpc_universe_proto_msgTypes[12].OneofWrappers = []interface{}{ + file_universerpc_universe_proto_msgTypes[12].OneofWrappers = []any{ (*AssetKey_OpStr)(nil), (*AssetKey_Op)(nil), (*AssetKey_ScriptKeyBytes)(nil), diff --git a/taprpc/universerpc/universe.pb.gw.go b/taprpc/universerpc/universe.pb.gw.go index 91fe7c2aaf..cd8d372135 100644 --- a/taprpc/universerpc/universe.pb.gw.go +++ b/taprpc/universerpc/universe.pb.gw.go @@ -35,11 +35,7 @@ func request_Universe_MultiverseRoot_0(ctx context.Context, marshaler runtime.Ma var protoReq MultiverseRootRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -52,11 +48,7 @@ func local_request_Universe_MultiverseRoot_0(ctx context.Context, marshaler runt var protoReq MultiverseRootRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -102,7 +94,7 @@ func local_request_Universe_AssetRoots_0(ctx context.Context, marshaler runtime. } var ( - filter_Universe_QueryAssetRoots_0 = &utilities.DoubleArray{Encoding: map[string]int{"id": 0, "asset_id_str": 1, "assetIdStr": 2}, Base: []int{1, 1, 1, 2, 0, 0}, Check: []int{0, 1, 2, 1, 3, 4}} + filter_Universe_QueryAssetRoots_0 = &utilities.DoubleArray{Encoding: map[string]int{"id": 0, "asset_id_str": 1}, Base: []int{1, 1, 1, 0}, Check: []int{0, 1, 2, 3}} ) func request_Universe_QueryAssetRoots_0(ctx context.Context, marshaler runtime.Marshaler, client UniverseClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { @@ -172,7 +164,7 @@ func local_request_Universe_QueryAssetRoots_0(ctx context.Context, marshaler run } var ( - filter_Universe_QueryAssetRoots_1 = &utilities.DoubleArray{Encoding: map[string]int{"id": 0, "group_key_str": 1, "groupKeyStr": 2}, Base: []int{1, 1, 1, 2, 0, 0}, Check: []int{0, 1, 2, 1, 3, 4}} + filter_Universe_QueryAssetRoots_1 = &utilities.DoubleArray{Encoding: map[string]int{"id": 0, "group_key_str": 1}, Base: []int{1, 1, 1, 0}, Check: []int{0, 1, 2, 3}} ) func request_Universe_QueryAssetRoots_1(ctx context.Context, marshaler runtime.Marshaler, client UniverseClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { @@ -278,7 +270,7 @@ func local_request_Universe_DeleteAssetRoot_0(ctx context.Context, marshaler run } var ( - filter_Universe_AssetLeafKeys_0 = &utilities.DoubleArray{Encoding: map[string]int{"id": 0, "asset_id_str": 1, "assetIdStr": 2}, Base: []int{1, 1, 1, 2, 0, 0}, Check: []int{0, 1, 2, 1, 3, 4}} + filter_Universe_AssetLeafKeys_0 = &utilities.DoubleArray{Encoding: map[string]int{"id": 0, "asset_id_str": 1}, Base: []int{1, 1, 1, 0}, Check: []int{0, 1, 2, 3}} ) func request_Universe_AssetLeafKeys_0(ctx context.Context, marshaler runtime.Marshaler, client UniverseClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { @@ -348,7 +340,7 @@ func local_request_Universe_AssetLeafKeys_0(ctx context.Context, marshaler runti } var ( - filter_Universe_AssetLeafKeys_1 = &utilities.DoubleArray{Encoding: map[string]int{"id": 0, "group_key_str": 1, "groupKeyStr": 2}, Base: []int{1, 1, 1, 2, 0, 0}, Check: []int{0, 1, 2, 1, 3, 4}} + filter_Universe_AssetLeafKeys_1 = &utilities.DoubleArray{Encoding: map[string]int{"id": 0, "group_key_str": 1}, Base: []int{1, 1, 1, 0}, Check: []int{0, 1, 2, 3}} ) func request_Universe_AssetLeafKeys_1(ctx context.Context, marshaler runtime.Marshaler, client UniverseClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { @@ -418,7 +410,7 @@ func local_request_Universe_AssetLeafKeys_1(ctx context.Context, marshaler runti } var ( - filter_Universe_AssetLeaves_0 = &utilities.DoubleArray{Encoding: map[string]int{"asset_id_str": 0, "assetIdStr": 1}, Base: []int{1, 1, 2, 0, 0}, Check: []int{0, 1, 1, 2, 3}} + filter_Universe_AssetLeaves_0 = &utilities.DoubleArray{Encoding: map[string]int{"asset_id_str": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} ) func request_Universe_AssetLeaves_0(ctx context.Context, marshaler runtime.Marshaler, client UniverseClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { @@ -498,7 +490,7 @@ func local_request_Universe_AssetLeaves_0(ctx context.Context, marshaler runtime } var ( - filter_Universe_AssetLeaves_1 = &utilities.DoubleArray{Encoding: map[string]int{"group_key_str": 0, "groupKeyStr": 1}, Base: []int{1, 1, 2, 0, 0}, Check: []int{0, 1, 1, 2, 3}} + filter_Universe_AssetLeaves_1 = &utilities.DoubleArray{Encoding: map[string]int{"group_key_str": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} ) func request_Universe_AssetLeaves_1(ctx context.Context, marshaler runtime.Marshaler, client UniverseClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { @@ -578,7 +570,7 @@ func local_request_Universe_AssetLeaves_1(ctx context.Context, marshaler runtime } var ( - filter_Universe_QueryProof_0 = &utilities.DoubleArray{Encoding: map[string]int{"id": 0, "asset_id_str": 1, "assetIdStr": 2, "leaf_key": 3, "op": 4, "hash_str": 5, "hashStr": 6, "index": 7, "script_key_str": 8, "scriptKeyStr": 9}, Base: []int{1, 1, 1, 2, 8, 1, 3, 8, 9, 7, 10, 0, 0, 0, 5, 0, 7, 0, 0, 0, 0}, Check: []int{0, 1, 2, 1, 1, 5, 6, 1, 1, 5, 1, 3, 4, 7, 10, 15, 5, 17, 8, 9, 11}} + filter_Universe_QueryProof_0 = &utilities.DoubleArray{Encoding: map[string]int{"id": 0, "asset_id_str": 1, "leaf_key": 2, "op": 3, "hash_str": 4, "index": 5, "script_key_str": 6}, Base: []int{1, 1, 1, 5, 1, 2, 2, 3, 0, 0, 0, 5, 0}, Check: []int{0, 1, 2, 1, 4, 5, 4, 7, 3, 6, 8, 4, 12}} ) func request_Universe_QueryProof_0(ctx context.Context, marshaler runtime.Marshaler, client UniverseClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { @@ -708,7 +700,7 @@ func local_request_Universe_QueryProof_0(ctx context.Context, marshaler runtime. } var ( - filter_Universe_QueryProof_1 = &utilities.DoubleArray{Encoding: map[string]int{"id": 0, "group_key_str": 1, "groupKeyStr": 2, "leaf_key": 3, "op": 4, "hash_str": 5, "hashStr": 6, "index": 7, "script_key_str": 8, "scriptKeyStr": 9}, Base: []int{1, 1, 1, 2, 8, 1, 3, 8, 9, 7, 10, 0, 0, 0, 5, 0, 7, 0, 0, 0, 0}, Check: []int{0, 1, 2, 1, 1, 5, 6, 1, 1, 5, 1, 3, 4, 7, 10, 15, 5, 17, 8, 9, 11}} + filter_Universe_QueryProof_1 = &utilities.DoubleArray{Encoding: map[string]int{"id": 0, "group_key_str": 1, "leaf_key": 2, "op": 3, "hash_str": 4, "index": 5, "script_key_str": 6}, Base: []int{1, 1, 1, 5, 1, 2, 2, 3, 0, 0, 0, 5, 0}, Check: []int{0, 1, 2, 1, 4, 5, 4, 7, 3, 6, 8, 4, 12}} ) func request_Universe_QueryProof_1(ctx context.Context, marshaler runtime.Marshaler, client UniverseClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { @@ -841,11 +833,7 @@ func request_Universe_InsertProof_0(ctx context.Context, marshaler runtime.Marsh var protoReq AssetProof var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -905,11 +893,7 @@ func local_request_Universe_InsertProof_0(ctx context.Context, marshaler runtime var protoReq AssetProof var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -969,11 +953,7 @@ func request_Universe_InsertProof_1(ctx context.Context, marshaler runtime.Marsh var protoReq AssetProof var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -1033,11 +1013,7 @@ func local_request_Universe_InsertProof_1(ctx context.Context, marshaler runtime var protoReq AssetProof var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -1097,11 +1073,7 @@ func request_Universe_PushProof_0(ctx context.Context, marshaler runtime.Marshal var protoReq PushProofRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -1161,11 +1133,7 @@ func local_request_Universe_PushProof_0(ctx context.Context, marshaler runtime.M var protoReq PushProofRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -1225,11 +1193,7 @@ func request_Universe_PushProof_1(ctx context.Context, marshaler runtime.Marshal var protoReq PushProofRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -1289,11 +1253,7 @@ func local_request_Universe_PushProof_1(ctx context.Context, marshaler runtime.M var protoReq PushProofRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -1371,11 +1331,7 @@ func request_Universe_SyncUniverse_0(ctx context.Context, marshaler runtime.Mars var protoReq SyncRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -1388,11 +1344,7 @@ func local_request_Universe_SyncUniverse_0(ctx context.Context, marshaler runtim var protoReq SyncRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -1423,11 +1375,7 @@ func request_Universe_AddFederationServer_0(ctx context.Context, marshaler runti var protoReq AddFederationServerRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -1440,11 +1388,7 @@ func local_request_Universe_AddFederationServer_0(ctx context.Context, marshaler var protoReq AddFederationServerRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -1583,11 +1527,7 @@ func request_Universe_SetFederationSyncConfig_0(ctx context.Context, marshaler r var protoReq SetFederationSyncConfigRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -1600,11 +1540,7 @@ func local_request_Universe_SetFederationSyncConfig_0(ctx context.Context, marsh var protoReq SetFederationSyncConfigRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -2286,21 +2222,21 @@ func RegisterUniverseHandlerServer(ctx context.Context, mux *runtime.ServeMux, s // RegisterUniverseHandlerFromEndpoint is same as RegisterUniverseHandler but // automatically dials to "endpoint" and closes the connection when "ctx" gets done. func RegisterUniverseHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) { - conn, err := grpc.DialContext(ctx, endpoint, opts...) + conn, err := grpc.NewClient(endpoint, opts...) if err != nil { return err } defer func() { if err != nil { if cerr := conn.Close(); cerr != nil { - grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr) + grpclog.Errorf("Failed to close conn to %s: %v", endpoint, cerr) } return } go func() { <-ctx.Done() if cerr := conn.Close(); cerr != nil { - grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr) + grpclog.Errorf("Failed to close conn to %s: %v", endpoint, cerr) } }() }() diff --git a/taprpc/universerpc/universe.swagger.json b/taprpc/universerpc/universe.swagger.json index 426569d254..d2f0fcc509 100644 --- a/taprpc/universerpc/universe.swagger.json +++ b/taprpc/universerpc/universe.swagger.json @@ -691,61 +691,7 @@ "in": "body", "required": true, "schema": { - "type": "object", - "properties": { - "key": { - "type": "object", - "properties": { - "id": { - "type": "object", - "properties": { - "asset_id": { - "type": "string", - "format": "byte", - "description": "The 32-byte asset ID specified as raw bytes (gRPC only)." - }, - "group_key": { - "type": "string", - "format": "byte", - "description": "The 32-byte asset group key specified as raw bytes (gRPC only)." - }, - "group_key_str": { - "type": "string", - "description": "The 32-byte asset group key encoded as hex string (use this for\nREST)." - }, - "proof_type": { - "$ref": "#/definitions/universerpcProofType" - } - }, - "description": "The ID of the asset to query for.", - "title": "The ID of the asset to query for." - }, - "leaf_key": { - "type": "object", - "properties": { - "op_str": { - "type": "string" - }, - "op": { - "type": "object" - }, - "script_key_bytes": { - "type": "string", - "format": "byte" - } - }, - "description": "The asset key to query for.", - "title": "The asset key to query for." - } - }, - "description": "The ID of the asset to insert the proof for.", - "title": "The ID of the asset to insert the proof for." - }, - "asset_leaf": { - "$ref": "#/definitions/universerpcAssetLeaf", - "description": "The asset leaf to insert into the Universe tree." - } - } + "$ref": "#/definitions/UniverseInsertProofBody" } } ], @@ -907,61 +853,7 @@ "in": "body", "required": true, "schema": { - "type": "object", - "properties": { - "key": { - "type": "object", - "properties": { - "id": { - "type": "object", - "properties": { - "asset_id": { - "type": "string", - "format": "byte", - "description": "The 32-byte asset ID specified as raw bytes (gRPC only)." - }, - "asset_id_str": { - "type": "string", - "description": "The 32-byte asset ID encoded as a hex string (use this for REST)." - }, - "group_key": { - "type": "string", - "format": "byte", - "description": "The 32-byte asset group key specified as raw bytes (gRPC only)." - }, - "proof_type": { - "$ref": "#/definitions/universerpcProofType" - } - }, - "description": "The ID of the asset to query for.", - "title": "The ID of the asset to query for." - }, - "leaf_key": { - "type": "object", - "properties": { - "op_str": { - "type": "string" - }, - "op": { - "type": "object" - }, - "script_key_bytes": { - "type": "string", - "format": "byte" - } - }, - "description": "The asset key to query for.", - "title": "The asset key to query for." - } - }, - "description": "The ID of the asset to insert the proof for.", - "title": "The ID of the asset to insert the proof for." - }, - "asset_leaf": { - "$ref": "#/definitions/universerpcAssetLeaf", - "description": "The asset leaf to insert into the Universe tree." - } - } + "$ref": "#/definitions/UniverseInsertProofBody" } } ], @@ -1022,61 +914,7 @@ "in": "body", "required": true, "schema": { - "type": "object", - "properties": { - "key": { - "type": "object", - "properties": { - "id": { - "type": "object", - "properties": { - "asset_id": { - "type": "string", - "format": "byte", - "description": "The 32-byte asset ID specified as raw bytes (gRPC only)." - }, - "group_key": { - "type": "string", - "format": "byte", - "description": "The 32-byte asset group key specified as raw bytes (gRPC only)." - }, - "group_key_str": { - "type": "string", - "description": "The 32-byte asset group key encoded as hex string (use this for\nREST)." - }, - "proof_type": { - "$ref": "#/definitions/universerpcProofType" - } - }, - "description": "The ID of the asset to query for.", - "title": "The ID of the asset to query for." - }, - "leaf_key": { - "type": "object", - "properties": { - "op_str": { - "type": "string" - }, - "op": { - "type": "object" - }, - "script_key_bytes": { - "type": "string", - "format": "byte" - } - }, - "description": "The asset key to query for.", - "title": "The asset key to query for." - } - }, - "description": "The ID of the asset to push the proof for.", - "title": "The ID of the asset to push the proof for." - }, - "server": { - "$ref": "#/definitions/universerpcUniverseFederationServer", - "description": "The universe server to push the proof to." - } - } + "$ref": "#/definitions/UniversePushProofBody" } } ], @@ -1137,61 +975,7 @@ "in": "body", "required": true, "schema": { - "type": "object", - "properties": { - "key": { - "type": "object", - "properties": { - "id": { - "type": "object", - "properties": { - "asset_id": { - "type": "string", - "format": "byte", - "description": "The 32-byte asset ID specified as raw bytes (gRPC only)." - }, - "asset_id_str": { - "type": "string", - "description": "The 32-byte asset ID encoded as a hex string (use this for REST)." - }, - "group_key": { - "type": "string", - "format": "byte", - "description": "The 32-byte asset group key specified as raw bytes (gRPC only)." - }, - "proof_type": { - "$ref": "#/definitions/universerpcProofType" - } - }, - "description": "The ID of the asset to query for.", - "title": "The ID of the asset to query for." - }, - "leaf_key": { - "type": "object", - "properties": { - "op_str": { - "type": "string" - }, - "op": { - "type": "object" - }, - "script_key_bytes": { - "type": "string", - "format": "byte" - } - }, - "description": "The asset key to query for.", - "title": "The asset key to query for." - } - }, - "description": "The ID of the asset to push the proof for.", - "title": "The ID of the asset to push the proof for." - }, - "server": { - "$ref": "#/definitions/universerpcUniverseFederationServer", - "description": "The universe server to push the proof to." - } - } + "$ref": "#/definitions/UniversePushProofBody" } } ], @@ -1637,6 +1421,120 @@ } }, "definitions": { + "UniverseInsertProofBody": { + "type": "object", + "properties": { + "key": { + "type": "object", + "properties": { + "id": { + "type": "object", + "properties": { + "asset_id": { + "type": "string", + "format": "byte", + "description": "The 32-byte asset ID specified as raw bytes (gRPC only)." + }, + "asset_id_str": { + "type": "string", + "description": "The 32-byte asset ID encoded as a hex string (use this for REST)." + }, + "group_key": { + "type": "string", + "format": "byte", + "description": "The 32-byte asset group key specified as raw bytes (gRPC only)." + }, + "proof_type": { + "$ref": "#/definitions/universerpcProofType" + } + }, + "description": "The ID of the asset to query for.", + "title": "The ID of the asset to query for." + }, + "leaf_key": { + "type": "object", + "properties": { + "op_str": { + "type": "string" + }, + "op": { + "type": "object" + }, + "script_key_bytes": { + "type": "string", + "format": "byte" + } + }, + "description": "The asset key to query for.", + "title": "The asset key to query for." + } + }, + "description": "The ID of the asset to insert the proof for.", + "title": "The ID of the asset to insert the proof for." + }, + "asset_leaf": { + "$ref": "#/definitions/universerpcAssetLeaf", + "description": "The asset leaf to insert into the Universe tree." + } + } + }, + "UniversePushProofBody": { + "type": "object", + "properties": { + "key": { + "type": "object", + "properties": { + "id": { + "type": "object", + "properties": { + "asset_id": { + "type": "string", + "format": "byte", + "description": "The 32-byte asset ID specified as raw bytes (gRPC only)." + }, + "asset_id_str": { + "type": "string", + "description": "The 32-byte asset ID encoded as a hex string (use this for REST)." + }, + "group_key": { + "type": "string", + "format": "byte", + "description": "The 32-byte asset group key specified as raw bytes (gRPC only)." + }, + "proof_type": { + "$ref": "#/definitions/universerpcProofType" + } + }, + "description": "The ID of the asset to query for.", + "title": "The ID of the asset to query for." + }, + "leaf_key": { + "type": "object", + "properties": { + "op_str": { + "type": "string" + }, + "op": { + "type": "object" + }, + "script_key_bytes": { + "type": "string", + "format": "byte" + } + }, + "description": "The asset key to query for.", + "title": "The asset key to query for." + } + }, + "description": "The ID of the asset to push the proof for.", + "title": "The ID of the asset to push the proof for." + }, + "server": { + "$ref": "#/definitions/universerpcUniverseFederationServer", + "description": "The universe server to push the proof to." + } + } + }, "protobufAny": { "type": "object", "properties": { @@ -1783,15 +1681,19 @@ }, "script_key_declared_known": { "type": "boolean", - "description": "Indicates whether this script key has either been derived by the local\nwallet or was explicitly declared to be known by using the\nDeclareScriptKey RPC. Knowing the key conceptually means the key belongs\nto the local wallet or is at least known by a software that operates on\nthe local wallet. The flag is never serialized in proofs, so this is\nnever explicitly set for keys foreign to the local wallet. Therefore, if\nthis method returns true for a script key, it means the asset with the\nscript key will be shown in the wallet balance." + "description": "Deprecated, use script_key_type instead!\nIndicates whether this script key has either been derived by the local\nwallet or was explicitly declared to be known by using the\nDeclareScriptKey RPC. Knowing the key conceptually means the key belongs\nto the local wallet or is at least known by a software that operates on\nthe local wallet. The flag is never serialized in proofs, so this is\nnever explicitly set for keys foreign to the local wallet. Therefore, if\nthis method returns true for a script key, it means the asset with the\nscript key will be shown in the wallet balance." }, "script_key_has_script_path": { "type": "boolean", - "description": "Indicates whether the script key is known to have a Tapscript spend path,\nmeaning that the Taproot merkle root tweak is not empty. This will only\never be true if either script_key_is_local or script_key_internals_known\nis true as well, since the presence of a Tapscript spend path cannot be\ndetermined for script keys that aren't known to the wallet of the local\ntapd node." + "description": "Deprecated, use script_key_type instead!\nIndicates whether the script key is known to have a Tapscript spend path,\nmeaning that the Taproot merkle root tweak is not empty. This will only\never be true if either script_key_is_local or script_key_internals_known\nis true as well, since the presence of a Tapscript spend path cannot be\ndetermined for script keys that aren't known to the wallet of the local\ntapd node." }, "decimal_display": { "$ref": "#/definitions/taprpcDecimalDisplay", "description": "This field defines a decimal display value that may be present. If this\nfield is null, it means the presence of a decimal display field is\nunknown in the current context." + }, + "script_key_type": { + "$ref": "#/definitions/taprpcScriptKeyType", + "description": "The type of the script key. This type is either user-declared when custom\nscript keys are added, or automatically determined by the daemon for\nstandard operations (e.g. BIP-86 keys, burn keys, tombstone keys, channel\nrelated keys)." } } }, @@ -1918,6 +1820,19 @@ } } }, + "taprpcScriptKeyType": { + "type": "string", + "enum": [ + "SCRIPT_KEY_UNKNOWN", + "SCRIPT_KEY_BIP86", + "SCRIPT_KEY_SCRIPT_PATH_EXTERNAL", + "SCRIPT_KEY_BURN", + "SCRIPT_KEY_TOMBSTONE", + "SCRIPT_KEY_CHANNEL" + ], + "default": "SCRIPT_KEY_UNKNOWN", + "description": " - SCRIPT_KEY_UNKNOWN: The type of script key is not known. This should only be stored for assets\nwhere we don't know the internal key of the script key (e.g. for\nimported proofs).\n - SCRIPT_KEY_BIP86: The script key is a normal BIP-86 key. This means that the internal key is\nturned into a Taproot output key by applying a BIP-86 tweak to it.\n - SCRIPT_KEY_SCRIPT_PATH_EXTERNAL: The script key is a key that contains a script path that is defined by the\nuser and is therefore external to the tapd wallet. Spending this key\nrequires providing a specific witness and must be signed through the vPSBT\nsigning flow.\n - SCRIPT_KEY_BURN: The script key is a specific un-spendable key that indicates a burnt asset.\nAssets with this key type can never be spent again, as a burn key is a\ntweaked NUMS key that nobody knows the private key for.\n - SCRIPT_KEY_TOMBSTONE: The script key is a specific un-spendable key that indicates a tombstone\noutput. This is only the case for zero-value assets that result from a\nnon-interactive (TAP address) send where no change was left over.\n - SCRIPT_KEY_CHANNEL: The script key is used for an asset that resides within a Taproot Asset\nChannel. That means the script key is either a funding key (OP_TRUE), a\ncommitment output key (to_local, to_remote, htlc), or a HTLC second-level\ntransaction output key. Keys related to channels are not shown in asset\nbalances (unless specifically requested) and are never used for coin\nselection." + }, "taprpcSplitCommitment": { "type": "object", "properties": { diff --git a/tapsend/send.go b/tapsend/send.go index bcce1e3623..9a38107684 100644 --- a/tapsend/send.go +++ b/tapsend/send.go @@ -171,28 +171,6 @@ type AssetGroupQuerier interface { QueryAssetGroup(context.Context, asset.ID) (*asset.AssetGroup, error) } -// CoinSelectType is a type that indicates the type of coins that should be -// selected. This type is defined in the tapsend package to avoid a circular -// dependency with the freighter package. -type CoinSelectType uint8 - -const ( - // Bip86Only indicates that only coins that have a BIP-086 script key - // should be selected. - Bip86Only CoinSelectType = 0 - - // ScriptTreesAllowed indicates that coins with any script key type - // should be selected. - ScriptTreesAllowed CoinSelectType = 1 - - // DefaultCoinSelectType is the default coin selection type that should - // be used when no specific type is specified. We default to allowing - // any script key type to be in line with the RPC values, which are - // intended to be backward compatible with clients that didn't specify - // the type (when funding a vPSBT for example). - DefaultCoinSelectType = ScriptTreesAllowed -) - // FundingDescriptor describes the information that is needed to select and // verify input assets in order to send to a specific recipient. It is a subset // of the information contained in a Taproot Asset address. @@ -206,14 +184,15 @@ type FundingDescriptor struct { // PrevIDs is the set of inputs that can be used to fund the transfer. PrevIDs []asset.PrevID - // CoinSelectType specifies the type of coins that should be selected. - CoinSelectType CoinSelectType - // DistinctSpecifier indicates whether we _only_ look at either the // group key _or_ the asset ID but not both. That means, if the group // key is set, we ignore the asset ID and allow multiple inputs of the // same group to be selected. DistinctSpecifier bool + + // ScriptKeyType is the type of script key the assets are expected to + // have. If this is fn.None, then any script key type is allowed. + ScriptKeyType fn.Option[asset.ScriptKeyType] } // TapCommitmentKey is the key that maps to the root commitment for the asset