Repository: lightninglabs/taproot-assets

Issue:
[feature]: Configure custom histogram buckets for tapd gRPC latency metrics
Currently, tapd is using the default histogram configuration for gRPC latency metrics, which caps the largest bucket at 10 seconds. As a result, any RPCs taking longer than 10s are incorrectly classified, making it difficult to accurately monitor long-running operations.

We should explicitly configure larger histogram buckets (e.g., 20s, 30s, 60s) in the tapd code to improve observability.

The universe server RPC endpoints we need to track more accurately are:
- `UniverseStats`
- `QueryAssetStats`
- `QueryProof`
- `InsertProof`

---

I think we just need to pass in better bucket sizes here:

https://github.com/lightninglabs/taproot-assets/blob/2173dc4700fe5678acbac2cb563e0815b8945917/monitoring/monitoring_on.go#L31-L34


Discussion:
@ffranr: Take a look also at `WithHistogramBuckets` in `github.com/grpc-ecosystem/go-grpc-middleware/providers/prometheus@v1.0.0-rc.0/options.go`@ffranr: Terminal Web team report that a unary endpoint took 45mins to run one day and 4mins the next. We should be able to track that sort of variability.

Solution patch:
diff --git a/address/book.go b/address/book.go
index 10cc88ec..d1071140 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 d6041ba1..4a20723f 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
 
@@ -1863,6 +1937,10 @@ type ChainAsset struct {
 	// tx.
 	AnchorBlockHeight uint32
 
+	// AnchorBlockTimestamp is the Unix timestamp of the block that mined
+	// the anchor tx.
+	AnchorBlockTimestamp int64
+
 	// AnchorOutpoint is the outpoint that commits to the asset.
 	AnchorOutpoint wire.OutPoint
 
diff --git a/asset/generators.go b/asset/generators.go
index 2af47d0a..858c84e0 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/addrs.go b/cmd/commands/addrs.go
index 3a75ed0c..65a5f9c9 100644
--- a/cmd/commands/addrs.go
+++ b/cmd/commands/addrs.go
@@ -7,6 +7,7 @@ import (
 	"time"
 
 	"github.com/lightninglabs/taproot-assets/asset"
+	"github.com/lightninglabs/taproot-assets/rpcutils"
 	"github.com/lightninglabs/taproot-assets/taprpc"
 	"github.com/urfave/cli"
 )
@@ -82,7 +83,7 @@ func newAddr(ctx *cli.Context) error {
 	client, cleanUp := getClient(ctx)
 	defer cleanUp()
 
-	assetVersion, err := taprpc.MarshalAssetVersion(
+	assetVersion, err := rpcutils.MarshalAssetVersion(
 		asset.Version(ctx.Uint64(assetVersionName)),
 	)
 	if err != nil {
diff --git a/cmd/commands/assets.go b/cmd/commands/assets.go
index f22faf1c..069f3f84 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 5dce9e48..9b406417 100644
--- a/docs/examples/basic-price-oracle/go.mod
+++ b/docs/examples/basic-price-oracle/go.mod
@@ -2,24 +2,20 @@ module basic-price-oracle
 
 go 1.23.6
 
-replace (
-	github.com/lightninglabs/taproot-assets => ../../../
-
-	// We want to format raw bytes as hex instead of base64. The forked version
-	// allows us to specify that as an option.
-	google.golang.org/protobuf => github.com/lightninglabs/protobuf-go-hex-display v1.33.0-hex-display
-)
+// 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
 
 require (
-	github.com/lightninglabs/taproot-assets v0.5.0-rc1
+	github.com/lightninglabs/taproot-assets v0.5.2-0.20250424095231-89a3e175feb0
 	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 +47,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 +68,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 +117,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 +148,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 0c8b266e..77ec17fd 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=
@@ -446,6 +435,8 @@ github.com/lightninglabs/neutrino/cache v1.1.2 h1:C9DY/DAPaPxbFC+xNNEI/z1SJY9GS3
 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/taproot-assets v0.5.2-0.20250424095231-89a3e175feb0 h1:6r4n5DDXQMuMV3/+y5v1vdBTJejpNUK54d58OarDoPw=
+github.com/lightninglabs/taproot-assets v0.5.2-0.20250424095231-89a3e175feb0/go.mod h1:6kQm7VC4yWAwczJaxfOWlCOQ4TuzfCLUkGKBwVONN7k=
 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=
@@ -524,8 +515,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 +639,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 +655,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 +727,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 +779,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 +869,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 +920,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 +950,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 +980,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 +999,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 2aeced3f..e87bc5d1 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
@@ -29,6 +29,7 @@ require (
 	github.com/lightninglabs/lightning-node-connect/hashmailrpc v1.0.2
 	github.com/lightninglabs/lndclient v0.19.0-4
 	github.com/lightninglabs/neutrino/cache v1.1.2
+	github.com/lightninglabs/taproot-assets/taprpc v1.0.0
 	github.com/lightningnetwork/lnd v0.19.0-beta.rc2.0.20250423092132-a35ace7371af
 	github.com/lightningnetwork/lnd/cert v1.2.2
 	github.com/lightningnetwork/lnd/clock v1.1.1
@@ -43,9 +44,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 +56,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 +81,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
@@ -117,7 +117,7 @@ require (
 	github.com/jonboulle/clockwork v0.2.2 // indirect
 	github.com/jrick/logrotate v1.1.2 // indirect
 	github.com/json-iterator/go v1.1.12 // indirect
-	github.com/juju/loggo v0.0.0-20210728185423-eebad3a902c4 // indirect
+	github.com/juju/loggo v1.0.0 // indirect
 	github.com/kkdai/bstream v1.0.0 // indirect
 	github.com/klauspost/compress v1.17.9 // indirect
 	github.com/klauspost/cpuid/v2 v2.2.7 // indirect
@@ -144,7 +144,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 +176,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 +208,11 @@ 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
+
+// Note this is a temproary replace and will be removed when taprpc is tagged.
+replace github.com/lightninglabs/taproot-assets/taprpc => ./taprpc
diff --git a/go.sum b/go.sum
index 11f2834f..6e9c1c2c 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=
@@ -432,24 +419,16 @@ github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHm
 github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=
 github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk=
 github.com/juju/ansiterm v0.0.0-20180109212912-720a0952cc2a/go.mod h1:UJSiEoRfvx3hP73CvoARgeLjaIOjybY9vj8PUPPFGeU=
-github.com/juju/clock v0.0.0-20220203021603-d9deb868a28a h1:Az/6CM/P5guGHNy7r6TkOCctv3lDmN3W1uhku7QMupk=
-github.com/juju/clock v0.0.0-20220203021603-d9deb868a28a/go.mod h1:GZ/FY8Cqw3KHG6DwRVPUKbSPTAwyrU28xFi5cqZnLsc=
-github.com/juju/collections v0.0.0-20220203020748-febd7cad8a7a h1:d7eZO8OS/ZXxdP0uq3E8CdoA1qNFaecAv90UxrxaY2k=
-github.com/juju/collections v0.0.0-20220203020748-febd7cad8a7a/go.mod h1:JWeZdyttIEbkR51z2S13+J+aCuHVe0F6meRy+P0YGDo=
-github.com/juju/errors v0.0.0-20220331221717-b38fca44723b h1:AxFeSQJfcm2O3ov1wqAkTKYFsnMw2g1B4PkYujfAdkY=
-github.com/juju/errors v0.0.0-20220331221717-b38fca44723b/go.mod h1:jMGj9DWF/qbo91ODcfJq6z/RYc3FX3taCBZMCcpI4Ls=
-github.com/juju/loggo v0.0.0-20210728185423-eebad3a902c4 h1:NO5tuyw++EGLnz56Q8KMyDZRwJwWO8jQnj285J3FOmY=
-github.com/juju/loggo v0.0.0-20210728185423-eebad3a902c4/go.mod h1:NIXFioti1SmKAlKNuUwbMenNdef59IF52+ZzuOmHYkg=
-github.com/juju/mgo/v2 v2.0.0-20220111072304-f200228f1090 h1:zX5GoH3Jp8k1EjUFkApu/YZAYEn0PYQfg/U6IDyNyYs=
-github.com/juju/mgo/v2 v2.0.0-20220111072304-f200228f1090/go.mod h1:N614SE0a4e+ih2rg96Vi2PeC3cTpUOWgCTv3Cgk974c=
-github.com/juju/retry v0.0.0-20220204093819-62423bf33287 h1:U+7oMWEglXfiikIppNexButZRwKPlzLBGKYSNCXzXf8=
-github.com/juju/retry v0.0.0-20220204093819-62423bf33287/go.mod h1:SssN1eYeK3A2qjnFGTiVMbdzGJ2BfluaJblJXvuvgqA=
-github.com/juju/testing v0.0.0-20220203020004-a0ff61f03494 h1:XEDzpuZb8Ma7vLja3+5hzUqVTvAqm5Y+ygvnDs5iTMM=
-github.com/juju/testing v0.0.0-20220203020004-a0ff61f03494/go.mod h1:rUquetT0ALL48LHZhyRGvjjBH8xZaZ8dFClulKK5wK4=
-github.com/juju/utils/v3 v3.0.0-20220203023959-c3fbc78a33b0 h1:bn+2Adl1yWqYjm3KSFlFqsvfLg2eq+XNL7GGMYApdVw=
-github.com/juju/utils/v3 v3.0.0-20220203023959-c3fbc78a33b0/go.mod h1:8csUcj1VRkfjNIRzBFWzLFCMLwLqsRWvkmhfVAUwbC4=
-github.com/juju/version/v2 v2.0.0-20220204124744-fc9915e3d935 h1:6YoyzXVW1XkqN86y2s/rz365Jm7EiAy39v2G5ikzvHU=
-github.com/juju/version/v2 v2.0.0-20220204124744-fc9915e3d935/go.mod h1:ZeFjNy+UFEWJDDPdzW7Cm9NeU6dsViGaFYhXzycLQrw=
+github.com/juju/clock v1.1.1 h1:NvgHG9DQmOpBevgt6gzkyimdWBooLXDy1cQn89qJzBI=
+github.com/juju/clock v1.1.1/go.mod h1:HIBvJ8kiV/n7UHwKuCkdYL4l/MDECztHR2sAvWDxxf0=
+github.com/juju/errors v1.0.0 h1:yiq7kjCLll1BiaRuNY53MGI0+EQ3rF6GB+wvboZDefM=
+github.com/juju/errors v1.0.0/go.mod h1:B5x9thDqx0wIMH3+aLIMP9HjItInYWObRovoCFM5Qe8=
+github.com/juju/loggo v1.0.0 h1:Y6ZMQOGR9Aj3BGkiWx7HBbIx6zNwNkxhVNOHU2i1bl0=
+github.com/juju/loggo v1.0.0/go.mod h1:NIXFioti1SmKAlKNuUwbMenNdef59IF52+ZzuOmHYkg=
+github.com/juju/testing v1.0.2 h1:OR90RqCd9CJONxXamZAjLknpZdtqDyxqW8IwCbgw3i4=
+github.com/juju/testing v1.0.2/go.mod h1:h3Vd2rzB57KrdsBEy6R7bmSKPzP76BnNavt7i8PerwQ=
+github.com/juju/utils/v3 v3.2.0 h1:RkEgTHbrPoOqTuOSaob52B1gLkpeMLd5fZj/4kFzb1k=
+github.com/juju/utils/v3 v3.2.0/go.mod h1:nAj3sHtdYfAkvnkqttTy3Xzm2HzkD9Hfgnc+upOW2Z8=
 github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
 github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM=
 github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
@@ -494,12 +473,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 +563,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=
@@ -677,8 +658,6 @@ github.com/ugorji/go/codec v1.1.7 h1:2SvQaVZ1ouYrrKKwoSk2pzd4A9evlKJb9oTL+OaLUSs
 github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY=
 github.com/urfave/cli v1.22.14 h1:ebbhrRiGK2i4naQJr+1Xj92HXZCrK7MsyTS/ob3HnAk=
 github.com/urfave/cli v1.22.14/go.mod h1:X0eDS6pD6Exaclxm99NJ3FiCDRED7vIHpx2mDOHLvkA=
-github.com/xdg-go/stringprep v1.0.4 h1:XLI/Ng3O1Atzq0oBs3TWm+5ZVgkq2aqdlvP9JtoZ6c8=
-github.com/xdg-go/stringprep v1.0.4/go.mod h1:mPGuuIYwz7CmR2bT9j4GbQqutWS1zV24gijq1dTyGkM=
 github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f h1:J9EGpcZtP0E/raorCMxlFGSTBrsSlaDGf3jU/qvAE2c=
 github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU=
 github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 h1:EzJWgHovont7NscjpAxXsDA8S8BMYve8Y5+7cuRE7R0=
@@ -720,14 +699,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 +716,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 +792,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 +850,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 +948,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 +1002,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 +1032,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 +1066,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 +1090,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/monitoring/monitoring_on.go b/monitoring/monitoring_on.go
index 1838743d..850c2f83 100644
--- a/monitoring/monitoring_on.go
+++ b/monitoring/monitoring_on.go
@@ -29,7 +29,14 @@ func GetPromInterceptors(cfg *PrometheusConfig) ([]grpc.UnaryServerInterceptor,
 	}
 
 	if cfg.PerfHistograms {
-		opt := grpc_prometheus.WithServerHandlingTimeHistogram()
+		// Set the histogram buckets in seconds.
+		histogramBuckets := []float64{
+			0.01, 0.1, 0.5, 1, 5, 10, 60, 120, 240, 600, 1200,
+		}
+		opt := grpc_prometheus.WithServerHandlingTimeHistogram(
+			grpc_prometheus.WithHistogramBuckets(histogramBuckets),
+		)
+
 		opts = append(opts, opt)
 	}
 
diff --git a/proof/courier.go b/proof/courier.go
index 69a22d2c..e5db7dc1 100644
--- a/proof/courier.go
+++ b/proof/courier.go
@@ -14,7 +14,7 @@ import (
 	"github.com/lightninglabs/lightning-node-connect/hashmailrpc"
 	"github.com/lightninglabs/taproot-assets/asset"
 	"github.com/lightninglabs/taproot-assets/fn"
-	"github.com/lightninglabs/taproot-assets/taprpc"
+	"github.com/lightninglabs/taproot-assets/rpcutils"
 	unirpc "github.com/lightninglabs/taproot-assets/taprpc/universerpc"
 	"google.golang.org/grpc"
 	"google.golang.org/grpc/codes"
@@ -1309,7 +1309,7 @@ func (c *UniverseRpcCourier) DeliverProof(ctx context.Context,
 		// Construct asset leaf.
 		// Note: We pass in a none-value for the decimal display option,
 		// as this doesn't matter for the courrier.
-		rpcAsset, err := taprpc.MarshalAsset(
+		rpcAsset, err := rpcutils.MarshalAsset(
 			ctx, &proofAsset, true, true, nil, fn.None[uint32](),
 		)
 		if err != nil {
@@ -1328,7 +1328,7 @@ func (c *UniverseRpcCourier) DeliverProof(ctx context.Context,
 
 		// Construct universe key.
 		outPoint := transitionProof.OutPoint()
-		assetKey := unirpc.MarshalAssetKey(
+		assetKey := rpcutils.MarshalAssetKey(
 			outPoint, proofAsset.ScriptKey.PubKey,
 		)
 		assetID := proofAsset.ID()
@@ -1342,7 +1342,7 @@ func (c *UniverseRpcCourier) DeliverProof(ctx context.Context,
 			groupPubKeyBytes = groupPubKey.SerializeCompressed()
 		}
 
-		universeID := unirpc.MarshalUniverseID(
+		universeID := rpcutils.MarshalUniverseID(
 			assetID[:], groupPubKeyBytes,
 		)
 		universeKey := unirpc.UniverseKey{
@@ -1424,10 +1424,10 @@ func (c *UniverseRpcCourier) ReceiveProof(ctx context.Context,
 		}
 
 		universeKey := unirpc.UniverseKey{
-			Id: unirpc.MarshalUniverseID(
+			Id: rpcutils.MarshalUniverseID(
 				loc.AssetID[:], groupKeyBytes,
 			),
-			LeafKey: unirpc.MarshalAssetKey(
+			LeafKey: rpcutils.MarshalAssetKey(
 				*loc.OutPoint, &loc.ScriptKey,
 			),
 		}
diff --git a/proof/proof.go b/proof/proof.go
index 64c2e854..3de05cf4 100644
--- a/proof/proof.go
+++ b/proof/proof.go
@@ -530,6 +530,7 @@ func (p *Proof) ToChainAsset() (asset.ChainAsset, error) {
 		AnchorBlockHash:        p.BlockHeader.BlockHash(),
 		AnchorOutpoint:         p.OutPoint(),
 		AnchorBlockHeight:      p.BlockHeight,
+		AnchorBlockTimestamp:   p.BlockHeader.Timestamp.Unix(),
 		AnchorInternalKey:      p.InclusionProof.InternalKey,
 		AnchorMerkleRoot:       merkleRoot[:],
 		AnchorTapscriptSibling: tsSibling,
diff --git a/rfq/manager.go b/rfq/manager.go
index 2b67a0bb..7a257a58 100644
--- a/rfq/manager.go
+++ b/rfq/manager.go
@@ -1116,6 +1116,24 @@ func (q *PeerAcceptedBuyQuoteEvent) Timestamp() time.Time {
 	return q.timestamp.UTC()
 }
 
+// MatchesOrder checks if the sell quote matches the provided order.
+func (q *PeerAcceptedBuyQuoteEvent) MatchesOrder(order BuyOrder) bool {
+	if q.Request.AssetSpecifier != order.AssetSpecifier {
+		return false
+	}
+
+	// If the order has no peer, we accept equality just based on the
+	// specifier.
+	if order.Peer.IsNone() {
+		return true
+	}
+
+	// If a peer is specified, ensure it matches the event's peer.
+	return fn.MapOptionZ(order.Peer, func(vertex route.Vertex) bool {
+		return q.Peer == vertex
+	})
+}
+
 // Ensure that the PeerAcceptedBuyQuoteEvent struct implements the Event
 // interface.
 var _ fn.Event = (*PeerAcceptedBuyQuoteEvent)(nil)
@@ -1197,6 +1215,24 @@ func (q *PeerAcceptedSellQuoteEvent) Timestamp() time.Time {
 	return q.timestamp.UTC()
 }
 
+// MatchesOrder checks if the sell quote matches the provided order.
+func (q *PeerAcceptedSellQuoteEvent) MatchesOrder(order SellOrder) bool {
+	if q.Request.AssetSpecifier != order.AssetSpecifier {
+		return false
+	}
+
+	// If the order has no peer, we accept equality just based on the
+	// specifier.
+	if order.Peer.IsNone() {
+		return true
+	}
+
+	// If a peer is specified, ensure it matches the event's peer.
+	return fn.MapOptionZ(order.Peer, func(vertex route.Vertex) bool {
+		return q.Peer == vertex
+	})
+}
+
 // Ensure that the PeerAcceptedSellQuoteEvent struct implements the Event
 // interface.
 var _ fn.Event = (*PeerAcceptedSellQuoteEvent)(nil)
diff --git a/rfq/oracle.go b/rfq/oracle.go
index 64cd38cd..6fe85292 100644
--- a/rfq/oracle.go
+++ b/rfq/oracle.go
@@ -11,6 +11,7 @@ import (
 	"github.com/lightninglabs/taproot-assets/asset"
 	"github.com/lightninglabs/taproot-assets/fn"
 	"github.com/lightninglabs/taproot-assets/rfqmsg"
+	"github.com/lightninglabs/taproot-assets/rpcutils"
 	oraclerpc "github.com/lightninglabs/taproot-assets/taprpc/priceoraclerpc"
 	"github.com/lightningnetwork/lnd/lnwire"
 	"google.golang.org/grpc"
@@ -203,7 +204,7 @@ func (r *RpcPriceOracle) QueryAskPrice(ctx context.Context,
 
 	// Construct the RPC asset rates hint.
 	rpcAssetRatesHint, err := fn.MapOptionZ(
-		assetRateHint, oraclerpc.MarshalAssetRates,
+		assetRateHint, rpcutils.MarshalAssetRates,
 	).Unpack()
 	if err != nil {
 		return nil, err
@@ -242,7 +243,7 @@ func (r *RpcPriceOracle) QueryAskPrice(ctx context.Context,
 		}
 
 		// Unmarshal the subject asset to BTC rate.
-		rate, err := oraclerpc.UnmarshalFixedPoint(
+		rate, err := rpcutils.UnmarshalFixedPoint(
 			result.Ok.AssetRates.SubjectAssetRate,
 		)
 		if err != nil {
@@ -299,7 +300,7 @@ func (r *RpcPriceOracle) QueryBidPrice(ctx context.Context,
 
 	// Construct the RPC asset rates hint.
 	rpcAssetRatesHint, err := fn.MapOptionZ(
-		assetRateHint, oraclerpc.MarshalAssetRates,
+		assetRateHint, rpcutils.MarshalAssetRates,
 	).Unpack()
 	if err != nil {
 		return nil, err
@@ -333,7 +334,7 @@ func (r *RpcPriceOracle) QueryBidPrice(ctx context.Context,
 		}
 
 		// Unmarshal the subject asset to BTC rate.
-		rate, err := oraclerpc.UnmarshalFixedPoint(
+		rate, err := rpcutils.UnmarshalFixedPoint(
 			result.Ok.AssetRates.SubjectAssetRate,
 		)
 		if err != nil {
diff --git a/rfq/stream.go b/rfq/stream.go
index e35d83e5..70f52ce4 100644
--- a/rfq/stream.go
+++ b/rfq/stream.go
@@ -154,13 +154,12 @@ func (h *StreamHandler) HandleOutgoingMessage(
 	ctx, cancel := h.WithCtxQuitNoTimeout()
 	defer cancel()
 
-	err = h.cfg.PeerMessenger.SendCustomMessage(ctx, lndClientCustomMsg)
-	if err != nil {
-		return fmt.Errorf("unable to send message to peer: %w",
-			err)
-	}
-
-	// Store outgoing requests.
+	// We store the outgoing request in the request map, so we can interpret
+	// any response and map it to the original request. We do this before
+	// sending the message, because otherwise we could potentially receive
+	// the response while we're waiting for the atomic lock to be released,
+	// which would lead to us not knowing about the request in the first
+	// place, and we couldn't map the response.
 	switch msg := outgoingMsg.(type) {
 	case *rfqmsg.BuyRequest:
 		h.outgoingRequests.Store(msg.ID, msg)
@@ -173,6 +172,12 @@ func (h *StreamHandler) HandleOutgoingMessage(
 			msg.ID.String())
 	}
 
+	err = h.cfg.PeerMessenger.SendCustomMessage(ctx, lndClientCustomMsg)
+	if err != nil {
+		return fmt.Errorf("unable to send message to peer: %w",
+			err)
+	}
+
 	return nil
 }
 
diff --git a/rpcserver.go b/rpcserver.go
index 992294fd..5a9bea25 100644
--- a/rpcserver.go
+++ b/rpcserver.go
@@ -39,6 +39,7 @@ import (
 	"github.com/lightninglabs/taproot-assets/rfqmath"
 	"github.com/lightninglabs/taproot-assets/rfqmsg"
 	"github.com/lightninglabs/taproot-assets/rpcperms"
+	"github.com/lightninglabs/taproot-assets/rpcutils"
 	"github.com/lightninglabs/taproot-assets/tapchannel"
 	"github.com/lightninglabs/taproot-assets/tapdb"
 	"github.com/lightninglabs/taproot-assets/tapfreighter"
@@ -486,7 +487,7 @@ func (r *rpcServer) MintAsset(ctx context.Context,
 			"a specific group")
 	}
 
-	assetVersion, err := taprpc.UnmarshalAssetVersion(
+	assetVersion, err := rpcutils.UnmarshalAssetVersion(
 		req.Asset.AssetVersion,
 	)
 	if err != nil {
@@ -568,14 +569,16 @@ func (r *rpcServer) MintAsset(ctx context.Context,
 		groupTapscriptRoot []byte
 	)
 	if req.Asset.ScriptKey != nil {
-		scriptKey, err = taprpc.UnmarshalScriptKey(req.Asset.ScriptKey)
+		scriptKey, err = rpcutils.UnmarshalScriptKey(
+			req.Asset.ScriptKey,
+		)
 		if err != nil {
 			return nil, err
 		}
 	}
 
 	if specificGroupInternalKey {
-		groupInternalKey, err = taprpc.UnmarshalKeyDescriptor(
+		groupInternalKey, err = rpcutils.UnmarshalKeyDescriptor(
 			req.Asset.GroupInternalKey,
 		)
 		if err != nil {
@@ -621,7 +624,7 @@ func (r *rpcServer) MintAsset(ctx context.Context,
 	}
 
 	if req.Asset.ExternalGroupKey != nil {
-		externalKey, err := taprpc.UnmarshalExternalKey(
+		externalKey, err := rpcutils.UnmarshalExternalKey(
 			req.Asset.ExternalGroupKey,
 		)
 		if err != nil {
@@ -747,7 +750,7 @@ func (r *rpcServer) FundBatch(ctx context.Context,
 	}
 	feeRateOpt := fn.MaybeSome(feeRate)
 
-	tapTreeOpt, err := taprpc.UnmarshalTapscriptSibling(
+	tapTreeOpt, err := rpcutils.UnmarshalTapscriptSibling(
 		req.GetFullTree(), req.GetBranch(),
 	)
 	if err != nil {
@@ -873,7 +876,7 @@ func (r *rpcServer) FinalizeBatch(ctx context.Context,
 	}
 	feeRateOpt := fn.MaybeSome(feeRate)
 
-	tapTreeOpt, err := taprpc.UnmarshalTapscriptSibling(
+	tapTreeOpt, err := rpcutils.UnmarshalTapscriptSibling(
 		req.GetFullTree(), req.GetBranch(),
 	)
 	if err != nil {
@@ -1010,7 +1013,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 +1029,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 +1063,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 {
@@ -1082,7 +1084,7 @@ func (r *rpcServer) ListAssets(ctx context.Context,
 	}
 
 	if req.ScriptKey != nil {
-		scriptKey, err := taprpc.UnmarshalScriptKey(req.ScriptKey)
+		scriptKey, err := rpcutils.UnmarshalScriptKey(req.ScriptKey)
 		if err != nil {
 			return nil, fmt.Errorf("unable to decode script key: "+
 				"%w", err)
@@ -1105,9 +1107,18 @@ func (r *rpcServer) ListAssets(ctx context.Context,
 		filters.AnchorPoint = outPoint
 	}
 
+	scriptKeyType, includeSpent, err := rpcutils.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 {
@@ -1193,7 +1204,7 @@ func (r *rpcServer) fetchRpcAssets(ctx context.Context, withWitness,
 // MarshalChainAsset marshals the given chain asset into an RPC asset.
 func (r *rpcServer) MarshalChainAsset(ctx context.Context, a asset.ChainAsset,
 	meta *proof.MetaReveal, withWitness bool,
-	keyRing taprpc.KeyLookup) (*taprpc.Asset, error) {
+	keyRing rpcutils.KeyLookup) (*taprpc.Asset, error) {
 
 	var (
 		decDisplay fn.Option[uint32]
@@ -1212,17 +1223,25 @@ func (r *rpcServer) MarshalChainAsset(ctx context.Context, a asset.ChainAsset,
 		return nil, err
 	}
 
-	return taprpc.MarshalChainAsset(
+	// Ensure the block timestamp is set if a block height is set.
+	if a.AnchorBlockTimestamp == 0 && a.AnchorBlockHeight > 0 {
+		a.AnchorBlockTimestamp = r.cfg.ChainBridge.GetBlockTimestamp(
+			ctx, a.AnchorBlockHeight,
+		)
+	}
+
+	return rpcutils.MarshalChainAsset(
 		ctx, a, decDisplay, withWitness, keyRing,
 	)
 }
 
 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)
@@ -1253,11 +1272,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)
@@ -1292,8 +1312,22 @@ func (r *rpcServer) listBalancesByGroupKey(ctx context.Context,
 func (r *rpcServer) ListUtxos(ctx context.Context,
 	req *taprpc.ListUtxosRequest) (*taprpc.ListUtxosResponse, error) {
 
+	scriptKeyType, includeSpent, err := rpcutils.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
@@ -1358,7 +1392,7 @@ func (r *rpcServer) ListGroups(ctx context.Context,
 	for _, a := range readableAssets {
 		groupKey := hex.EncodeToString(a.GroupKey.SerializeCompressed())
 
-		assetVersion, err := taprpc.MarshalAssetVersion(
+		assetVersion, err := rpcutils.MarshalAssetVersion(
 			a.Version,
 		)
 		if err != nil {
@@ -1395,6 +1429,14 @@ func (r *rpcServer) ListGroups(ctx context.Context,
 func (r *rpcServer) ListBalances(ctx context.Context,
 	req *taprpc.ListBalancesRequest) (*taprpc.ListBalancesResponse, error) {
 
+	scriptKeyType, _, err := rpcutils.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 {
@@ -1411,7 +1453,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 {
@@ -1429,7 +1473,7 @@ func (r *rpcServer) ListBalances(ctx context.Context,
 		}
 
 		return r.listBalancesByGroupKey(
-			ctx, groupKey, req.IncludeLeased,
+			ctx, groupKey, req.IncludeLeased, scriptKeyType,
 		)
 
 	default:
@@ -1572,7 +1616,7 @@ func (r *rpcServer) NewAddr(ctx context.Context,
 		return nil, fmt.Errorf("invalid tapscript sibling: %w", err)
 	}
 
-	assetVersion, err := taprpc.UnmarshalAssetVersion(req.AssetVersion)
+	assetVersion, err := rpcutils.UnmarshalAssetVersion(req.AssetVersion)
 	if err != nil {
 		return nil, err
 	}
@@ -1609,7 +1653,7 @@ func (r *rpcServer) NewAddr(ctx context.Context,
 
 	// Both the script and internal keys were specified.
 	default:
-		scriptKey, err := taprpc.UnmarshalScriptKey(req.ScriptKey)
+		scriptKey, err := rpcutils.UnmarshalScriptKey(req.ScriptKey)
 		if err != nil {
 			return nil, fmt.Errorf("unable to decode script key: "+
 				"%w", err)
@@ -1627,7 +1671,7 @@ func (r *rpcServer) NewAddr(ctx context.Context,
 			scriptKey.RawKey.PubKey.SerializeCompressed(),
 			scriptKey.Tweak[:])
 
-		internalKey, err := taprpc.UnmarshalKeyDescriptor(
+		internalKey, err := rpcutils.UnmarshalKeyDescriptor(
 			req.InternalKey,
 		)
 		if err != nil {
@@ -2168,7 +2212,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)
@@ -2195,7 +2239,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)
@@ -2265,7 +2309,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: "+
@@ -2314,23 +2358,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)
 	}
 }
 
@@ -2983,7 +3028,7 @@ func (r *rpcServer) NextInternalKey(ctx context.Context,
 	}
 
 	return &wrpc.NextInternalKeyResponse{
-		InternalKey: taprpc.MarshalKeyDescriptor(keyDesc),
+		InternalKey: rpcutils.MarshalKeyDescriptor(keyDesc),
 	}, nil
 }
 
@@ -3009,7 +3054,7 @@ func (r *rpcServer) NextScriptKey(ctx context.Context,
 	}
 
 	return &wrpc.NextScriptKeyResponse{
-		ScriptKey: taprpc.MarshalScriptKey(scriptKey),
+		ScriptKey: rpcutils.MarshalScriptKey(scriptKey),
 	}, nil
 }
 
@@ -3057,10 +3102,12 @@ func (r *rpcServer) QueryInternalKey(ctx context.Context,
 	}
 
 	return &wrpc.QueryInternalKeyResponse{
-		InternalKey: taprpc.MarshalKeyDescriptor(keychain.KeyDescriptor{
-			PubKey:     internalKey,
-			KeyLocator: keyLocator,
-		}),
+		InternalKey: rpcutils.MarshalKeyDescriptor(
+			keychain.KeyDescriptor{
+				PubKey:     internalKey,
+				KeyLocator: keyLocator,
+			},
+		),
 	}, nil
 }
 
@@ -3167,7 +3214,7 @@ func (r *rpcServer) QueryScriptKey(ctx context.Context,
 	}
 
 	return &wrpc.QueryScriptKeyResponse{
-		ScriptKey: taprpc.MarshalScriptKey(asset.ScriptKey{
+		ScriptKey: rpcutils.MarshalScriptKey(asset.ScriptKey{
 			PubKey:           scriptKey,
 			TweakedScriptKey: tweakedKey,
 		}),
@@ -3210,7 +3257,7 @@ func marshalAddr(addr *address.Tap,
 			err)
 	}
 
-	assetVersion, err := taprpc.MarshalAssetVersion(addr.AssetVersion)
+	assetVersion, err := rpcutils.MarshalAssetVersion(addr.AssetVersion)
 	if err != nil {
 		return nil, err
 	}
@@ -3611,7 +3658,7 @@ func marshalOutboundParcel(
 			return nil, err
 		}
 
-		assetVersion, err := taprpc.MarshalAssetVersion(
+		assetVersion, err := rpcutils.MarshalAssetVersion(
 			out.AssetVersion,
 		)
 		if err != nil {
@@ -3676,12 +3723,14 @@ func marshalOutboundParcel(
 func marshalOutputProofDeliveryStatus(
 	out tapfreighter.TransferOutput) taprpc.ProofDeliveryStatus {
 
-	proofDeliveryStatus := taprpc.ProofDeliveryStatusNotApplicable
+	proofDeliveryStatus := rpcutils.ProofDeliveryStatusNotApplicable
 	out.ProofDeliveryComplete.WhenSome(func(complete bool) {
 		if complete {
-			proofDeliveryStatus = taprpc.ProofDeliveryStatusComplete
+			proofDeliveryStatus =
+				rpcutils.ProofDeliveryStatusComplete
 		} else {
-			proofDeliveryStatus = taprpc.ProofDeliveryStatusPending
+			proofDeliveryStatus =
+				rpcutils.ProofDeliveryStatusPending
 		}
 	})
 
@@ -4399,7 +4448,7 @@ func marshalSeedling(seedling *tapgarden.Seedling) (*mintrpc.PendingAsset,
 	)
 
 	if seedling.ScriptKey.PubKey != nil {
-		scriptKey = taprpc.MarshalScriptKey(seedling.ScriptKey)
+		scriptKey = rpcutils.MarshalScriptKey(seedling.ScriptKey)
 	}
 
 	if seedling.HasGroupKey() {
@@ -4408,7 +4457,7 @@ func marshalSeedling(seedling *tapgarden.Seedling) (*mintrpc.PendingAsset,
 	}
 
 	if seedling.GroupInternalKey != nil {
-		groupInternalKey = taprpc.MarshalKeyDescriptor(
+		groupInternalKey = rpcutils.MarshalKeyDescriptor(
 			*seedling.GroupInternalKey,
 		)
 	}
@@ -4431,7 +4480,7 @@ func marshalSeedling(seedling *tapgarden.Seedling) (*mintrpc.PendingAsset,
 		}
 	}
 
-	assetVersion, err := taprpc.MarshalAssetVersion(
+	assetVersion, err := rpcutils.MarshalAssetVersion(
 		seedling.AssetVersion,
 	)
 	if err != nil {
@@ -4471,14 +4520,14 @@ func marshalUnsealedSeedling(params chaincfg.Params, verbose bool,
 	}
 
 	if verbose && seedling.PendingAssetGroup != nil {
-		groupVirtualTx, err = taprpc.MarshalGroupVirtualTx(
+		groupVirtualTx, err = rpcutils.MarshalGroupVirtualTx(
 			&seedling.PendingAssetGroup.GroupVirtualTx,
 		)
 		if err != nil {
 			return nil, err
 		}
 
-		groupReq, err = taprpc.MarshalGroupKeyRequest(
+		groupReq, err = rpcutils.MarshalGroupKeyRequest(
 			&seedling.PendingAssetGroup.GroupKeyRequest,
 		)
 		if err != nil {
@@ -4574,7 +4623,7 @@ func marshalSprouts(sprouts []*asset.Asset,
 			grp := sprout.GroupKey
 			groupKeyBytes = grp.GroupPubKey.SerializeCompressed()
 			groupTapscriptRoot = grp.TapscriptRoot
-			groupInternalKey = taprpc.MarshalKeyDescriptor(
+			groupInternalKey = rpcutils.MarshalKeyDescriptor(
 				grp.RawKey,
 			)
 		}
@@ -4587,7 +4636,7 @@ func marshalSprouts(sprouts []*asset.Asset,
 			GroupKey:           groupKeyBytes,
 			GroupInternalKey:   groupInternalKey,
 			GroupTapscriptRoot: groupTapscriptRoot,
-			ScriptKey: taprpc.MarshalScriptKey(
+			ScriptKey: rpcutils.MarshalScriptKey(
 				sprout.ScriptKey,
 			),
 		})
@@ -5289,12 +5338,23 @@ func (r *rpcServer) AssetLeafKeys(ctx context.Context,
 	return resp, nil
 }
 
-func marshalAssetLeaf(ctx context.Context, keys taprpc.KeyLookup,
+func marshalAssetLeaf(ctx context.Context, keys rpcutils.KeyLookup,
 	assetLeaf *universe.Leaf,
 	decDisplay fn.Option[uint32]) (*unirpc.AssetLeaf, error) {
 
-	rpcAsset, err := taprpc.MarshalAsset(
-		ctx, assetLeaf.Asset, false, true, keys, decDisplay,
+	// Decode the single proof to extract on-chain anchor info.
+	p, err := proof.Decode(assetLeaf.RawProof)
+	if err != nil {
+		return nil, err
+	}
+	chainAsset, err := p.ToChainAsset()
+	if err != nil {
+		return nil, err
+	}
+
+	// Marshal as a chain asset to include chain_anchor details.
+	rpcAsset, err := rpcutils.MarshalChainAsset(
+		ctx, chainAsset, decDisplay, true, keys,
 	)
 	if err != nil {
 		return nil, err
@@ -5478,14 +5538,68 @@ func (r *rpcServer) marshalUniverseProofLeaf(ctx context.Context,
 		return nil, err
 	}
 
-	return &unirpc.AssetProofResponse{
+	response := &unirpc.AssetProofResponse{
 		Req:                      req,
 		UniverseRoot:             uniRoot,
 		UniverseInclusionProof:   uniProof,
 		AssetLeaf:                assetLeaf,
 		MultiverseRoot:           multiverseRoot,
 		MultiverseInclusionProof: multiverseProof,
-	}, nil
+	}
+
+	// For an issuance proof, it's useful to directly see some of the
+	// genesis and meta reveal data in a decoded manner. Since we don't know
+	// the proof type, if it was unspecified, we'll only skip this if the
+	// proof type is transfer.
+	if req.Id.ProofType != unirpc.ProofType_PROOF_TYPE_TRANSFER {
+		p, err := proof.Leaf.RawProof.AsSingleProof()
+		if err != nil {
+			return nil, err
+		}
+
+		// If this isn't a genesis reveal, it means we have a transfer
+		// proof after all (perhaps because the proof type was given
+		// as ProofType_PROOF_TYPE_UNSPECIFIED).
+		if p.GenesisReveal == nil {
+			return response, nil
+		}
+
+		genInfo := &taprpc.GenesisInfo{
+			GenesisPoint: p.GenesisReveal.FirstPrevOut.String(),
+			Name:         p.GenesisReveal.Tag,
+			MetaHash:     p.GenesisReveal.MetaHash[:],
+			AssetId:      fn.ByteSlice(p.Asset.ID()),
+			OutputIndex:  p.GenesisReveal.OutputIndex,
+			AssetType:    taprpc.AssetType(p.Asset.Type),
+		}
+		issuanceData := &unirpc.IssuanceData{
+			GenesisReveal: &taprpc.GenesisReveal{
+				GenesisBaseReveal: genInfo,
+			},
+		}
+
+		if p.GroupKeyReveal != nil {
+			rawKey := p.GroupKeyReveal.RawKey()
+			issuanceData.GroupKeyReveal = &taprpc.GroupKeyReveal{
+				RawGroupKey:   rawKey[:],
+				TapscriptRoot: p.GroupKeyReveal.TapscriptRoot(),
+			}
+		}
+
+		if p.MetaReveal != nil {
+			issuanceData.MetaReveal = &taprpc.AssetMeta{
+				Data: p.MetaReveal.Data,
+				Type: taprpc.AssetMetaType(
+					p.MetaReveal.Type,
+				),
+				MetaHash: fn.ByteSlice(p.MetaReveal.MetaHash()),
+			}
+		}
+
+		response.IssuanceData = issuanceData
+	}
+
+	return response, nil
 }
 
 // QueryProof attempts to query for an issuance or transfer proof for a given
@@ -6503,7 +6617,7 @@ func MarshalAssetFedSyncCfg(
 	if uniID.GroupKey != nil {
 		groupKeyBytes = uniID.GroupKey.SerializeCompressed()
 	}
-	uniIdRPC := unirpc.MarshalUniverseID(assetIDBytes, groupKeyBytes)
+	uniIdRPC := rpcutils.MarshalUniverseID(assetIDBytes, groupKeyBytes)
 
 	// Marshal proof type.
 	proofTypeRpc, err := MarshalUniProofType(uniID.ProofType)
@@ -6739,8 +6853,26 @@ func (r *rpcServer) AddAssetBuyOrder(ctx context.Context,
 	timeout := time.After(time.Second * time.Duration(req.TimeoutSeconds))
 
 	for {
+		type targetEventType = *rfq.PeerAcceptedBuyQuoteEvent
 		select {
 		case event := <-eventSubscriber.NewItemCreated.ChanOut():
+			acceptedQuote, ok := event.(targetEventType)
+			if !ok {
+				rpcsLog.Debugf("Received event of type %T "+
+					"but expected accepted sell quote, "+
+					"skipping", event)
+
+				continue
+			}
+
+			if !acceptedQuote.MatchesOrder(*buyOrder) {
+				rpcsLog.Debugf("Received event of type %T "+
+					"but order doesn't match, skipping",
+					event)
+
+				continue
+			}
+
 			resp, err := rfq.NewAddAssetBuyOrderResponse(event)
 			if err != nil {
 				return nil, fmt.Errorf("error marshalling "+
@@ -6913,8 +7045,26 @@ func (r *rpcServer) AddAssetSellOrder(ctx context.Context,
 	timeout := time.After(time.Second * time.Duration(req.TimeoutSeconds))
 
 	for {
+		type targetEventType = *rfq.PeerAcceptedSellQuoteEvent
 		select {
 		case event := <-eventSubscriber.NewItemCreated.ChanOut():
+			acceptedQuote, ok := event.(targetEventType)
+			if !ok {
+				rpcsLog.Debugf("Received event of type %T "+
+					"but expected accepted sell quote, "+
+					"skipping", event)
+
+				continue
+			}
+
+			if !acceptedQuote.MatchesOrder(*sellOrder) {
+				rpcsLog.Debugf("Received event of type %T "+
+					"but order doesn't match, skipping",
+					event)
+
+				continue
+			}
+
 			resp, err := rfq.NewAddAssetSellOrderResponse(event)
 			if err != nil {
 				return nil, fmt.Errorf("error marshalling "+
@@ -7556,7 +7706,7 @@ func (r *rpcServer) SendPayment(req *tchrpc.SendPaymentRequest,
 		}
 
 		// Unmarshall the accepted quote's asset rate.
-		assetRate, err := rfqrpc.UnmarshalFixedPoint(
+		assetRate, err := rpcutils.UnmarshalRfqFixedPoint(
 			acceptedQuote.BidAssetRate,
 		)
 		if err != nil {
@@ -7717,7 +7867,7 @@ func (r *rpcServer) parseRequest(
 func checkOverpayment(quote *rfqrpc.PeerAcceptedSellQuote,
 	paymentAmount lnwire.MilliSatoshi, allowOverpay bool) error {
 
-	rateFP, err := rfqrpc.UnmarshalFixedPoint(quote.BidAssetRate)
+	rateFP, err := rpcutils.UnmarshalRfqFixedPoint(quote.BidAssetRate)
 	if err != nil {
 		return fmt.Errorf("cannot unmarshal asset rate: %w", err)
 	}
@@ -8058,7 +8208,7 @@ func validateInvoiceAmount(acceptedQuote *rfqrpc.PeerAcceptedBuyQuote,
 	// that we need to pay. We can now update the invoice with this amount.
 	//
 	// First, un-marshall the ask asset rate from the accepted quote.
-	askAssetRate, err := rfqrpc.UnmarshalFixedPoint(
+	askAssetRate, err := rpcutils.UnmarshalRfqFixedPoint(
 		acceptedQuote.AskAssetRate,
 	)
 	if err != nil {
@@ -8130,19 +8280,32 @@ func (r *rpcServer) DeclareScriptKey(ctx context.Context,
 	in *wrpc.DeclareScriptKeyRequest) (*wrpc.DeclareScriptKeyResponse,
 	error) {
 
-	scriptKey, err := taprpc.UnmarshalScriptKey(in.ScriptKey)
+	scriptKey, err := rpcutils.UnmarshalScriptKey(in.ScriptKey)
 	if err != nil {
 		return nil, fmt.Errorf("error unmarshalling script key: %w",
 			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)
 	}
 
 	return &wrpc.DeclareScriptKeyResponse{
-		ScriptKey: taprpc.MarshalScriptKey(*scriptKey),
+		ScriptKey: rpcutils.MarshalScriptKey(*scriptKey),
 	}, nil
 }
 
diff --git a/taprpc/marshal.go b/rpcutils/marshal.go
similarity index 69%
rename from taprpc/marshal.go
rename to rpcutils/marshal.go
index 0bc54607..54f56acc 100644
--- a/taprpc/marshal.go
+++ b/rpcutils/marshal.go
@@ -1,4 +1,4 @@
-package taprpc
+package rpcutils
 
 import (
 	"bytes"
@@ -15,6 +15,7 @@ import (
 	"github.com/lightninglabs/taproot-assets/asset"
 	"github.com/lightninglabs/taproot-assets/commitment"
 	"github.com/lightninglabs/taproot-assets/fn"
+	"github.com/lightninglabs/taproot-assets/taprpc"
 	"github.com/lightningnetwork/lnd/keychain"
 	"github.com/lightningnetwork/lnd/lntest"
 )
@@ -23,9 +24,9 @@ import (
 //
 // nolint: lll
 var (
-	ProofDeliveryStatusNotApplicable = ProofDeliveryStatus_PROOF_DELIVERY_STATUS_NOT_APPLICABLE
-	ProofDeliveryStatusComplete      = ProofDeliveryStatus_PROOF_DELIVERY_STATUS_COMPLETE
-	ProofDeliveryStatusPending       = ProofDeliveryStatus_PROOF_DELIVERY_STATUS_PENDING
+	ProofDeliveryStatusNotApplicable = taprpc.ProofDeliveryStatus_PROOF_DELIVERY_STATUS_NOT_APPLICABLE
+	ProofDeliveryStatusComplete      = taprpc.ProofDeliveryStatus_PROOF_DELIVERY_STATUS_COMPLETE
+	ProofDeliveryStatusPending       = taprpc.ProofDeliveryStatus_PROOF_DELIVERY_STATUS_PENDING
 )
 
 // KeyLookup is used to determine whether a key is under the control of the
@@ -38,15 +39,15 @@ type KeyLookup interface {
 
 // MarshalKeyDescriptor marshals the native key descriptor into the RPC
 // counterpart.
-func MarshalKeyDescriptor(desc keychain.KeyDescriptor) *KeyDescriptor {
+func MarshalKeyDescriptor(desc keychain.KeyDescriptor) *taprpc.KeyDescriptor {
 	var rawKeyBytes []byte
 	if desc.PubKey != nil {
 		rawKeyBytes = desc.PubKey.SerializeCompressed()
 	}
 
-	return &KeyDescriptor{
+	return &taprpc.KeyDescriptor{
 		RawKeyBytes: rawKeyBytes,
-		KeyLoc: &KeyLocator{
+		KeyLoc: &taprpc.KeyLocator{
 			KeyFamily: int32(desc.KeyLocator.Family),
 			KeyIndex:  int32(desc.KeyLocator.Index),
 		},
@@ -55,8 +56,8 @@ func MarshalKeyDescriptor(desc keychain.KeyDescriptor) *KeyDescriptor {
 
 // UnmarshalKeyDescriptor parses the RPC key descriptor into the native
 // counterpart.
-func UnmarshalKeyDescriptor(rpcDesc *KeyDescriptor) (keychain.KeyDescriptor,
-	error) {
+func UnmarshalKeyDescriptor(
+	rpcDesc *taprpc.KeyDescriptor) (keychain.KeyDescriptor, error) {
 
 	var (
 		desc keychain.KeyDescriptor
@@ -83,10 +84,16 @@ func UnmarshalKeyDescriptor(rpcDesc *KeyDescriptor) (keychain.KeyDescriptor,
 }
 
 // UnmarshalScriptKey parses the RPC script key into the native counterpart.
-func UnmarshalScriptKey(rpcKey *ScriptKey) (*asset.ScriptKey, error) {
+func UnmarshalScriptKey(rpcKey *taprpc.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,25 +105,23 @@ 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
 }
 
 // MarshalScriptKey marshals the native script key into the RPC counterpart.
-func MarshalScriptKey(scriptKey asset.ScriptKey) *ScriptKey {
-	rpcScriptKey := &ScriptKey{
+func MarshalScriptKey(scriptKey asset.ScriptKey) *taprpc.ScriptKey {
+	rpcScriptKey := &taprpc.ScriptKey{
 		PubKey: schnorr.SerializePubKey(scriptKey.PubKey),
 	}
 
@@ -125,21 +130,73 @@ 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 taprpc.ScriptKeyType) (asset.ScriptKeyType,
+	error) {
+
+	switch rpcType {
+	case taprpc.ScriptKeyType_SCRIPT_KEY_UNKNOWN:
+		return asset.ScriptKeyUnknown, nil
+
+	case taprpc.ScriptKeyType_SCRIPT_KEY_BIP86:
+		return asset.ScriptKeyBip86, nil
+
+	case taprpc.ScriptKeyType_SCRIPT_KEY_SCRIPT_PATH_EXTERNAL:
+		return asset.ScriptKeyScriptPathExternal, nil
+
+	case taprpc.ScriptKeyType_SCRIPT_KEY_BURN:
+		return asset.ScriptKeyBurn, nil
+
+	case taprpc.ScriptKeyType_SCRIPT_KEY_TOMBSTONE:
+		return asset.ScriptKeyTombstone, nil
+
+	case taprpc.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) taprpc.ScriptKeyType {
+	switch typ {
+	case asset.ScriptKeyBip86:
+		return taprpc.ScriptKeyType_SCRIPT_KEY_BIP86
+
+	case asset.ScriptKeyScriptPathExternal:
+		return taprpc.ScriptKeyType_SCRIPT_KEY_SCRIPT_PATH_EXTERNAL
+
+	case asset.ScriptKeyBurn:
+		return taprpc.ScriptKeyType_SCRIPT_KEY_BURN
+
+	case asset.ScriptKeyTombstone:
+		return taprpc.ScriptKeyType_SCRIPT_KEY_TOMBSTONE
+
+	case asset.ScriptKeyScriptPathChannel:
+		return taprpc.ScriptKeyType_SCRIPT_KEY_CHANNEL
+
+	default:
+		return taprpc.ScriptKeyType_SCRIPT_KEY_UNKNOWN
+	}
+}
+
 // UnmarshalAssetVersion parses an asset version from the RPC variant.
-func UnmarshalAssetVersion(version AssetVersion) (asset.Version, error) {
+func UnmarshalAssetVersion(version taprpc.AssetVersion) (asset.Version, error) {
 	// For now, we'll only support two asset versions. The ones in the
 	// future should be reserved for future use, so we disallow unknown
 	// versions.
 	switch version {
-	case AssetVersion_ASSET_VERSION_V0:
+	case taprpc.AssetVersion_ASSET_VERSION_V0:
 		return asset.V0, nil
 
-	case AssetVersion_ASSET_VERSION_V1:
+	case taprpc.AssetVersion_ASSET_VERSION_V1:
 		return asset.V1, nil
 
 	default:
@@ -148,16 +205,16 @@ func UnmarshalAssetVersion(version AssetVersion) (asset.Version, error) {
 }
 
 // MarshalAssetVersion parses an asset version from the RPC variant.
-func MarshalAssetVersion(version asset.Version) (AssetVersion, error) {
+func MarshalAssetVersion(version asset.Version) (taprpc.AssetVersion, error) {
 	// For now, we'll only support two asset versions. The ones in the
 	// future should be reserved for future use, so we disallow unknown
 	// versions.
 	switch version {
 	case asset.V0:
-		return AssetVersion_ASSET_VERSION_V0, nil
+		return taprpc.AssetVersion_ASSET_VERSION_V0, nil
 
 	case asset.V1:
-		return AssetVersion_ASSET_VERSION_V1, nil
+		return taprpc.AssetVersion_ASSET_VERSION_V1, nil
 
 	default:
 		return 0, fmt.Errorf("unknown asset version: %v", version)
@@ -166,10 +223,12 @@ func MarshalAssetVersion(version asset.Version) (AssetVersion, error) {
 
 // MarshalGenesisInfo marshals the native asset genesis into the RPC
 // counterpart.
-func MarshalGenesisInfo(gen *asset.Genesis, assetType asset.Type) *GenesisInfo {
-	return &GenesisInfo{
+func MarshalGenesisInfo(gen *asset.Genesis,
+	assetType asset.Type) *taprpc.GenesisInfo {
+
+	return &taprpc.GenesisInfo{
 		GenesisPoint: gen.FirstPrevOut.String(),
-		AssetType:    AssetType(assetType),
+		AssetType:    taprpc.AssetType(assetType),
 		Name:         gen.Tag,
 		MetaHash:     gen.MetaHash[:],
 		AssetId:      fn.ByteSlice(gen.ID()),
@@ -178,7 +237,7 @@ func MarshalGenesisInfo(gen *asset.Genesis, assetType asset.Type) *GenesisInfo {
 }
 
 // UnmarshalGenesisInfo parses an asset Genesis from the RPC variant.
-func UnmarshalGenesisInfo(rpcGen *GenesisInfo) (*asset.Genesis, error) {
+func UnmarshalGenesisInfo(rpcGen *taprpc.GenesisInfo) (*asset.Genesis, error) {
 	firstPrevOut, err := wire.NewOutPointFromString(rpcGen.GenesisPoint)
 	if err != nil {
 		return nil, err
@@ -199,7 +258,7 @@ func UnmarshalGenesisInfo(rpcGen *GenesisInfo) (*asset.Genesis, error) {
 }
 
 // UnmarshalTapscriptFullTree parses a Tapscript tree from the RPC variant.
-func UnmarshalTapscriptFullTree(tree *TapscriptFullTree) (
+func UnmarshalTapscriptFullTree(tree *taprpc.TapscriptFullTree) (
 	*asset.TapscriptTreeNodes, error) {
 
 	rpcLeaves := tree.GetAllLeaves()
@@ -224,8 +283,8 @@ func UnmarshalTapscriptFullTree(tree *TapscriptFullTree) (
 }
 
 // UnmarshalTapscriptBranch parses a Tapscript branch from the RPC variant.
-func UnmarshalTapscriptBranch(branch *TapBranch) (*asset.TapscriptTreeNodes,
-	error) {
+func UnmarshalTapscriptBranch(
+	branch *taprpc.TapBranch) (*asset.TapscriptTreeNodes, error) {
 
 	branchData := [][]byte{branch.LeftTaphash, branch.RightTaphash}
 	tapBranch, err := asset.DecodeTapBranchNodes(branchData)
@@ -237,8 +296,9 @@ func UnmarshalTapscriptBranch(branch *TapBranch) (*asset.TapscriptTreeNodes,
 }
 
 // UnmarshalTapscriptSibling parses a Tapscript sibling from the RPC variant.
-func UnmarshalTapscriptSibling(rpcTree *TapscriptFullTree,
-	rpcBranch *TapBranch) (fn.Option[asset.TapscriptTreeNodes], error) {
+func UnmarshalTapscriptSibling(rpcTree *taprpc.TapscriptFullTree,
+	rpcBranch *taprpc.TapBranch) (fn.Option[asset.TapscriptTreeNodes],
+	error) {
 
 	var (
 		tapSibling *asset.TapscriptTreeNodes
@@ -264,8 +324,8 @@ func UnmarshalTapscriptSibling(rpcTree *TapscriptFullTree,
 }
 
 // UnmarshalGroupKeyRequest parses a group key request from the RPC variant.
-func UnmarshalGroupKeyRequest(req *GroupKeyRequest) (*asset.GroupKeyRequest,
-	error) {
+func UnmarshalGroupKeyRequest(
+	req *taprpc.GroupKeyRequest) (*asset.GroupKeyRequest, error) {
 
 	rawKey, err := UnmarshalKeyDescriptor(req.RawKey)
 	if err != nil {
@@ -311,8 +371,8 @@ func UnmarshalGroupKeyRequest(req *GroupKeyRequest) (*asset.GroupKeyRequest,
 
 // MarshalGroupKeyRequest marshals the native group key request into the RPC
 // counterpart.
-func MarshalGroupKeyRequest(req *asset.GroupKeyRequest) (*GroupKeyRequest,
-	error) {
+func MarshalGroupKeyRequest(
+	req *asset.GroupKeyRequest) (*taprpc.GroupKeyRequest, error) {
 
 	err := req.Validate()
 	if err != nil {
@@ -331,12 +391,12 @@ func MarshalGroupKeyRequest(req *asset.GroupKeyRequest) (*GroupKeyRequest,
 	// Marshal raw key into RPC format.
 	//
 	// We only need to marshal the raw key if the external key is not set.
-	var rawKey *KeyDescriptor
+	var rawKey *taprpc.KeyDescriptor
 	if req.ExternalKey.IsNone() {
 		rawKey = MarshalKeyDescriptor(req.RawKey)
 	}
 
-	return &GroupKeyRequest{
+	return &taprpc.GroupKeyRequest{
 		RawKey: rawKey,
 		AnchorGenesis: MarshalGenesisInfo(
 			&req.AnchorGen, req.NewAsset.Type,
@@ -348,7 +408,7 @@ func MarshalGroupKeyRequest(req *asset.GroupKeyRequest) (*GroupKeyRequest,
 }
 
 // MarshalExternalKey marshals an external key into its RPC counterpart.
-func MarshalExternalKey(key asset.ExternalKey) *ExternalKey {
+func MarshalExternalKey(key asset.ExternalKey) *taprpc.ExternalKey {
 	var masterFingerprint [4]byte
 	binary.LittleEndian.PutUint32(
 		masterFingerprint[:], key.MasterFingerprint,
@@ -366,7 +426,7 @@ func MarshalExternalKey(key asset.ExternalKey) *ExternalKey {
 	derivationPathStr := fmt.Sprintf("m/%d'/%d'/%d'/%d/%d", purpose,
 		coinType, account, internalExternalAddr, addrIndex)
 
-	return &ExternalKey{
+	return &taprpc.ExternalKey{
 		Xpub:              key.XPub.String(),
 		MasterFingerprint: masterFingerprint[:],
 		DerivationPath:    derivationPathStr,
@@ -374,7 +434,9 @@ func MarshalExternalKey(key asset.ExternalKey) *ExternalKey {
 }
 
 // UnmarshalExternalKey parses an external key from the RPC variant.
-func UnmarshalExternalKey(rpcKey *ExternalKey) (asset.ExternalKey, error) {
+func UnmarshalExternalKey(rpcKey *taprpc.ExternalKey) (asset.ExternalKey,
+	error) {
+
 	if rpcKey == nil {
 		return asset.ExternalKey{}, fmt.Errorf("unexpected nil RPC " +
 			"external key")
@@ -420,7 +482,7 @@ func UnmarshalExternalKey(rpcKey *ExternalKey) (asset.ExternalKey, error) {
 
 // MarshalGroupVirtualTx marshals the native asset group virtual transaction
 // into the RPC counterpart.
-func MarshalGroupVirtualTx(genTx *asset.GroupVirtualTx) (*GroupVirtualTx,
+func MarshalGroupVirtualTx(genTx *asset.GroupVirtualTx) (*taprpc.GroupVirtualTx,
 	error) {
 
 	var groupTxBuf bytes.Buffer
@@ -429,12 +491,12 @@ func MarshalGroupVirtualTx(genTx *asset.GroupVirtualTx) (*GroupVirtualTx,
 		return nil, err
 	}
 
-	rpcPrevOut := TxOut{
+	rpcPrevOut := taprpc.TxOut{
 		Value:    genTx.PrevOut.Value,
 		PkScript: genTx.PrevOut.PkScript,
 	}
 
-	return &GroupVirtualTx{
+	return &taprpc.GroupVirtualTx{
 		Transaction: groupTxBuf.Bytes(),
 		PrevOut:     &rpcPrevOut,
 		GenesisId:   fn.ByteSlice(genTx.GenID),
@@ -444,8 +506,8 @@ func MarshalGroupVirtualTx(genTx *asset.GroupVirtualTx) (*GroupVirtualTx,
 
 // UnmarshalGroupVirtualTx parses a group virtual transaction from the RPC
 // variant.
-func UnmarshalGroupVirtualTx(genTx *GroupVirtualTx) (*asset.GroupVirtualTx,
-	error) {
+func UnmarshalGroupVirtualTx(
+	genTx *taprpc.GroupVirtualTx) (*asset.GroupVirtualTx, error) {
 
 	var virtualTx wire.MsgTx
 	err := virtualTx.Deserialize(bytes.NewReader(genTx.Transaction))
@@ -482,7 +544,7 @@ func UnmarshalGroupVirtualTx(genTx *GroupVirtualTx) (*asset.GroupVirtualTx,
 // MarshalChainAsset marshals a chain asset into its RPC counterpart.
 func MarshalChainAsset(ctx context.Context, a asset.ChainAsset,
 	decDisplay fn.Option[uint32], withWitness bool,
-	keyRing KeyLookup) (*Asset, error) {
+	keyRing KeyLookup) (*taprpc.Asset, error) {
 
 	rpcAsset, err := MarshalAsset(
 		ctx, a.Asset, a.IsSpent, withWitness, keyRing, decDisplay,
@@ -502,7 +564,7 @@ func MarshalChainAsset(ctx context.Context, a asset.ChainAsset,
 		anchorTxBytes = b.Bytes()
 	}
 
-	rpcAsset.ChainAnchor = &AnchorInfo{
+	rpcAsset.ChainAnchor = &taprpc.AnchorInfo{
 		AnchorTx:         anchorTxBytes,
 		AnchorBlockHash:  a.AnchorBlockHash.String(),
 		AnchorOutpoint:   a.AnchorOutpoint.String(),
@@ -510,6 +572,7 @@ func MarshalChainAsset(ctx context.Context, a asset.ChainAsset,
 		MerkleRoot:       a.AnchorMerkleRoot,
 		TapscriptSibling: a.AnchorTapscriptSibling,
 		BlockHeight:      a.AnchorBlockHeight,
+		BlockTimestamp:   a.AnchorBlockTimestamp,
 	}
 
 	if a.AnchorLeaseOwner != [32]byte{} {
@@ -523,13 +586,20 @@ func MarshalChainAsset(ctx context.Context, a asset.ChainAsset,
 // MarshalAsset converts an asset to its rpc representation.
 func MarshalAsset(ctx context.Context, a *asset.Asset,
 	isSpent, withWitness bool, keyRing KeyLookup,
-	decDisplay fn.Option[uint32]) (*Asset, error) {
+	decDisplay fn.Option[uint32]) (*taprpc.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)
@@ -538,7 +608,7 @@ func MarshalAsset(ctx context.Context, a *asset.Asset,
 	}
 
 	scriptKeyBytes := a.ScriptKey.PubKey.SerializeCompressed()
-	rpcAsset := &Asset{
+	rpcAsset := &taprpc.Asset{
 		Version:                assetVersion,
 		AssetGenesis:           MarshalGenesisInfo(&a.Genesis, a.Type),
 		Amount:                 a.Amount,
@@ -551,10 +621,11 @@ 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) {
-		rpcAsset.DecimalDisplay = &DecimalDisplay{
+		rpcAsset.DecimalDisplay = &taprpc.DecimalDisplay{
 			DecimalDisplay: u,
 		}
 	})
@@ -581,7 +652,7 @@ func MarshalAsset(ctx context.Context, a *asset.Asset,
 		if len(a.GroupKey.TapscriptRoot) != 0 {
 			tapscriptRoot = a.GroupKey.TapscriptRoot[:]
 		}
-		rpcAsset.AssetGroup = &AssetGroup{
+		rpcAsset.AssetGroup = &taprpc.AssetGroup{
 			RawGroupKey: rawKey,
 			TweakedGroupKey: a.GroupKey.GroupPubKey.
 				SerializeCompressed(),
@@ -595,13 +666,13 @@ func MarshalAsset(ctx context.Context, a *asset.Asset,
 			witness := a.PrevWitnesses[idx]
 
 			prevID := witness.PrevID
-			rpcPrevID := &PrevInputAsset{
+			rpcPrevID := &taprpc.PrevInputAsset{
 				AnchorPoint: prevID.OutPoint.String(),
 				AssetId:     prevID.ID[:],
 				ScriptKey:   prevID.ScriptKey[:],
 			}
 
-			var rpcSplitCommitment *SplitCommitment
+			var rpcSplitCommitment *taprpc.SplitCommitment
 			if witness.SplitCommitment != nil {
 				rootAsset, err := MarshalAsset(
 					ctx, &witness.SplitCommitment.RootAsset,
@@ -611,13 +682,13 @@ func MarshalAsset(ctx context.Context, a *asset.Asset,
 					return nil, err
 				}
 
-				rpcSplitCommitment = &SplitCommitment{
+				rpcSplitCommitment = &taprpc.SplitCommitment{
 					RootAsset: rootAsset,
 				}
 			}
 
 			rpcAsset.PrevWitnesses = append(
-				rpcAsset.PrevWitnesses, &PrevWitness{
+				rpcAsset.PrevWitnesses, &taprpc.PrevWitness{
 					PrevId:          rpcPrevID,
 					TxWitness:       witness.TxWitness,
 					SplitCommitment: rpcSplitCommitment,
@@ -628,3 +699,42 @@ 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 *taprpc.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 *taprpc.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 *taprpc.ScriptKeyTypeQuery_AllTypes:
+		return fn.None[asset.ScriptKeyType](), false, nil
+
+	default:
+		return fn.Some(asset.ScriptKeyBip86), false, nil
+	}
+}
diff --git a/taprpc/priceoraclerpc/marshal.go b/rpcutils/price_oracle_marshal.go
similarity index 80%
rename from taprpc/priceoraclerpc/marshal.go
rename to rpcutils/price_oracle_marshal.go
index 9cb54208..a694035a 100644
--- a/taprpc/priceoraclerpc/marshal.go
+++ b/rpcutils/price_oracle_marshal.go
@@ -1,4 +1,4 @@
-package priceoraclerpc
+package rpcutils
 
 import (
 	"bytes"
@@ -8,12 +8,13 @@ import (
 
 	"github.com/lightninglabs/taproot-assets/rfqmath"
 	"github.com/lightninglabs/taproot-assets/rfqmsg"
+	"github.com/lightninglabs/taproot-assets/taprpc/priceoraclerpc"
 	lfn "github.com/lightningnetwork/lnd/fn/v2"
 )
 
 // IsAssetBtc is a helper function that returns true if the given asset
 // specifier represents BTC, and false otherwise.
-func IsAssetBtc(assetSpecifier *AssetSpecifier) bool {
+func IsAssetBtc(assetSpecifier *priceoraclerpc.AssetSpecifier) bool {
 	// An unset asset specifier does not represent BTC.
 	if assetSpecifier == nil {
 		return false
@@ -49,24 +50,26 @@ func IsAssetBtc(assetSpecifier *AssetSpecifier) bool {
 // MarshalAssetRates converts an asset rate to an RPC AssetRates.
 // The OK result has a pointer type so that it is nil if there is an error.
 // NOTE: The payment asset is assumed to be BTC.
-func MarshalAssetRates(assetRate rfqmsg.AssetRate) lfn.Result[*AssetRates] {
+func MarshalAssetRates(
+	assetRate rfqmsg.AssetRate) lfn.Result[*priceoraclerpc.AssetRates] {
+
 	// Marshal the subject asset rate.
 	subjectAssetRate, err := MarshalBigIntFixedPoint(assetRate.Rate)
 	if err != nil {
-		return lfn.Err[*AssetRates](err)
+		return lfn.Err[*priceoraclerpc.AssetRates](err)
 	}
 
 	// Marshal the payment asset rate. For now, we only support BTC as the
 	// payment asset.
 	paymentAssetRate, err := MarshalBigIntFixedPoint(rfqmsg.MilliSatPerBtc)
 	if err != nil {
-		return lfn.Err[*AssetRates](err)
+		return lfn.Err[*priceoraclerpc.AssetRates](err)
 	}
 
 	// Compute an expiry unix timestamp from the given asset rate expiry.
 	expiryTimestamp := uint64(assetRate.Expiry.Unix())
 
-	return lfn.Ok[*AssetRates](&AssetRates{
+	return lfn.Ok[*priceoraclerpc.AssetRates](&priceoraclerpc.AssetRates{
 		SubjectAssetRate: subjectAssetRate,
 		PaymentAssetRate: paymentAssetRate,
 		ExpiryTimestamp:  expiryTimestamp,
@@ -74,15 +77,19 @@ func MarshalAssetRates(assetRate rfqmsg.AssetRate) lfn.Result[*AssetRates] {
 }
 
 // MarshalBigIntFixedPoint converts a BigIntFixedPoint to an RPC FixedPoint.
-func MarshalBigIntFixedPoint(fp rfqmath.BigIntFixedPoint) (*FixedPoint, error) {
-	return &FixedPoint{
+func MarshalBigIntFixedPoint(
+	fp rfqmath.BigIntFixedPoint) (*priceoraclerpc.FixedPoint, error) {
+
+	return &priceoraclerpc.FixedPoint{
 		Coefficient: fp.Coefficient.String(),
 		Scale:       uint32(fp.Scale),
 	}, nil
 }
 
 // UnmarshalFixedPoint converts an RPC FixedPoint to a BigIntFixedPoint.
-func UnmarshalFixedPoint(fp *FixedPoint) (*rfqmath.BigIntFixedPoint, error) {
+func UnmarshalFixedPoint(
+	fp *priceoraclerpc.FixedPoint) (*rfqmath.BigIntFixedPoint, error) {
+
 	// Return an error is the scale component of the fixed point is greater
 	// than the max value of uint8.
 	if fp.Scale > 255 {
diff --git a/taprpc/rfqrpc/marshal.go b/rpcutils/rfq_marshal.go
similarity index 66%
rename from taprpc/rfqrpc/marshal.go
rename to rpcutils/rfq_marshal.go
index 331bb88f..d105e765 100644
--- a/taprpc/rfqrpc/marshal.go
+++ b/rpcutils/rfq_marshal.go
@@ -1,14 +1,17 @@
-package rfqrpc
+package rpcutils
 
 import (
 	"fmt"
 	"math/big"
 
 	"github.com/lightninglabs/taproot-assets/rfqmath"
+	"github.com/lightninglabs/taproot-assets/taprpc/rfqrpc"
 )
 
-// UnmarshalFixedPoint converts an RPC FixedPoint to a BigIntFixedPoint.
-func UnmarshalFixedPoint(fp *FixedPoint) (*rfqmath.BigIntFixedPoint, error) {
+// UnmarshalRfqFixedPoint converts an RPC FixedPoint to a BigIntFixedPoint.
+func UnmarshalRfqFixedPoint(fp *rfqrpc.FixedPoint) (*rfqmath.BigIntFixedPoint,
+	error) {
+
 	// Return an error is the scale component of the fixed point is greater
 	// than the max value of uint8.
 	if fp.Scale > 255 {
diff --git a/taprpc/universerpc/marshal.go b/rpcutils/universe_marshal.go
similarity index 58%
rename from taprpc/universerpc/marshal.go
rename to rpcutils/universe_marshal.go
index f6f12dec..c857cdcf 100644
--- a/taprpc/universerpc/marshal.go
+++ b/rpcutils/universe_marshal.go
@@ -1,16 +1,14 @@
-package universerpc
+package rpcutils
 
 import (
 	"github.com/btcsuite/btcd/btcec/v2"
 	"github.com/btcsuite/btcd/wire"
+	"github.com/lightninglabs/taproot-assets/taprpc/universerpc"
 )
 
 // MarshalOutpoint marshals a wire.OutPoint into an RPC ready Outpoint.
-//
-// TODO(ffranr): Move this package's Outpoint type and this marshal function to
-// somewhere more general.
-func MarshalOutpoint(outPoint wire.OutPoint) *Outpoint {
-	return &Outpoint{
+func MarshalOutpoint(outPoint wire.OutPoint) *universerpc.Outpoint {
+	return &universerpc.Outpoint{
 		HashStr: outPoint.Hash.String(),
 		Index:   int32(outPoint.Index),
 	}
@@ -18,35 +16,37 @@ func MarshalOutpoint(outPoint wire.OutPoint) *Outpoint {
 
 // MarshalAssetKey returns an RPC ready AssetKey.
 func MarshalAssetKey(outPoint wire.OutPoint,
-	scriptKeyPubKey *btcec.PublicKey) *AssetKey {
+	scriptKeyPubKey *btcec.PublicKey) *universerpc.AssetKey {
 
 	scriptKeyBytes := scriptKeyPubKey.SerializeCompressed()
 
-	return &AssetKey{
-		Outpoint: &AssetKey_Op{
+	return &universerpc.AssetKey{
+		Outpoint: &universerpc.AssetKey_Op{
 			Op: MarshalOutpoint(outPoint),
 		},
-		ScriptKey: &AssetKey_ScriptKeyBytes{
+		ScriptKey: &universerpc.AssetKey_ScriptKeyBytes{
 			ScriptKeyBytes: scriptKeyBytes,
 		},
 	}
 }
 
 // MarshalUniverseID returns an RPC ready universe ID.
-func MarshalUniverseID(assetIDBytes []byte, groupKeyBytes []byte) *ID {
+func MarshalUniverseID(assetIDBytes []byte,
+	groupKeyBytes []byte) *universerpc.ID {
+
 	// We will marshal either a group key ID or an asset ID. If group key
 	// bytes are given, we marshal a group key ID, otherwise we marshal an
 	// asset ID.
 	if groupKeyBytes != nil {
-		return &ID{
-			Id: &ID_GroupKey{
+		return &universerpc.ID{
+			Id: &universerpc.ID_GroupKey{
 				GroupKey: groupKeyBytes,
 			},
 		}
 	}
 
-	return &ID{
-		Id: &ID_AssetId{
+	return &universerpc.ID{
+		Id: &universerpc.ID_AssetId{
 			AssetId: assetIDBytes,
 		},
 	}
diff --git a/server.go b/server.go
index c26802d2..36bdfbc5 100644
--- a/server.go
+++ b/server.go
@@ -17,7 +17,6 @@ import (
 	"github.com/lightninglabs/taproot-assets/address"
 	"github.com/lightninglabs/taproot-assets/fn"
 	"github.com/lightninglabs/taproot-assets/monitoring"
-	"github.com/lightninglabs/taproot-assets/perms"
 	"github.com/lightninglabs/taproot-assets/rfqmsg"
 	"github.com/lightninglabs/taproot-assets/rpcperms"
 	"github.com/lightninglabs/taproot-assets/tapchannel"
@@ -133,7 +132,7 @@ func (s *Server) initialize(interceptorChain *rpcperms.InterceptorChain) error {
 				Checkers: []macaroons.Checker{
 					macaroons.IPLockChecker,
 				},
-				RequiredPerms: perms.RequiredPermissions,
+				RequiredPerms: taprpc.RequiredPermissions,
 			},
 		)
 		if err != nil {
@@ -158,7 +157,7 @@ func (s *Server) initialize(interceptorChain *rpcperms.InterceptorChain) error {
 
 			// Register all our known permission with the macaroon
 			// service.
-			for method, ops := range perms.RequiredPermissions {
+			for method, ops := range taprpc.RequiredPermissions {
 				err := interceptorChain.AddPermission(
 					method, ops,
 				)
@@ -311,7 +310,7 @@ func (s *Server) RunUntilShutdown(mainErrChan <-chan error) error {
 	serverOpts := s.cfg.GrpcServerOpts
 
 	// Get RPC endpoints which don't require macaroons.
-	macaroonWhitelist := perms.MacaroonWhitelist(
+	macaroonWhitelist := taprpc.MacaroonWhitelist(
 		s.cfg.UniversePublicAccess.IsReadAccessGranted(),
 		s.cfg.UniversePublicAccess.IsWriteAccessGranted(),
 		s.cfg.RPCConfig.AllowPublicUniProofCourier,
diff --git a/tapcfg/server.go b/tapcfg/server.go
index 4970f49a..b2f5449a 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 f474e1b0..6d503fdc 100644
--- a/tapchannel/aux_closer.go
+++ b/tapchannel/aux_closer.go
@@ -402,13 +402,43 @@ func (a *AuxChanCloser) AuxCloseOutputs(
 		closeAllocs[idx].OutputIndex = uint32(idx)
 	}
 
-	// Now that we have the complete set of allocations, we'll distribute
-	// them to create the vPackets we'll need to anchor everything.
-	vPackets, err := tapsend.DistributeCoins(
-		inputProofs, closeAllocs, a.cfg.ChainParams, true, tappsbt.V1,
+	// Now we know the deterministic ordering of the local/remote asset/btc
+	// outputs, we can extract the output indexes for the allocations.
+	var (
+		localOutputIndex, remoteOutputIndex uint32
+	)
+	if localAlloc != nil {
+		localOutputIndex = localAlloc.OutputIndex
+	}
+	if remoteAlloc != nil {
+		remoteOutputIndex = remoteAlloc.OutputIndex
+	}
+
+	// We don't use the normal allocation code here. This requires a bit of
+	// a lengthy explanation: When we close a channel, the output of the
+	// `lncli closedchannels` command will show the last commitment state of
+	// the channel as the closing asset balance. Which is correct in terms
+	// of balances. But if there are multiple different asset IDs (e.g., in
+	// a grouped asset channel), then _how_ those pieces are distributed
+	// within the commitment transaction depends on the order of the
+	// allocations. And the order of the allocations is dependent on the
+	// BTC amount and the pkScript of the BTC-level output. Both of which
+	// are different in the coop close output (we set the asset-level output
+	// BTC amount to the dummy amount, and the pkScript will be a newly
+	// derived internal key with no sibling script path).
+	// So, long story short: If we used the tapsend.DistributeCoins method
+	// here, it could happen that the actual asset output distribution shown
+	// in the `lncli closedchannels` command would be different from the
+	// actual distribution in the co-op close transaction.
+	// This could mostly be seen as an UX-only issue, but was actually
+	// discovered while attempting to assert the final closing balance of
+	// grouped asset channels in the litd integration test.
+	vPackets, err := CommitmentToPackets(
+		commitState, inputProofs, a.cfg.ChainParams, localShutdown,
+		remoteShutdown, localOutputIndex, remoteOutputIndex, tappsbt.V1,
 	)
 	if err != nil {
-		return none, fmt.Errorf("unable to distribute coins: %w", err)
+		return none, fmt.Errorf("unable to create vPackets: %w", err)
 	}
 
 	// We can now add the witness for the OP_TRUE spend of the commitment
@@ -560,12 +590,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 61a9c7e4..e2fc9830 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 6460719d..7d5a233a 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 9f23b7b2..a562b26e 100644
--- a/tapchannel/commitment.go
+++ b/tapchannel/commitment.go
@@ -4,6 +4,7 @@ import (
 	"bytes"
 	"context"
 	"fmt"
+	"net/url"
 	"sort"
 
 	"github.com/btcsuite/btcd/btcec/v2/schnorr"
@@ -28,6 +29,7 @@ import (
 	"github.com/lightningnetwork/lnd/lnwallet"
 	"github.com/lightningnetwork/lnd/lnwallet/chainfee"
 	"github.com/lightningnetwork/lnd/lnwire"
+	"golang.org/x/exp/maps"
 )
 
 // DecodedDescriptor is a wrapper around a PaymentDescriptor that also includes
@@ -1494,7 +1496,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)
@@ -1503,6 +1507,132 @@ func deriveFundingScriptKey(ctx context.Context, addrBook address.Storage,
 	return fundingScriptKey, nil
 }
 
+// CommitmentToPackets converts a commitment to a list of vPackets. The
+// commitment must not contain any HTLCs, as this only works for coop-closed
+// channels.
+func CommitmentToPackets(c *cmsg.Commitment, inputs []*proof.Proof,
+	chainParams *address.ChainParams, localShutdownMsg,
+	remoteShutdownMsg cmsg.AuxShutdownMsg, localOutputIndex,
+	remoteOutputIndex uint32,
+	vPktVersion tappsbt.VPacketVersion) ([]*tappsbt.VPacket, error) {
+
+	if len(c.IncomingHtlcAssets.Val.HtlcOutputs) > 0 ||
+		len(c.OutgoingHtlcAssets.Val.HtlcOutputs) > 0 {
+
+		return nil, fmt.Errorf("commitment contains HTLCs, cannot " +
+			"create vPackets")
+	}
+
+	// We group the inputs by asset ID, so we can create a vPacket for each
+	// asset ID. The number of vPackets is dictated by the number of
+	// different asset IDs in the commitment transaction.
+	groupedInputs := tapsend.GroupProofsByAssetID(inputs)
+	vPackets := make(map[asset.ID]*tappsbt.VPacket, len(groupedInputs))
+	for assetID, proofsByID := range groupedInputs {
+		pkt, err := tappsbt.FromProofs(
+			proofsByID, chainParams, vPktVersion,
+		)
+		if err != nil {
+			return nil, fmt.Errorf("error creating vPacket: %w",
+				err)
+		}
+
+		vPackets[assetID] = pkt
+	}
+
+	localOutputs := c.LocalOutputs()
+	remoteOutputs := c.RemoteOutputs()
+
+	// We now distribute the outputs to the vPackets.
+	for _, output := range localOutputs {
+		pkt, ok := vPackets[output.AssetID.Val]
+		if !ok {
+			return nil, fmt.Errorf("no vPacket found "+
+				"for asset ID %s", output.AssetID.Val)
+		}
+
+		outAsset := output.Proof.Val.Asset
+		vOut, err := assetToInteractiveVOutput(
+			outAsset, asset.V0, localShutdownMsg,
+			localOutputIndex,
+		)
+		if err != nil {
+			return nil, fmt.Errorf("error creating "+
+				"vOutput: %w", err)
+		}
+
+		pkt.Outputs = append(pkt.Outputs, vOut)
+	}
+
+	for _, output := range remoteOutputs {
+		pkt, ok := vPackets[output.AssetID.Val]
+		if !ok {
+			return nil, fmt.Errorf("no vPacket found "+
+				"for asset ID %s", output.AssetID.Val)
+		}
+
+		outAsset := output.Proof.Val.Asset
+		vOut, err := assetToInteractiveVOutput(
+			outAsset, asset.V0, remoteShutdownMsg,
+			remoteOutputIndex,
+		)
+		if err != nil {
+			return nil, fmt.Errorf("error creating "+
+				"vOutput: %w", err)
+		}
+
+		pkt.Outputs = append(pkt.Outputs, vOut)
+	}
+
+	return maps.Values(vPackets), nil
+}
+
+// assetToInteractiveVOutput creates a VOutput for an asset that is part of an
+// interactive transaction.
+func assetToInteractiveVOutput(a asset.Asset, version asset.Version,
+	shutdownMsg cmsg.AuxShutdownMsg,
+	anchorOutputIndex uint32) (*tappsbt.VOutput, error) {
+
+	scriptKey, ok := shutdownMsg.ScriptKeys.Val[a.ID()]
+	if !ok {
+		return nil, fmt.Errorf("no script key for asset %s", a.ID())
+	}
+
+	proofDeliveryUrl, err := lfn.MapOptionZ(
+		shutdownMsg.ProofDeliveryAddr.ValOpt(),
+		func(u []byte) lfn.Result[*url.URL] {
+			proofDeliveryUrl, err := url.Parse(string(u))
+			if err != nil {
+				return lfn.Err[*url.URL](fmt.Errorf("unable "+
+					"to parse proof delivery address: %w",
+					err))
+			}
+
+			return lfn.Ok(proofDeliveryUrl)
+		},
+	).Unpack()
+	if err != nil {
+		return nil, fmt.Errorf("unable to decode proof delivery "+
+			"address: %w", err)
+	}
+
+	outType := tappsbt.TypeSplitRoot
+	if a.SplitCommitmentRoot == nil {
+		outType = tappsbt.TypeSimple
+	}
+
+	return &tappsbt.VOutput{
+		Amount:                  a.Amount,
+		AssetVersion:            version,
+		Type:                    outType,
+		Interactive:             true,
+		AnchorOutputIndex:       anchorOutputIndex,
+		AnchorOutputInternalKey: shutdownMsg.AssetInternalKey.Val,
+		ScriptKey:               asset.NewScriptKey(&scriptKey),
+		ProofDeliveryAddress:    proofDeliveryUrl,
+	}, nil
+}
+
 // InPlaceCustomCommitSort performs an in-place sort of a transaction, given a
 // list of allocations. The sort is applied to the transaction outputs, using
 // the allocation's OutputIndex. The transaction inputs are sorted by the
diff --git a/tapdb/addrs.go b/tapdb/addrs.go
index 2db2af5f..563de007 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/asset_minting.go b/tapdb/asset_minting.go
index 075ebc0c..5d5f74e2 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/assets_common.go b/tapdb/assets_common.go
index e8b4d223..1b3eda95 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 894f2467..d6ff8214 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/migrations.go b/tapdb/migrations.go
index b9e9c588..8f13ec7a 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/post_migration_checks.go b/tapdb/post_migration_checks.go
new file mode 100644
index 00000000..08ca986c
--- /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 12f91ad8..a069a9cb 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 bb595af2..15803328 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 cc6a6cd8..4fd0e0fe 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 00000000..1414c9ca
--- /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 00000000..18171fd2
--- /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 00000000..e4ac3c55
--- /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 00000000..75b75082
--- /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 d75129bd..8f8ff9da 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 621acae6..374a4b27 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 ece4b3cb..a7764347 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 9ed18b79..b2104dd6 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 dc3651c4..a6b75d4f 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 2130d3c8..0cf935a3 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 0485eefc..5acef971 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 9e3cb4ed..b5ac730c 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/tapfreighter/chain_porter.go b/tapfreighter/chain_porter.go
index 37c183dd..d04c1f2a 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 7906ee24..0a1c23de 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 7a64499f..e7721f42 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 c7bed633..3c30f1dd 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 e58102a5..2436054b 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 5d861290..99461077 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 ddf85ea4..9f3ce072 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 abe2ec27..07e935bf 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/go.mod b/taprpc/go.mod
new file mode 100644
index 00000000..864cb7e2
--- /dev/null
+++ b/taprpc/go.mod
@@ -0,0 +1,191 @@
+module github.com/lightninglabs/taproot-assets/taprpc
+
+go 1.23.6
+
+require (
+	github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0
+	github.com/lightningnetwork/lnd v0.19.0-beta.rc2.0.20250423092132-a35ace7371af
+	google.golang.org/grpc v1.64.1
+	google.golang.org/protobuf v1.34.2
+	gopkg.in/macaroon-bakery.v2 v2.1.0
+)
+
+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/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
+	github.com/beorn7/perks v1.0.1 // indirect
+	github.com/btcsuite/btcd v0.24.3-0.20250318170759-4f4ea81776d6 // indirect
+	github.com/btcsuite/btcd/btcec/v2 v2.3.4 // indirect
+	github.com/btcsuite/btcd/btcutil v1.1.5 // indirect
+	github.com/btcsuite/btcd/btcutil/psbt v1.1.8 // indirect
+	github.com/btcsuite/btcd/chaincfg/chainhash v1.1.0 // indirect
+	github.com/btcsuite/btclog v0.0.0-20241003133417-09c4e92e319c // indirect
+	github.com/btcsuite/btclog/v2 v2.0.1-0.20250110154127-3ae4bf1cb318 // indirect
+	github.com/btcsuite/btcwallet v0.16.13 // indirect
+	github.com/btcsuite/btcwallet/wallet/txauthor v1.3.5 // indirect
+	github.com/btcsuite/btcwallet/wallet/txrules v1.2.2 // indirect
+	github.com/btcsuite/btcwallet/wallet/txsizes v1.2.5 // indirect
+	github.com/btcsuite/btcwallet/walletdb v1.5.1 // indirect
+	github.com/btcsuite/btcwallet/wtxmgr v1.5.6 // indirect
+	github.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd // indirect
+	github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792 // indirect
+	github.com/btcsuite/winsvc v1.0.0 // indirect
+	github.com/cenkalti/backoff/v4 v4.2.1 // indirect
+	github.com/cespare/xxhash/v2 v2.2.0 // indirect
+	github.com/containerd/continuity v0.3.0 // indirect
+	github.com/coreos/go-semver v0.3.0 // indirect
+	github.com/coreos/go-systemd/v22 v22.5.0 // indirect
+	github.com/davecgh/go-spew v1.1.1 // indirect
+	github.com/decred/dcrd/crypto/blake256 v1.0.1 // indirect
+	github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0 // indirect
+	github.com/decred/dcrd/lru v1.1.2 // indirect
+	github.com/distribution/reference v0.6.0 // 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-units v0.5.0 // indirect
+	github.com/dustin/go-humanize v1.0.1 // 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
+	github.com/go-logr/stdr v1.2.2 // indirect
+	github.com/go-viper/mapstructure/v2 v2.2.1 // indirect
+	github.com/gofrs/uuid v4.2.0+incompatible // indirect
+	github.com/gogo/protobuf v1.3.2 // indirect
+	github.com/golang-jwt/jwt/v4 v4.5.2 // indirect
+	github.com/golang-migrate/migrate/v4 v4.17.0 // indirect
+	github.com/golang/protobuf v1.5.4 // indirect
+	github.com/golang/snappy v0.0.4 // indirect
+	github.com/google/btree v1.0.1 // indirect
+	github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect
+	github.com/google/uuid v1.6.0 // indirect
+	github.com/gorilla/websocket v1.5.0 // indirect
+	github.com/grpc-ecosystem/go-grpc-middleware v1.3.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/hashicorp/errwrap v1.1.0 // indirect
+	github.com/hashicorp/go-multierror v1.1.1 // indirect
+	github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect
+	github.com/jackc/chunkreader/v2 v2.0.1 // indirect
+	github.com/jackc/pgconn v1.14.3 // indirect
+	github.com/jackc/pgerrcode v0.0.0-20240316143900-6e2875d9b438 // indirect
+	github.com/jackc/pgio v1.0.0 // indirect
+	github.com/jackc/pgpassfile v1.0.0 // indirect
+	github.com/jackc/pgproto3/v2 v2.3.3 // indirect
+	github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a // indirect
+	github.com/jackc/pgtype v1.14.0 // indirect
+	github.com/jackc/pgx/v4 v4.18.2 // indirect
+	github.com/jackc/pgx/v5 v5.5.4 // indirect
+	github.com/jackc/puddle/v2 v2.2.1 // indirect
+	github.com/jessevdk/go-flags v1.4.0 // indirect
+	github.com/jonboulle/clockwork v0.2.2 // indirect
+	github.com/jrick/logrotate v1.1.2 // indirect
+	github.com/json-iterator/go v1.1.11 // indirect
+	github.com/juju/clock v1.1.1 // indirect
+	github.com/juju/errors v1.0.0 // indirect
+	github.com/juju/loggo v1.0.0 // indirect
+	github.com/juju/testing v1.0.2 // indirect
+	github.com/juju/utils/v3 v3.2.0 // indirect
+	github.com/kkdai/bstream v1.0.0 // indirect
+	github.com/klauspost/compress v1.17.9 // indirect
+	github.com/lib/pq v1.10.9 // indirect
+	github.com/lightninglabs/gozmq v0.0.0-20191113021534-d20a764486bf // indirect
+	github.com/lightninglabs/neutrino v0.16.1 // indirect
+	github.com/lightninglabs/neutrino/cache v1.1.2 // indirect
+	github.com/lightningnetwork/lightning-onion v1.2.1-0.20240712235311-98bd56499dfb // indirect
+	github.com/lightningnetwork/lnd/clock v1.1.1 // indirect
+	github.com/lightningnetwork/lnd/fn/v2 v2.0.8 // indirect
+	github.com/lightningnetwork/lnd/healthcheck v1.2.6 // indirect
+	github.com/lightningnetwork/lnd/kvdb v1.4.15 // indirect
+	github.com/lightningnetwork/lnd/queue v1.1.1 // indirect
+	github.com/lightningnetwork/lnd/sqldb v1.0.9 // indirect
+	github.com/lightningnetwork/lnd/ticker v1.1.1 // indirect
+	github.com/lightningnetwork/lnd/tlv v1.3.0 // indirect
+	github.com/lightningnetwork/lnd/tor v1.1.6 // indirect
+	github.com/ltcsuite/ltcd v0.0.0-20190101042124-f37f8bf35796 // indirect
+	github.com/mattn/go-isatty v0.0.20 // indirect
+	github.com/matttproud/golang_protobuf_extensions v1.0.1 // indirect
+	github.com/miekg/dns v1.1.43 // indirect
+	github.com/moby/docker-image-spec v1.3.1 // indirect
+	github.com/moby/sys/user v0.3.0 // indirect
+	github.com/moby/term v0.5.0 // indirect
+	github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
+	github.com/modern-go/reflect2 v1.0.1 // 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/runc v1.2.0 // indirect
+	github.com/ory/dockertest/v3 v3.10.0 // indirect
+	github.com/pkg/errors v0.9.1 // indirect
+	github.com/pmezard/go-difflib v1.0.0 // indirect
+	github.com/prometheus/client_golang v1.11.1 // indirect
+	github.com/prometheus/client_model v0.2.0 // indirect
+	github.com/prometheus/common v0.26.0 // indirect
+	github.com/prometheus/procfs v0.6.0 // indirect
+	github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect
+	github.com/rogpeppe/fastuuid v1.2.0 // indirect
+	github.com/sirupsen/logrus v1.9.3 // indirect
+	github.com/soheilhy/cmux v0.1.5 // indirect
+	github.com/spf13/pflag v1.0.5 // indirect
+	github.com/stretchr/objx v0.5.2 // indirect
+	github.com/stretchr/testify v1.10.0 // indirect
+	github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 // indirect
+	github.com/tmc/grpc-websocket-proxy v0.0.0-20201229170055-e5319fda7802 // indirect
+	github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f // indirect
+	github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect
+	github.com/xeipuuv/gojsonschema v1.2.0 // indirect
+	github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8 // indirect
+	github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2 // indirect
+	go.etcd.io/bbolt v1.3.11 // indirect
+	go.etcd.io/etcd/api/v3 v3.5.12 // indirect
+	go.etcd.io/etcd/client/pkg/v3 v3.5.12 // indirect
+	go.etcd.io/etcd/client/v2 v2.305.12 // indirect
+	go.etcd.io/etcd/client/v3 v3.5.12 // indirect
+	go.etcd.io/etcd/pkg/v3 v3.5.12 // indirect
+	go.etcd.io/etcd/raft/v3 v3.5.12 // indirect
+	go.etcd.io/etcd/server/v3 v3.5.12 // indirect
+	go.opentelemetry.io/auto/sdk v1.1.0 // indirect
+	go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.46.0 // indirect
+	go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.60.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/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.uber.org/atomic v1.7.0 // indirect
+	go.uber.org/multierr v1.6.0 // indirect
+	go.uber.org/zap v1.17.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.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.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/macaroon.v2 v2.0.0 // indirect
+	gopkg.in/natefinch/lumberjack.v2 v2.0.0 // indirect
+	gopkg.in/yaml.v2 v2.4.0 // indirect
+	gopkg.in/yaml.v3 v3.0.1 // indirect
+	modernc.org/gc/v3 v3.0.0-20240107210532-573471604cb6 // indirect
+	modernc.org/libc v1.55.3 // indirect
+	modernc.org/mathutil v1.6.0 // indirect
+	modernc.org/memory v1.8.0 // indirect
+	modernc.org/sqlite v1.29.10 // indirect
+	modernc.org/strutil v1.2.0 // indirect
+	modernc.org/token v1.1.0 // indirect
+	pgregory.net/rapid v1.2.0 // indirect
+	sigs.k8s.io/yaml v1.2.0 // indirect
+)
diff --git a/taprpc/go.sum b/taprpc/go.sum
new file mode 100644
index 00000000..33e09310
--- /dev/null
+++ b/taprpc/go.sum
@@ -0,0 +1,786 @@
+cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
+cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
+cloud.google.com/go v0.112.0 h1:tpFCD7hpHFlQ8yPwT3x+QeXqc2T6+n6T+hmABHfDUSM=
+cloud.google.com/go/compute v1.25.1 h1:ZRpHJedLtTpKgr3RV1Fx23NuaAEN1Zfx9hw1u4aJdjU=
+cloud.google.com/go/compute v1.25.1/go.mod h1:oopOIR53ly6viBYxaDhBfJwzUAxf1zE//uf3IB011ls=
+cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY=
+cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA=
+dario.cat/mergo v1.0.1 h1:Ra4+bf83h2ztPIQYNP99R6m+Y7KfnARDfID+a+vLl4s=
+dario.cat/mergo v1.0.1/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk=
+github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 h1:L/gRVlceqvL25UVaW/CKtUDjefjrs0SPonmDGUVOYP0=
+github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E=
+github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ=
+github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
+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/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5 h1:TngWCqHvy9oXAN6lEVMRuU21PR1EtLVZJmdB18Gu3Rw=
+github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5/go.mod h1:lmUJ/7eu/Q8D7ML55dXQrVaamCz2vxCfdQBasLZfHKk=
+github.com/aead/chacha20 v0.0.0-20180709150244-8b13a72661da h1:KjTM2ks9d14ZYCvmHS9iAKVt9AyzRSqNU1qabPih5BY=
+github.com/aead/chacha20 v0.0.0-20180709150244-8b13a72661da/go.mod h1:eHEWzANqSiWQsof+nXEI9bUVUyV6F53Fp89EuCh2EAA=
+github.com/aead/siphash v1.0.1 h1:FwHfE/T45KPKYuuSAKyyvE+oPWcaQ+CUmFW0bPlM+kg=
+github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII=
+github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
+github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
+github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
+github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
+github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho=
+github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY=
+github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
+github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
+github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
+github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
+github.com/btcsuite/btcd v0.20.1-beta/go.mod h1:wVuoA8VJLEcwgqHBwHmzLRazpKxTv13Px/pDuV7OomQ=
+github.com/btcsuite/btcd v0.22.0-beta.0.20220111032746-97732e52810c/go.mod h1:tjmYdS6MLJ5/s0Fj4DbLgSbDHbEqLJrtnHecBFkdz5M=
+github.com/btcsuite/btcd v0.23.5-0.20231215221805-96c9fd8078fd/go.mod h1:nm3Bko6zh6bWP60UxwoT5LzdGJsQJaPo6HjduXq9p6A=
+github.com/btcsuite/btcd v0.24.3-0.20250318170759-4f4ea81776d6 h1:8n9k3I7e8DkpdQ5YAP4j8ly/LSsbe6qX9vmVbrUGvVw=
+github.com/btcsuite/btcd v0.24.3-0.20250318170759-4f4ea81776d6/go.mod h1:OmM4kFtB0klaG/ZqT86rQiyw/1iyXlJgc3UHClPhhbs=
+github.com/btcsuite/btcd/btcec/v2 v2.1.0/go.mod h1:2VzYrv4Gm4apmbVVsSq5bqf1Ec8v56E48Vt0Y/umPgA=
+github.com/btcsuite/btcd/btcec/v2 v2.1.3/go.mod h1:ctjw4H1kknNJmRN4iP1R7bTQ+v3GJkZBd6mui8ZsAZE=
+github.com/btcsuite/btcd/btcec/v2 v2.3.4 h1:3EJjcN70HCu/mwqlUsGK8GcNVyLVxFDlWurTXGPFfiQ=
+github.com/btcsuite/btcd/btcec/v2 v2.3.4/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04=
+github.com/btcsuite/btcd/btcutil v1.0.0/go.mod h1:Uoxwv0pqYWhD//tfTiipkxNfdhG9UrLwaeswfjfdF0A=
+github.com/btcsuite/btcd/btcutil v1.1.0/go.mod h1:5OapHB7A2hBBWLm48mmw4MOHNJCcUBTwmWH/0Jn8VHE=
+github.com/btcsuite/btcd/btcutil v1.1.5 h1:+wER79R5670vs/ZusMTF1yTcRYE5GUsFbdjdisflzM8=
+github.com/btcsuite/btcd/btcutil v1.1.5/go.mod h1:PSZZ4UitpLBWzxGd5VGOrLnmOjtPP/a6HaFo12zMs00=
+github.com/btcsuite/btcd/btcutil/psbt v1.1.8 h1:4voqtT8UppT7nmKQkXV+T9K8UyQjKOn2z/ycpmJK8wg=
+github.com/btcsuite/btcd/btcutil/psbt v1.1.8/go.mod h1:kA6FLH/JfUx++j9pYU0pyu+Z8XGBQuuTmuKYUf6q7/U=
+github.com/btcsuite/btcd/chaincfg/chainhash v1.0.0/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc=
+github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc=
+github.com/btcsuite/btcd/chaincfg/chainhash v1.1.0 h1:59Kx4K6lzOW5w6nFlA0v5+lk/6sjybR934QNHSJZPTQ=
+github.com/btcsuite/btcd/chaincfg/chainhash v1.1.0/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc=
+github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f/go.mod h1:TdznJufoqS23FtqVCzL0ZqgP5MqXbb4fg/WgDys70nA=
+github.com/btcsuite/btclog v0.0.0-20241003133417-09c4e92e319c h1:4HxD1lBUGUddhzgaNgrCPsFWd7cGYNpeFUgd9ZIgyM0=
+github.com/btcsuite/btclog v0.0.0-20241003133417-09c4e92e319c/go.mod h1:w7xnGOhwT3lmrS4H3b/D1XAXxvh+tbhUm8xeHN2y3TQ=
+github.com/btcsuite/btclog/v2 v2.0.1-0.20250110154127-3ae4bf1cb318 h1:oCjIcinPt7XQ644MP/22JcjYEC84qRc3bRBH0d7Hhd4=
+github.com/btcsuite/btclog/v2 v2.0.1-0.20250110154127-3ae4bf1cb318/go.mod h1:XItGUfVOxotJL8kkuk2Hj3EVow5KCugXl3wWfQ6K0AE=
+github.com/btcsuite/btcutil v0.0.0-20190425235716-9e5f4b9a998d/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg=
+github.com/btcsuite/btcwallet v0.16.13 h1:JGu+wrihQ0I00ODb3w92JtBPbrHxZhbcvU01O+e+lKw=
+github.com/btcsuite/btcwallet v0.16.13/go.mod h1:H6dfoZcWPonM2wbVsR2ZBY0PKNZKdQyLAmnX8vL9JFA=
+github.com/btcsuite/btcwallet/wallet/txauthor v1.3.5 h1:Rr0njWI3r341nhSPesKQ2JF+ugDSzdPoeckS75SeDZk=
+github.com/btcsuite/btcwallet/wallet/txauthor v1.3.5/go.mod h1:+tXJ3Ym0nlQc/iHSwW1qzjmPs3ev+UVWMbGgfV1OZqU=
+github.com/btcsuite/btcwallet/wallet/txrules v1.2.2 h1:YEO+Lx1ZJJAtdRrjuhXjWrYsmAk26wLTlNzxt2q0lhk=
+github.com/btcsuite/btcwallet/wallet/txrules v1.2.2/go.mod h1:4v+grppsDpVn91SJv+mZT7B8hEV4nSmpREM4I8Uohws=
+github.com/btcsuite/btcwallet/wallet/txsizes v1.2.5 h1:93o5Xz9dYepBP4RMFUc9RGIFXwqP2volSWRkYJFrNtI=
+github.com/btcsuite/btcwallet/wallet/txsizes v1.2.5/go.mod h1:lQ+e9HxZ85QP7r3kdxItkiMSloSLg1PEGis5o5CXUQw=
+github.com/btcsuite/btcwallet/walletdb v1.5.1 h1:HgMhDNCrtEFPC+8q0ei5DQ5U9Tl4RCspA22DEKXlopI=
+github.com/btcsuite/btcwallet/walletdb v1.5.1/go.mod h1:jk/hvpLFINF0C1kfTn0bfx2GbnFT+Nvnj6eblZALfjs=
+github.com/btcsuite/btcwallet/wtxmgr v1.5.6 h1:Zwvr/rrJYdOLqdBCSr4eICEstnEA+NBUvjIWLkrXaYI=
+github.com/btcsuite/btcwallet/wtxmgr v1.5.6/go.mod h1:lzVbDkk/jRao2ib5kge46aLZW1yFc8RFNycdYpnsmZA=
+github.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd h1:R/opQEbFEy9JGkIguV40SvRY1uliPX8ifOvi6ICsFCw=
+github.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd/go.mod h1:HHNXQzUsZCxOoE+CPiyCTO6x34Zs86zZUiwtpXoGdtg=
+github.com/btcsuite/golangcrypto v0.0.0-20150304025918-53f62d9b43e8/go.mod h1:tYvUd8KLhm/oXvUeSEs2VlLghFjQt9+ZaF9ghH0JNjc=
+github.com/btcsuite/goleveldb v0.0.0-20160330041536-7834afc9e8cd/go.mod h1:F+uVaaLLH7j4eDXPRvw78tMflu7Ie2bzYOH4Y8rRKBY=
+github.com/btcsuite/goleveldb v1.0.0/go.mod h1:QiK9vBlgftBg6rWQIj6wFzbPfRjiykIEhBH4obrXJ/I=
+github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc=
+github.com/btcsuite/snappy-go v1.0.0/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc=
+github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792 h1:R8vQdOQdZ9Y3SkEwmHoWBmX1DNXhXZqlTpq6s4tyJGc=
+github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY=
+github.com/btcsuite/winsvc v1.0.0 h1:J9B4L7e3oqhXOcm+2IuNApwzQec85lE+QaikUcCs+dk=
+github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs=
+github.com/cenkalti/backoff/v4 v4.2.1 h1:y4OZtCnogmCPw98Zjyt5a6+QwPLGkiQsYW5oUqylYbM=
+github.com/cenkalti/backoff/v4 v4.2.1/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE=
+github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
+github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
+github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=
+github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
+github.com/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-20240318125728-8a4994d93e50 h1:DBmgJDC9dTfkVyGgipamEh2BpGYxScCH1TOF1LL1cXc=
+github.com/cncf/xds/go v0.0.0-20240318125728-8a4994d93e50/go.mod h1:5e1+Vvlzido69INQaVO6d87Qn543Xr6nooe9Kz7oBFM=
+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=
+github.com/cockroachdb/datadriven v1.0.2/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU=
+github.com/containerd/continuity v0.3.0 h1:nisirsYROK15TAMVukJOUyGJjz4BNQJBVsNvAXZJ/eg=
+github.com/containerd/continuity v0.3.0/go.mod h1:wJEAIwKOm/pBZuBd0JmeTvnLquTB1Ag8espWhkykbPM=
+github.com/coreos/go-semver v0.3.0 h1:wkHLiw0WNATZnSG7epLsujiMCgPAc9xhjJ4tgnAxmfM=
+github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
+github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
+github.com/coreos/go-systemd v0.0.0-20190719114852-fd7a80b32e1f/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
+github.com/coreos/go-systemd/v22 v22.5.0 h1:RrqgGjYQKalulkV8NGVIfkXQf6YYmOyiJKk8iXXhfZs=
+github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
+github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY=
+github.com/creack/pty v1.1.18 h1:n56/Zwd5o6whRC5PMGretI4IdRLlmBXYNjScPaBgsbY=
+github.com/creack/pty v1.1.18/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4=
+github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
+github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc=
+github.com/decred/dcrd/crypto/blake256 v1.0.1 h1:7PltbUIQB7u/FfZ39+DGa/ShuMyJ5ilcvdfma9wOH6Y=
+github.com/decred/dcrd/crypto/blake256 v1.0.1/go.mod h1:2OfgNZ5wDpcsFmHmCK5gZTPcCXqlm2ArzUIkw9czNJo=
+github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1/go.mod h1:hyedUtir6IdtD/7lIxGeCxkaw7y45JueMRL4DIyJDKs=
+github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0 h1:rpfIENRNNilwHwZeG5+P150SMrnNEcHYvcCuK6dPZSg=
+github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0/go.mod h1:v57UDF4pDQJcEfFUCRop3lJL149eHGSe9Jvczhzjo/0=
+github.com/decred/dcrd/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/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-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=
+github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto=
+github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
+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.4 h1:gVPz/FMfvh57HdSJQyvBtF00j8JU4zdyUgIUNhlgg0A=
+github.com/envoyproxy/protoc-gen-validate v1.0.4/go.mod h1:qys6tmnRsYrQqIhm2bvKZH4Blx/1gTIZ2UKVY1M+Yew=
+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=
+github.com/fergusstrange/embedded-postgres v1.25.0/go.mod h1:t/MLs0h9ukYM6FSt99R7InCHs1nW0ordoVCcnzmpTYw=
+github.com/frankban/quicktest v1.2.2 h1:xfmOhhoH5fGPgbEAlhLpJH9p0z/0Qizio9osmvn9IUY=
+github.com/frankban/quicktest v1.2.2/go.mod h1:Qh/WofXFeiAFII1aEBu529AtJo6Zg2VHscnEsbBnJ20=
+github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
+github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
+github.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI=
+github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU=
+github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
+github.com/go-errors/errors v1.0.1 h1:LUHzmkK3GUKUrL/1gfBUxAHzcev3apQlezX/+O7ma6w=
+github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q=
+github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
+github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
+github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY=
+github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
+github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
+github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A=
+github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
+github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY=
+github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
+github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
+github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
+github.com/go-sql-driver/mysql v1.6.0 h1:BCTh4TKNUYmOmMUcQ3IipzF5prigylS7XXjEkfCHuOE=
+github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
+github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
+github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss=
+github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM=
+github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
+github.com/gofrs/uuid v4.0.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM=
+github.com/gofrs/uuid v4.2.0+incompatible h1:yyYWMnhkhrKwwr8gAOcOCYxOOscHgDS9yZgBrnJfGa0=
+github.com/gofrs/uuid v4.2.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM=
+github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
+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/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
+github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
+github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
+github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
+github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
+github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
+github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=
+github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=
+github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=
+github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
+github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
+github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
+github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=
+github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=
+github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM=
+github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
+github.com/google/btree v1.0.1 h1:gK4Kx5IaGY9CD5sPJ36FHiBJ6ZXl0kilRiiCj+jdYp4=
+github.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA=
+github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
+github.com/google/go-cmp v0.2.1-0.20190312032427-6f77996f0c42/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
+github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
+github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
+github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
+github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=
+github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
+github.com/google/pprof v0.0.0-20240409012703-83162a5b38cd h1:gbpYu9NMq8jhDVbvlGkMFWCjLFlqqEZjEmObmhUy6Vo=
+github.com/google/pprof v0.0.0-20240409012703-83162a5b38cd/go.mod h1:kf6iHlnVGwgKolg33glAes7Yg/8iWP8ukqeldJSO7jw=
+github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
+github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4=
+github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ=
+github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
+github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
+github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
+github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc=
+github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
+github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 h1:+9834+KizmvFV7pXQGSXQTsaWhq2GjuNUt0aUU0YBYw=
+github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y=
+github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 h1:Ovs26xHkKqVztRpIrF/92BcuyuQ/YW4NSIpoGtfXNho=
+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.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=
+github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo=
+github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM=
+github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k=
+github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM=
+github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
+github.com/jackc/chunkreader v1.0.0/go.mod h1:RT6O25fNZIuasFJRyZ4R/Y2BbhasbmZXF9QQ7T3kePo=
+github.com/jackc/chunkreader/v2 v2.0.0/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk=
+github.com/jackc/chunkreader/v2 v2.0.1 h1:i+RDz65UE+mmpjTfyz0MoVTnzeYxroil2G82ki7MGG8=
+github.com/jackc/chunkreader/v2 v2.0.1/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk=
+github.com/jackc/pgconn v0.0.0-20190420214824-7e0022ef6ba3/go.mod h1:jkELnwuX+w9qN5YIfX0fl88Ehu4XC3keFuOJJk9pcnA=
+github.com/jackc/pgconn v0.0.0-20190824142844-760dd75542eb/go.mod h1:lLjNuW/+OfW9/pnVKPazfWOgNfH2aPem8YQ7ilXGvJE=
+github.com/jackc/pgconn v0.0.0-20190831204454-2fabfa3c18b7/go.mod h1:ZJKsE/KZfsUgOEh9hBm+xYTstcNHg7UPMVJqRfQxq4s=
+github.com/jackc/pgconn v1.8.0/go.mod h1:1C2Pb36bGIP9QHGBYCjnyhqu7Rv3sGshaQUvmfGIB/o=
+github.com/jackc/pgconn v1.9.0/go.mod h1:YctiPyvzfU11JFxoXokUOOKQXQmDMoJL9vJzHH8/2JY=
+github.com/jackc/pgconn v1.9.1-0.20210724152538-d89c8390a530/go.mod h1:4z2w8XhRbP1hYxkpTuBjTS3ne3J48K83+u0zoyvg2pI=
+github.com/jackc/pgconn v1.14.3 h1:bVoTr12EGANZz66nZPkMInAV/KHD2TxH9npjXXgiB3w=
+github.com/jackc/pgconn v1.14.3/go.mod h1:RZbme4uasqzybK2RK5c65VsHxoyaml09lx3tXOcO/VM=
+github.com/jackc/pgerrcode v0.0.0-20240316143900-6e2875d9b438 h1:Dj0L5fhJ9F82ZJyVOmBx6msDp/kfd1t9GRfny/mfJA0=
+github.com/jackc/pgerrcode v0.0.0-20240316143900-6e2875d9b438/go.mod h1:a/s9Lp5W7n/DD0VrVoyJ00FbP2ytTPDVOivvn2bMlds=
+github.com/jackc/pgio v1.0.0 h1:g12B9UwVnzGhueNavwioyEEpAmqMe1E/BN9ES+8ovkE=
+github.com/jackc/pgio v1.0.0/go.mod h1:oP+2QK2wFfUWgr+gxjoBH9KGBb31Eio69xUb0w5bYf8=
+github.com/jackc/pgmock v0.0.0-20190831213851-13a1b77aafa2/go.mod h1:fGZlG77KXmcq05nJLRkk0+p82V8B8Dw8KN2/V9c/OAE=
+github.com/jackc/pgmock v0.0.0-20201204152224-4fe30f7445fd/go.mod h1:hrBW0Enj2AZTNpt/7Y5rr2xe/9Mn757Wtb2xeBzPv2c=
+github.com/jackc/pgmock v0.0.0-20210724152146-4ad1a8207f65 h1:DadwsjnMwFjfWc9y5Wi/+Zz7xoE5ALHsRQlOctkOiHc=
+github.com/jackc/pgmock v0.0.0-20210724152146-4ad1a8207f65/go.mod h1:5R2h2EEX+qri8jOWMbJCtaPWkrrNc7OHwsp2TCqp7ak=
+github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM=
+github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg=
+github.com/jackc/pgproto3 v1.1.0/go.mod h1:eR5FA3leWg7p9aeAqi37XOTgTIbkABlvcPB3E5rlc78=
+github.com/jackc/pgproto3/v2 v2.0.0-alpha1.0.20190420180111-c116219b62db/go.mod h1:bhq50y+xrl9n5mRYyCBFKkpRVTLYJVWeCc+mEAI3yXA=
+github.com/jackc/pgproto3/v2 v2.0.0-alpha1.0.20190609003834-432c2951c711/go.mod h1:uH0AWtUmuShn0bcesswc4aBTWGvw0cAxIJp+6OB//Wg=
+github.com/jackc/pgproto3/v2 v2.0.0-rc3/go.mod h1:ryONWYqW6dqSg1Lw6vXNMXoBJhpzvWKnT95C46ckYeM=
+github.com/jackc/pgproto3/v2 v2.0.0-rc3.0.20190831210041-4c03ce451f29/go.mod h1:ryONWYqW6dqSg1Lw6vXNMXoBJhpzvWKnT95C46ckYeM=
+github.com/jackc/pgproto3/v2 v2.0.6/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA=
+github.com/jackc/pgproto3/v2 v2.1.1/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA=
+github.com/jackc/pgproto3/v2 v2.3.3 h1:1HLSx5H+tXR9pW3in3zaztoEwQYRC9SQaYUHjTSUOag=
+github.com/jackc/pgproto3/v2 v2.3.3/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA=
+github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b/go.mod h1:vsD4gTJCa9TptPL8sPkXrLZ+hDuNrZCnj29CQpr4X1E=
+github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a h1:bbPeKD0xmW/Y25WS6cokEszi5g+S0QxI/d45PkRi7Nk=
+github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM=
+github.com/jackc/pgtype v0.0.0-20190421001408-4ed0de4755e0/go.mod h1:hdSHsc1V01CGwFsrv11mJRHWJ6aifDLfdV3aVjFF0zg=
+github.com/jackc/pgtype v0.0.0-20190824184912-ab885b375b90/go.mod h1:KcahbBH1nCMSo2DXpzsoWOAfFkdEtEJpPbVLq8eE+mc=
+github.com/jackc/pgtype v0.0.0-20190828014616-a8802b16cc59/go.mod h1:MWlu30kVJrUS8lot6TQqcg7mtthZ9T0EoIBFiJcmcyw=
+github.com/jackc/pgtype v1.8.1-0.20210724151600-32e20a603178/go.mod h1:C516IlIV9NKqfsMCXTdChteoXmwgUceqaLfjg2e3NlM=
+github.com/jackc/pgtype v1.14.0 h1:y+xUdabmyMkJLyApYuPj38mW+aAIqCe5uuBB51rH3Vw=
+github.com/jackc/pgtype v1.14.0/go.mod h1:LUMuVrfsFfdKGLw+AFFVv6KtHOFMwRgDDzBt76IqCA4=
+github.com/jackc/pgx/v4 v4.0.0-20190420224344-cc3461e65d96/go.mod h1:mdxmSJJuR08CZQyj1PVQBHy9XOp5p8/SHH6a0psbY9Y=
+github.com/jackc/pgx/v4 v4.0.0-20190421002000-1b8f0016e912/go.mod h1:no/Y67Jkk/9WuGR0JG/JseM9irFbnEPbuWV2EELPNuM=
+github.com/jackc/pgx/v4 v4.0.0-pre1.0.20190824185557-6972a5742186/go.mod h1:X+GQnOEnf1dqHGpw7JmHqHc1NxDoalibchSk9/RWuDc=
+github.com/jackc/pgx/v4 v4.12.1-0.20210724153913-640aa07df17c/go.mod h1:1QD0+tgSXP7iUjYm9C1NxKhny7lq6ee99u/z+IHFcgs=
+github.com/jackc/pgx/v4 v4.18.2 h1:xVpYkNR5pk5bMCZGfClbO962UIqVABcAGt7ha1s/FeU=
+github.com/jackc/pgx/v4 v4.18.2/go.mod h1:Ey4Oru5tH5sB6tV7hDmfWFahwF15Eb7DNXlRKx2CkVw=
+github.com/jackc/pgx/v5 v5.5.4 h1:Xp2aQS8uXButQdnCMWNmvx6UysWQQC+u1EoizjguY+8=
+github.com/jackc/pgx/v5 v5.5.4/go.mod h1:ez9gk+OAat140fv9ErkZDYFWmXLfV+++K0uAOiwgm1A=
+github.com/jackc/puddle v0.0.0-20190413234325-e4ced69a3a2b/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk=
+github.com/jackc/puddle v0.0.0-20190608224051-11cab39313c9/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk=
+github.com/jackc/puddle v1.1.3/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk=
+github.com/jackc/puddle/v2 v2.2.1 h1:RhxXJtFG022u4ibrCSMSiu5aOq1i77R3OHKNJj77OAk=
+github.com/jackc/puddle/v2 v2.2.1/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4=
+github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI=
+github.com/jessevdk/go-flags v1.4.0 h1:4IU2WS7AumrZ/40jfhf4QVDMsQwqA7VEHozFRrGARJA=
+github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI=
+github.com/jonboulle/clockwork v0.2.2 h1:UOGuzwb1PwsrDAObMuhUnj0p5ULPj8V/xJ7Kx9qUBdQ=
+github.com/jonboulle/clockwork v0.2.2/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8=
+github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4=
+github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ=
+github.com/jrick/logrotate v1.1.2 h1:6ePk462NCX7TfKtNp5JJ7MbA2YIslkpfgP03TlTYMN0=
+github.com/jrick/logrotate v1.1.2/go.mod h1:f9tdWggSVK3iqavGpyvegq5IhNois7KXmasU6/N96OQ=
+github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
+github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
+github.com/json-iterator/go v1.1.11 h1:uVUAXhF2To8cbw/3xN3pxj6kk7TYKs98NIrTqPlMWAQ=
+github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
+github.com/juju/ansiterm v0.0.0-20180109212912-720a0952cc2a/go.mod h1:UJSiEoRfvx3hP73CvoARgeLjaIOjybY9vj8PUPPFGeU=
+github.com/juju/clock v1.1.1 h1:NvgHG9DQmOpBevgt6gzkyimdWBooLXDy1cQn89qJzBI=
+github.com/juju/clock v1.1.1/go.mod h1:HIBvJ8kiV/n7UHwKuCkdYL4l/MDECztHR2sAvWDxxf0=
+github.com/juju/errors v1.0.0 h1:yiq7kjCLll1BiaRuNY53MGI0+EQ3rF6GB+wvboZDefM=
+github.com/juju/errors v1.0.0/go.mod h1:B5x9thDqx0wIMH3+aLIMP9HjItInYWObRovoCFM5Qe8=
+github.com/juju/loggo v1.0.0 h1:Y6ZMQOGR9Aj3BGkiWx7HBbIx6zNwNkxhVNOHU2i1bl0=
+github.com/juju/loggo v1.0.0/go.mod h1:NIXFioti1SmKAlKNuUwbMenNdef59IF52+ZzuOmHYkg=
+github.com/juju/testing v1.0.2 h1:OR90RqCd9CJONxXamZAjLknpZdtqDyxqW8IwCbgw3i4=
+github.com/juju/testing v1.0.2/go.mod h1:h3Vd2rzB57KrdsBEy6R7bmSKPzP76BnNavt7i8PerwQ=
+github.com/juju/utils/v3 v3.2.0 h1:RkEgTHbrPoOqTuOSaob52B1gLkpeMLd5fZj/4kFzb1k=
+github.com/juju/utils/v3 v3.2.0/go.mod h1:nAj3sHtdYfAkvnkqttTy3Xzm2HzkD9Hfgnc+upOW2Z8=
+github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
+github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM=
+github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
+github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
+github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4=
+github.com/kkdai/bstream v1.0.0 h1:Se5gHwgp2VT2uHfDrkbbgbgEvV9cimLELwrPJctSjg8=
+github.com/kkdai/bstream v1.0.0/go.mod h1:FDnDOHt5Yx4p3FaHcioFT0QjDOtgUpvjeZqAs+NVZZA=
+github.com/klauspost/compress v1.17.9 h1:6KIumPrER1LHsvBVuDa0r5xaG0Es51mhhB9BQB2qeMA=
+github.com/klauspost/compress v1.17.9/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw=
+github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
+github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
+github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
+github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
+github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
+github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
+github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
+github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
+github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw=
+github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
+github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
+github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
+github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
+github.com/lib/pq v1.1.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
+github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
+github.com/lib/pq v1.10.2/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
+github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw=
+github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
+github.com/lightninglabs/gozmq v0.0.0-20191113021534-d20a764486bf h1:HZKvJUHlcXI/f/O0Avg7t8sqkPo78HFzjmeYFl6DPnc=
+github.com/lightninglabs/gozmq v0.0.0-20191113021534-d20a764486bf/go.mod h1:vxmQPeIQxPf6Jf9rM8R+B4rKBqLA2AjttNxkFBL2Plk=
+github.com/lightninglabs/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/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=
+github.com/lightningnetwork/lnd v0.19.0-beta.rc2.0.20250423092132-a35ace7371af/go.mod h1:nCkZ6G6twxDKn31117M0BNfN5JSAmJVAHNTwYrn31BQ=
+github.com/lightningnetwork/lnd/clock v1.1.1 h1:OfR3/zcJd2RhH0RU+zX/77c0ZiOnIMsDIBjgjWdZgA0=
+github.com/lightningnetwork/lnd/clock v1.1.1/go.mod h1:mGnAhPyjYZQJmebS7aevElXKTFDuO+uNFFfMXK1W8xQ=
+github.com/lightningnetwork/lnd/fn/v2 v2.0.8 h1:r2SLz7gZYQPVc3IZhU82M66guz3Zk2oY+Rlj9QN5S3g=
+github.com/lightningnetwork/lnd/fn/v2 v2.0.8/go.mod h1:TOzwrhjB/Azw1V7aa8t21ufcQmdsQOQMDtxVOQWNl8s=
+github.com/lightningnetwork/lnd/healthcheck v1.2.6 h1:1sWhqr93GdkWy4+6U7JxBfcyZIE78MhIHTJZfPx7qqI=
+github.com/lightningnetwork/lnd/healthcheck v1.2.6/go.mod h1:Mu02um4CWY/zdTOvFje7WJgJcHyX2zq/FG3MhOAiGaQ=
+github.com/lightningnetwork/lnd/kvdb v1.4.15 h1:3eN6uGcubvGB5itPp1D0D4uEEkIMYht3w0LDnqLzAWI=
+github.com/lightningnetwork/lnd/kvdb v1.4.15/go.mod h1:HW+bvwkxNaopkz3oIgBV6NEnV4jCEZCACFUcNg4xSjM=
+github.com/lightningnetwork/lnd/queue v1.1.1 h1:99ovBlpM9B0FRCGYJo6RSFDlt8/vOkQQZznVb18iNMI=
+github.com/lightningnetwork/lnd/queue v1.1.1/go.mod h1:7A6nC1Qrm32FHuhx/mi1cieAiBZo5O6l8IBIoQxvkz4=
+github.com/lightningnetwork/lnd/sqldb v1.0.9 h1:7OHi+Hui823mB/U9NzCdlZTAGSVdDCbjp33+6d/Q+G0=
+github.com/lightningnetwork/lnd/sqldb v1.0.9/go.mod h1:OG09zL/PHPaBJefp4HsPz2YLUJ+zIQHbpgCtLnOx8I4=
+github.com/lightningnetwork/lnd/ticker v1.1.1 h1:J/b6N2hibFtC7JLV77ULQp++QLtCwT6ijJlbdiZFbSM=
+github.com/lightningnetwork/lnd/ticker v1.1.1/go.mod h1:waPTRAAcwtu7Ji3+3k+u/xH5GHovTsCoSVpho0KDvdA=
+github.com/lightningnetwork/lnd/tlv v1.3.0 h1:exS/KCPEgpOgviIttfiXAPaUqw2rHQrnUOpP7HPBPiY=
+github.com/lightningnetwork/lnd/tlv v1.3.0/go.mod h1:pJuiBj1ecr1WWLOtcZ+2+hu9Ey25aJWFIsjmAoPPnmc=
+github.com/lightningnetwork/lnd/tor v1.1.6 h1:WHUumk7WgU6BUFsqHuqszI9P6nfhMeIG+rjJBlVE6OE=
+github.com/lightningnetwork/lnd/tor v1.1.6/go.mod h1:qSRB8llhAK+a6kaTPWOLLXSZc6Hg8ZC0mq1sUQ/8JfI=
+github.com/ltcsuite/ltcd v0.0.0-20190101042124-f37f8bf35796 h1:sjOGyegMIhvgfq5oaue6Td+hxZuf3tDC8lAPrFldqFw=
+github.com/ltcsuite/ltcd v0.0.0-20190101042124-f37f8bf35796/go.mod h1:3p7ZTf9V1sNPI5H8P3NkTFF4LuwMdPl2DodF60qAKqY=
+github.com/ltcsuite/ltcutil v0.0.0-20181217130922-17f3b04680b6/go.mod h1:8Vg/LTOO0KYa/vlHWJ6XZAevPQThGH5sufO0Hrou/lA=
+github.com/lunixbochs/vtclean v0.0.0-20160125035106-4fbf7632a2c6/go.mod h1:pHhQNgMf3btfWnGBVipUOjRYhoOsdGqdm/+2c2E2WMI=
+github.com/mattn/go-colorable v0.0.6/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
+github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ=
+github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
+github.com/mattn/go-isatty v0.0.0-20160806122752-66b8e73f3f5c/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
+github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
+github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
+github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
+github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
+github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
+github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU=
+github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
+github.com/miekg/dns v1.1.43 h1:JKfpVSCB84vrAmHzyrsxB5NAr5kLoMXZArPSw7Qlgyg=
+github.com/miekg/dns v1.1.43/go.mod h1:+evo5L0630/F6ca/Z9+GAqzhjGyn8/c+TBaOyfEl0V4=
+github.com/moby/docker-image-spec v1.3.1 h1:jMKff3w6PgbfSa69GfNg+zN/XLhfXJGnEx3Nl2EsFP0=
+github.com/moby/docker-image-spec v1.3.1/go.mod h1:eKmb5VW8vQEh/BAr2yvVNvuiJuY6UIocYsFu/DxxRpo=
+github.com/moby/sys/user v0.3.0 h1:9ni5DlcW5an3SvRSx4MouotOygvzaXbaSrc/wGDFWPo=
+github.com/moby/sys/user v0.3.0/go.mod h1:bG+tYYYJgaMtRKgEmuueC0hJEAZWwtIbZTB+85uoHjs=
+github.com/moby/term v0.5.0 h1:xt8Q1nalod/v7BqbG21f8mQPqH+xAaC9C3N3wfWbVP0=
+github.com/moby/term v0.5.0/go.mod h1:8FzsFHVUBGZdbDsJw/ot+X+d5HLUbvklYLJ9uGfcI3Y=
+github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
+github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=
+github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
+github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
+github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI=
+github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
+github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A=
+github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc=
+github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
+github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
+github.com/ncruces/go-strftime v0.1.9 h1:bY0MQC28UADQmHmaF5dgpLmImcShSi2kHU9XLdhx/f4=
+github.com/ncruces/go-strftime v0.1.9/go.mod h1:Fwc5htZGVVkseilnfgOVb9mKy6w1naJmn9CehxcKcls=
+github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A=
+github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE=
+github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU=
+github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
+github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
+github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk=
+github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY=
+github.com/onsi/ginkgo v1.16.4 h1:29JGrr5oVBm5ulCWet69zQkzWipVXIol6ygQUe/EzNc=
+github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0=
+github.com/onsi/gomega v1.4.1/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA=
+github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
+github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=
+github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=
+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/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=
+github.com/ory/dockertest/v3 v3.10.0 h1:4K3z2VMe8Woe++invjaTB7VRyQXQy5UY+loujO4aNE4=
+github.com/ory/dockertest/v3 v3.10.0/go.mod h1:nr57ZbRWMqfsdGdFNLHz5jjNdDb7VVFnzAeW1n5N1Lg=
+github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
+github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
+github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
+github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
+github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
+github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
+github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
+github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=
+github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M=
+github.com/prometheus/client_golang v1.11.1 h1:+4eQaD7vAZ6DsfsxB15hbE0odUjGI5ARs9yskGu1v4s=
+github.com/prometheus/client_golang v1.11.1/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0=
+github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
+github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
+github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
+github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M=
+github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
+github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
+github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo=
+github.com/prometheus/common v0.26.0 h1:iMAkS2TDoNWnKM+Kopnx/8tnEStIfpYA0ur0xQzzhMQ=
+github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc=
+github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
+github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
+github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=
+github.com/prometheus/procfs v0.6.0 h1:mxy4L2jP6qMonqmq+aTtOx1ifVWUgG/TAmntgbh3xv4=
+github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=
+github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE=
+github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo=
+github.com/rogpeppe/fastuuid v1.2.0 h1:Ppwyp6VYCF1nvBTXL3trRso7mXMlRrw9ooo375wvi2s=
+github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ=
+github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
+github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII=
+github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o=
+github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ=
+github.com/rs/zerolog v1.13.0/go.mod h1:YbFCdg8HfsridGWAh22vktObvhZbQsZXe4/zB0OKkWU=
+github.com/rs/zerolog v1.15.0/go.mod h1:xYTKnLHcpfU2225ny5qZjxnj9NvkumZYjJHlAThCjNc=
+github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0=
+github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4=
+github.com/shopspring/decimal v1.2.0 h1:abSATXmQEYyShuxI4/vyW3tV1MrKAJzCZ/0zLUXYbsQ=
+github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o=
+github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
+github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q=
+github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
+github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88=
+github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ=
+github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
+github.com/soheilhy/cmux v0.1.5 h1:jjzc5WVemNEDTLwv9tlmemhC73tI08BNOIGwBOo10Js=
+github.com/soheilhy/cmux v0.1.5/go.mod h1:T7TcVDs9LWfQgPlPsdngu6I6QIoyIFZDDC6sNE1GqG0=
+github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
+github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
+github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
+github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
+github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE=
+github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY=
+github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=
+github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
+github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
+github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
+github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
+github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
+github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA=
+github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
+github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 h1:epCh84lMvA70Z7CTTCmYQn2CKbY8j86K7/FAIr141uY=
+github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7/go.mod h1:q4W45IWZaF22tdD+VEXcAWRA037jwmWEB5VWYORlTpc=
+github.com/tmc/grpc-websocket-proxy v0.0.0-20201229170055-e5319fda7802 h1:uruHq4dN7GR16kFc5fp3d1RIYzJW5onx8Ybykw2YQFA=
+github.com/tmc/grpc-websocket-proxy v0.0.0-20201229170055-e5319fda7802/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
+github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f h1:J9EGpcZtP0E/raorCMxlFGSTBrsSlaDGf3jU/qvAE2c=
+github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU=
+github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 h1:EzJWgHovont7NscjpAxXsDA8S8BMYve8Y5+7cuRE7R0=
+github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ=
+github.com/xeipuuv/gojsonschema v1.2.0 h1:LhYJRs+L4fBtjZUfuSZIKGeVu0QRy8e5Xi7D17UxZ74=
+github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y=
+github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8 h1:nIPpBwaJSVYIxUFsDv3M8ofmx9yWTog9BfvIu0q41lo=
+github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8/go.mod h1:HUYIGzjTL3rfEspMxjDjgmT5uz5wzYJKVo23qUhYTos=
+github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2 h1:eY9dn8+vbi4tKz5Qo6v2eYzo7kUS51QINcR5jNpbZS8=
+github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU=
+github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
+github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
+github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q=
+go.etcd.io/bbolt v1.3.11 h1:yGEzV1wPz2yVCLsD8ZAiGHhHVlczyC9d1rP43/VCRJ0=
+go.etcd.io/bbolt v1.3.11/go.mod h1:dksAq7YMXoljX0xu6VF5DMZGbhYYoLUalEiSySYAS4I=
+go.etcd.io/etcd/api/v3 v3.5.12 h1:W4sw5ZoU2Juc9gBWuLk5U6fHfNVyY1WC5g9uiXZio/c=
+go.etcd.io/etcd/api/v3 v3.5.12/go.mod h1:Ot+o0SWSyT6uHhA56al1oCED0JImsRiU9Dc26+C2a+4=
+go.etcd.io/etcd/client/pkg/v3 v3.5.12 h1:EYDL6pWwyOsylrQyLp2w+HkQ46ATiOvoEdMarindU2A=
+go.etcd.io/etcd/client/pkg/v3 v3.5.12/go.mod h1:seTzl2d9APP8R5Y2hFL3NVlD6qC/dOT+3kvrqPyTas4=
+go.etcd.io/etcd/client/v2 v2.305.12 h1:0m4ovXYo1CHaA/Mp3X/Fak5sRNIWf01wk/X1/G3sGKI=
+go.etcd.io/etcd/client/v2 v2.305.12/go.mod h1:aQ/yhsxMu+Oht1FOupSr60oBvcS9cKXHrzBpDsPTf9E=
+go.etcd.io/etcd/client/v3 v3.5.12 h1:v5lCPXn1pf1Uu3M4laUE2hp/geOTc5uPcYYsNe1lDxg=
+go.etcd.io/etcd/client/v3 v3.5.12/go.mod h1:tSbBCakoWmmddL+BKVAJHa9km+O/E+bumDe9mSbPiqw=
+go.etcd.io/etcd/pkg/v3 v3.5.12 h1:OK2fZKI5hX/+BTK76gXSTyZMrbnARyX9S643GenNGb8=
+go.etcd.io/etcd/pkg/v3 v3.5.12/go.mod h1:UVwg/QIMoJncyeb/YxvJBJCE/NEwtHWashqc8A1nj/M=
+go.etcd.io/etcd/raft/v3 v3.5.12 h1:7r22RufdDsq2z3STjoR7Msz6fYH8tmbkdheGfwJNRmU=
+go.etcd.io/etcd/raft/v3 v3.5.12/go.mod h1:ERQuZVe79PI6vcC3DlKBukDCLja/L7YMu29B74Iwj4U=
+go.etcd.io/etcd/server/v3 v3.5.12 h1:EtMjsbfyfkwZuA2JlKOiBfuGkFCekv5H178qjXypbG8=
+go.etcd.io/etcd/server/v3 v3.5.12/go.mod h1:axB0oCjMy+cemo5290/CutIjoxlfA6KVYKD1w0uue10=
+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.0 h1:PzIubN4/sjByhDRHLviCjJuweBXWFZWhghjg7cS28+M=
+go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.46.0/go.mod h1:Ct6zzQEuGK3WpJs2n4dn+wfJYzd/+hNnxMRTWjGn30M=
+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/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=
+go.opentelemetry.io/otel/metric v1.35.0/go.mod h1:nKVFgxBZ2fReX6IlyW28MgZojkoAkJGaE8CpgeAU3oE=
+go.opentelemetry.io/otel/sdk v1.35.0 h1:iPctf8iprVySXSKJffSS79eOjl9pvxV9ZqOWT0QejKY=
+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.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=
+go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ=
+go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw=
+go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
+go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
+go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=
+go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0=
+go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4=
+go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU=
+go.uber.org/multierr v1.6.0 h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4=
+go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU=
+go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA=
+go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
+go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
+go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM=
+go.uber.org/zap v1.17.0 h1:MTjgFu6ZLKvY6Pvaqk97GlxNBuMpV4Hy/3P6tRGlI2U=
+go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo=
+golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
+golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
+golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
+golang.org/x/crypto v0.0.0-20190411191339-88737f569e3a/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE=
+golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
+golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
+golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
+golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
+golang.org/x/crypto v0.0.0-20201203163018-be400aefbc4c/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I=
+golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
+golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
+golang.org/x/crypto v0.36.0 h1:AnAEvhDddvBdpY+uR+MyHmuZzzNqXSe/GvuDeob5L34=
+golang.org/x/crypto v0.36.0/go.mod h1:Y4J0ReaxCR1IMaabaSMugxJES1EpwhBHhv2bDHklZvc=
+golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
+golang.org/x/exp v0.0.0-20240325151524-a685a6edb6d8 h1:aAcj0Da7eBAtrTp03QXWvm88pSyOt+UgdZw2BFZ+lEw=
+golang.org/x/exp v0.0.0-20240325151524-a685a6edb6d8/go.mod h1:CQ1k9gNrJ50XIzaKCRR2hssIjF07kZFEiieALBM/ARQ=
+golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
+golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
+golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
+golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
+golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=
+golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
+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.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=
+golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
+golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
+golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
+golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
+golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
+golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
+golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
+golang.org/x/net v0.38.0 h1:vRMAPTMaeGqVhG5QyLJHqNDwecKTomGeqbnfZyKlBI8=
+golang.org/x/net v0.38.0/go.mod h1:ivrbrMbzFq5J41QOQh0siUuly180yBYtLp+CKbEaFx8=
+golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
+golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
+golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
+golang.org/x/oauth2 v0.20.0 h1:4mQdhULixXKP1rwYBW0vAijoXnkTG0BLCDRzfe1idMo=
+golang.org/x/oauth2 v0.20.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI=
+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=
+golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.12.0 h1:MHc5BpPuC30uJk597Ri8TV3CNZcTLu6B6z4lJy+g6Jw=
+golang.org/x/sync v0.12.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
+golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200814200057-3d37ad5750ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.31.0 h1:ioabZlmFYtWhL+TRYpcnNlLwhyxaM9kWTDEmfnprqik=
+golang.org/x/sys v0.31.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
+golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
+golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
+golang.org/x/term v0.30.0 h1:PQ39fJZ+mfadBm0y5WlL4vlM7Sx1Hgf13sMIY2+QS9Y=
+golang.org/x/term v0.30.0/go.mod h1:NYYFdzHoI5wRh/h5tDMdMqCqPJZEuNqVR5xJLd/n67g=
+golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
+golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
+golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/text v0.23.0 h1:D71I7dUrlY+VX0gQShAThNGHFxZ13dGLBHQLVl1mJlY=
+golang.org/x/text v0.23.0/go.mod h1:/BLNzu4aZCJ1+kcD0DNRotWKage4q2rGVAg4o22unh4=
+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/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=
+golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
+golang.org/x/tools v0.0.0-20190425163242-31fd60d6bfdc/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
+golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
+golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
+golang.org/x/tools v0.0.0-20190823170909-c4a336ef6a2f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
+golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
+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=
+golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
+google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
+google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
+google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
+google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+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.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
+google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=
+google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
+google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk=
+google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0=
+google.golang.org/grpc v1.64.1 h1:LKtvyfbX3UGVPFcGqJ9ItpVWW6oN/2XqTxfAnwRRXiA=
+google.golang.org/grpc v1.64.1/go.mod h1:hiQF4LFZelK2WKaP6W0L92zGHtiQdZxk8CrSdvyjeP0=
+google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
+google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
+google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
+google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=
+google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=
+google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
+google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
+google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg=
+google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw=
+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=
+gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
+gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
+gopkg.in/errgo.v1 v1.0.1 h1:oQFRXzZ7CkBGdm1XZm/EbQYaYNNEElNBOd09M6cqNso=
+gopkg.in/errgo.v1 v1.0.1/go.mod h1:3NjfXwocQRYAPTq4/fzX+CwUhPRcR/azYRhj8G+LqMo=
+gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
+gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
+gopkg.in/inconshreveable/log15.v2 v2.0.0-20180818164646-67afb5ed74ec/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s=
+gopkg.in/macaroon-bakery.v2 v2.1.0 h1:9Jw/+9XHBSutkaeVpWhDx38IcSNLJwWUICkOK98DHls=
+gopkg.in/macaroon-bakery.v2 v2.1.0/go.mod h1:B4/T17l+ZWGwxFSZQmlBwp25x+og7OkhETfr3S9MbIA=
+gopkg.in/macaroon.v2 v2.0.0 h1:LVWycAfeJBUjCIqfR9gqlo7I8vmiXRr51YEOZ1suop8=
+gopkg.in/macaroon.v2 v2.0.0/go.mod h1:+I6LnTMkm/uV5ew/0nsulNjL16SK4+C8yDmRUzHR17I=
+gopkg.in/natefinch/lumberjack.v2 v2.0.0 h1:1Lc07Kr7qY4U2YPouBjpCLxpiyxIVoxqXgkXLknAOE8=
+gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k=
+gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ=
+gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
+gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
+gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
+gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
+gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
+gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
+gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
+gotest.tools/v3 v3.3.0 h1:MfDY1b1/0xN1CyMlQDac0ziEy9zJQd9CXBRRDHw2jJo=
+gotest.tools/v3 v3.3.0/go.mod h1:Mcr9QNxkg0uMvy/YElmo4SpXgJKWgQvYrT7Kw5RzJ1A=
+honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
+honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
+honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=
+modernc.org/cc/v4 v4.21.4 h1:3Be/Rdo1fpr8GrQ7IVw9OHtplU4gWbb+wNgeoBMmGLQ=
+modernc.org/cc/v4 v4.21.4/go.mod h1:HM7VJTZbUCR3rV8EYBi9wxnJ0ZBRiGE5OeGXNA0IsLQ=
+modernc.org/ccgo/v4 v4.19.2 h1:lwQZgvboKD0jBwdaeVCTouxhxAyN6iawF3STraAal8Y=
+modernc.org/ccgo/v4 v4.19.2/go.mod h1:ysS3mxiMV38XGRTTcgo0DQTeTmAO4oCmJl1nX9VFI3s=
+modernc.org/fileutil v1.3.0 h1:gQ5SIzK3H9kdfai/5x41oQiKValumqNTDXMvKo62HvE=
+modernc.org/fileutil v1.3.0/go.mod h1:XatxS8fZi3pS8/hKG2GH/ArUogfxjpEKs3Ku3aK4JyQ=
+modernc.org/gc/v2 v2.4.1 h1:9cNzOqPyMJBvrUipmynX0ZohMhcxPtMccYgGOJdOiBw=
+modernc.org/gc/v2 v2.4.1/go.mod h1:wzN5dK1AzVGoH6XOzc3YZ+ey/jPgYHLuVckd62P0GYU=
+modernc.org/gc/v3 v3.0.0-20240107210532-573471604cb6 h1:5D53IMaUuA5InSeMu9eJtlQXS2NxAhyWQvkKEgXZhHI=
+modernc.org/gc/v3 v3.0.0-20240107210532-573471604cb6/go.mod h1:Qz0X07sNOR1jWYCrJMEnbW/X55x206Q7Vt4mz6/wHp4=
+modernc.org/libc v1.55.3 h1:AzcW1mhlPNrRtjS5sS+eW2ISCgSOLLNyFzRh/V3Qj/U=
+modernc.org/libc v1.55.3/go.mod h1:qFXepLhz+JjFThQ4kzwzOjA/y/artDeg+pcYnY+Q83w=
+modernc.org/mathutil v1.6.0 h1:fRe9+AmYlaej+64JsEEhoWuAYBkOtQiMEU7n/XgfYi4=
+modernc.org/mathutil v1.6.0/go.mod h1:Ui5Q9q1TR2gFm0AQRqQUaBWFLAhQpCwNcuhBOSedWPo=
+modernc.org/memory v1.8.0 h1:IqGTL6eFMaDZZhEWwcREgeMXYwmW83LYW8cROZYkg+E=
+modernc.org/memory v1.8.0/go.mod h1:XPZ936zp5OMKGWPqbD3JShgd/ZoQ7899TUuQqxY+peU=
+modernc.org/opt v0.1.3 h1:3XOZf2yznlhC+ibLltsDGzABUGVx8J6pnFMS3E4dcq4=
+modernc.org/opt v0.1.3/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0=
+modernc.org/sortutil v1.2.0 h1:jQiD3PfS2REGJNzNCMMaLSp/wdMNieTbKX920Cqdgqc=
+modernc.org/sortutil v1.2.0/go.mod h1:TKU2s7kJMf1AE84OoiGppNHJwvB753OYfNl2WRb++Ss=
+modernc.org/sqlite v1.29.10 h1:3u93dz83myFnMilBGCOLbr+HjklS6+5rJLx4q86RDAg=
+modernc.org/sqlite v1.29.10/go.mod h1:ItX2a1OVGgNsFh6Dv60JQvGfJfTPHPVpV6DF59akYOA=
+modernc.org/strutil v1.2.0 h1:agBi9dp1I+eOnxXeiZawM8F4LawKv4NzGWSaLfyeNZA=
+modernc.org/strutil v1.2.0/go.mod h1:/mdcBmfOibveCTBxUl5B5l6W+TTH1FXPLHZE6bTosX0=
+modernc.org/token v1.1.0 h1:Xl7Ap9dKaEs5kLoOQeQmPWevfnk/DM5qcLcYlA8ys6Y=
+modernc.org/token v1.1.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM=
+pgregory.net/rapid v1.2.0 h1:keKAYRcjm+e1F0oAuU5F5+YPAWcyxNNRK2wud503Gnk=
+pgregory.net/rapid v1.2.0/go.mod h1:PY5XlDGj0+V1FCq0o192FdRhpKHGTRIWBgqjDBTrq04=
+sigs.k8s.io/yaml v1.2.0 h1:kr/MCeFWJWTwyaHoR9c8EjH9OumOmoF9YGiZd7lFm/Q=
+sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc=
diff --git a/taprpc/mintrpc/mint.pb.go b/taprpc/mintrpc/mint.pb.go
index ac272dd8..3e481ce3 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 616eefd2..9cca70af 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 dd3f653e..60bef4bd 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/perms/perms.go b/taprpc/perms.go
similarity index 99%
rename from perms/perms.go
rename to taprpc/perms.go
index d1b74f7f..6f1bf2b2 100644
--- a/perms/perms.go
+++ b/taprpc/perms.go
@@ -1,4 +1,4 @@
-package perms
+package taprpc
 
 import "gopkg.in/macaroon-bakery.v2/bakery"
 
diff --git a/taprpc/priceoraclerpc/price_oracle.pb.go b/taprpc/priceoraclerpc/price_oracle.pb.go
index 180e51ff..6becebda 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 560a9b81..2f950157 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 fbf0ae6a..985a2a0b 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 d63a4307..57abbcc2 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 5bdff4a1..9270b51a 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 809eec8f..cdf914a3 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 ca89998b..620ca4ed 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 e6a94278..516a96f5 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 c6699e61..59f8792e 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
@@ -750,6 +843,8 @@ type AnchorInfo struct {
 	TapscriptSibling []byte `protobuf:"bytes,7,opt,name=tapscript_sibling,json=tapscriptSibling,proto3" json:"tapscript_sibling,omitempty"`
 	// The height of the block which contains the anchor transaction.
 	BlockHeight uint32 `protobuf:"varint,8,opt,name=block_height,json=blockHeight,proto3" json:"block_height,omitempty"`
+	// The UTC Unix timestamp of the block containing the anchor transaction.
+	BlockTimestamp int64 `protobuf:"varint,9,opt,name=block_timestamp,json=blockTimestamp,proto3" json:"block_timestamp,omitempty"`
 }
 
 func (x *AnchorInfo) Reset() {
@@ -833,6 +928,13 @@ func (x *AnchorInfo) GetBlockHeight() uint32 {
 	return 0
 }
 
+func (x *AnchorInfo) GetBlockTimestamp() int64 {
+	if x != nil {
+		return x.BlockTimestamp
+	}
+	return 0
+}
+
 type GenesisInfo struct {
 	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
@@ -1573,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
@@ -1582,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
@@ -1593,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() {
@@ -1753,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
@@ -1937,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() {
@@ -1978,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
@@ -2404,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() {
@@ -2480,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()
 }
@@ -3859,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
@@ -3873,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)
 	}
@@ -3891,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 {
@@ -3904,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 {
@@ -3928,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
@@ -3942,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)
 	}
@@ -3955,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 {
@@ -3968,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 {
@@ -3999,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)
 	}
@@ -4012,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 {
@@ -4025,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 {
@@ -4054,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)
 	}
@@ -4067,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 {
@@ -4080,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 {
@@ -4102,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)
 	}
@@ -4115,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 {
@@ -4128,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 {
@@ -4152,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)
 	}
@@ -4165,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 {
@@ -4178,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 {
@@ -4206,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)
 	}
@@ -4219,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 {
@@ -4232,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 {
@@ -4256,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)
 	}
@@ -4269,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 {
@@ -4282,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 {
@@ -4357,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)
 	}
@@ -4370,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 {
@@ -4383,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 {
@@ -4497,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)
 	}
@@ -4510,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 {
@@ -4523,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 {
@@ -4563,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)
 	}
@@ -4576,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 {
@@ -4589,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 {
@@ -4631,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)
 	}
@@ -4644,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 {
@@ -4657,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 {
@@ -4680,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)
 	}
@@ -4693,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 {
@@ -4706,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 {
@@ -4743,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)
 	}
@@ -4756,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 {
@@ -4769,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 {
@@ -4793,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)
 	}
@@ -4806,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 {
@@ -4819,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 {
@@ -4859,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)
 	}
@@ -4872,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 {
@@ -4885,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 {
@@ -4958,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)
 	}
@@ -4971,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 {
@@ -4984,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 {
@@ -5013,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)
 	}
@@ -5026,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 {
@@ -5039,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 {
@@ -5070,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)
 	}
@@ -5083,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 {
@@ -5096,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 {
@@ -5141,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)
 	}
@@ -5154,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 {
@@ -5167,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 {
@@ -5209,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)
 	}
@@ -5222,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 {
@@ -5235,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 {
@@ -5254,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)
 	}
@@ -5267,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 {
@@ -5280,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 {
@@ -5301,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)
 	}
@@ -5314,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 {
@@ -5327,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 {
@@ -5403,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)
 	}
@@ -5416,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 {
@@ -5429,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 {
@@ -5521,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)
 	}
@@ -5534,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 {
@@ -5547,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 {
@@ -5624,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)
 	}
@@ -5637,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 {
@@ -5650,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 {
@@ -5683,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)
 	}
@@ -5696,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 {
@@ -5709,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 {
@@ -5753,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)
 	}
@@ -5766,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 {
@@ -5779,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 {
@@ -5828,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)
 	}
@@ -5841,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 {
@@ -5854,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 {
@@ -5878,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)
 	}
@@ -5891,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 {
@@ -5904,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 {
@@ -5937,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)
 	}
@@ -5950,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 {
@@ -5963,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 {
@@ -6005,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)
 	}
@@ -6018,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 {
@@ -6031,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 {
@@ -6092,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)
 	}
@@ -6105,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 {
@@ -6118,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 {
@@ -6173,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)
 	}
@@ -6186,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 {
@@ -6199,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 {
@@ -6296,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)
 	}
@@ -6309,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 {
@@ -6322,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 {
@@ -6385,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)
 	}
@@ -6398,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 {
@@ -6411,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 {
@@ -6453,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)
 	}
@@ -6466,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 {
@@ -6479,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 {
@@ -6500,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,
@@ -6524,183 +6760,198 @@ 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, 0x92,
-	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, 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, 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, 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,
+	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, 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, 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,
@@ -6764,7 +7015,7 @@ var file_taprootassets_proto_rawDesc = []byte{
 	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,
+	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,
@@ -6777,223 +7028,235 @@ var file_taprootassets_proto_rawDesc = []byte{
 	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, 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,
+	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,
-	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,
+	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,
@@ -7001,509 +7264,523 @@ var file_taprootassets_proto_rawDesc = []byte{
 	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,
+	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,
+	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, 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,
+	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,
-	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, 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, 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,
+	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, 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,
+	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, 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 (
@@ -7518,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() }
@@ -7750,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
@@ -7762,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
@@ -7774,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
@@ -7786,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
@@ -7798,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
@@ -7810,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
@@ -7822,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
@@ -7834,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
@@ -7846,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
@@ -7858,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
@@ -7870,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
@@ -7882,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
@@ -7894,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
@@ -7906,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
@@ -7918,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
@@ -7930,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
@@ -7942,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
@@ -7954,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
@@ -7966,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
@@ -7978,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
@@ -7990,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
@@ -8002,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
@@ -8014,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
@@ -8026,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
@@ -8038,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
@@ -8050,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
@@ -8062,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
@@ -8074,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
@@ -8086,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
@@ -8098,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
@@ -8110,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
@@ -8122,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
@@ -8134,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
@@ -8146,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
@@ -8158,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
@@ -8170,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
@@ -8182,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
@@ -8194,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
@@ -8206,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
@@ -8218,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
@@ -8230,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
@@ -8242,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
@@ -8254,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
@@ -8266,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
@@ -8278,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
@@ -8290,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
@@ -8302,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
@@ -8314,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
@@ -8326,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
@@ -8338,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
@@ -8350,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
@@ -8362,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
@@ -8374,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
@@ -8386,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
@@ -8398,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
@@ -8410,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
@@ -8422,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
@@ -8434,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
@@ -8446,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
@@ -8458,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
@@ -8470,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
@@ -8482,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
@@ -8494,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
@@ -8506,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
@@ -8518,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
@@ -8530,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
@@ -8542,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
@@ -8554,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
@@ -8566,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
@@ -8578,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
@@ -8590,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
@@ -8602,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
@@ -8614,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
@@ -8626,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
@@ -8638,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
@@ -8650,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
@@ -8662,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
@@ -8674,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
@@ -8686,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
@@ -8698,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
@@ -8711,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),
 	}
@@ -8730,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 f6bfbad3..206f7c8a 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 8ea29bcf..fb86cd66 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 {
@@ -265,6 +273,9 @@ message AnchorInfo {
 
     // The height of the block which contains the anchor transaction.
     uint32 block_height = 8;
+
+    // The UTC Unix timestamp of the block containing the anchor transaction.
+    int64 block_timestamp = 9;
 }
 
 message GenesisInfo {
@@ -514,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
@@ -524,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
@@ -536,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 {
@@ -565,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 {
@@ -662,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 {
@@ -1004,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
@@ -1022,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 9dfb7acb..835ab6ea 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": [
@@ -1256,6 +1341,11 @@
           "type": "integer",
           "format": "int64",
           "description": "The height of the block which contains the anchor transaction."
+        },
+        "block_timestamp": {
+          "type": "string",
+          "format": "int64",
+          "description": "The UTC Unix timestamp of the block containing the anchor transaction."
         }
       }
     },
@@ -1371,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)."
         }
       }
     },
@@ -2308,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 27ce7866..869ba732 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
 
@@ -1457,6 +1457,9 @@ type AssetProofResponse struct {
 	// MultiverseInclusionProof is the inclusion proof for the asset leaf in the
 	// multiverse.
 	MultiverseInclusionProof []byte `protobuf:"bytes,6,opt,name=multiverse_inclusion_proof,json=multiverseInclusionProof,proto3" json:"multiverse_inclusion_proof,omitempty"`
+	// The issuance related data for an issuance asset leaf. This is empty for
+	// any other type of asset leaf.
+	IssuanceData *IssuanceData `protobuf:"bytes,7,opt,name=issuance_data,json=issuanceData,proto3" json:"issuance_data,omitempty"`
 }
 
 func (x *AssetProofResponse) Reset() {
@@ -1533,6 +1536,81 @@ func (x *AssetProofResponse) GetMultiverseInclusionProof() []byte {
 	return nil
 }
 
+func (x *AssetProofResponse) GetIssuanceData() *IssuanceData {
+	if x != nil {
+		return x.IssuanceData
+	}
+	return nil
+}
+
+type IssuanceData struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// The reveal meta data associated with the proof, if available.
+	MetaReveal *taprpc.AssetMeta `protobuf:"bytes,1,opt,name=meta_reveal,json=metaReveal,proto3" json:"meta_reveal,omitempty"`
+	// GenesisReveal is an optional field that is the Genesis information for
+	// the asset. This is required for minting proofs.
+	GenesisReveal *taprpc.GenesisReveal `protobuf:"bytes,2,opt,name=genesis_reveal,json=genesisReveal,proto3" json:"genesis_reveal,omitempty"`
+	// GroupKeyReveal is an optional field that includes the information needed
+	// to derive the tweaked group key.
+	GroupKeyReveal *taprpc.GroupKeyReveal `protobuf:"bytes,3,opt,name=group_key_reveal,json=groupKeyReveal,proto3" json:"group_key_reveal,omitempty"`
+}
+
+func (x *IssuanceData) Reset() {
+	*x = IssuanceData{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_universerpc_universe_proto_msgTypes[19]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *IssuanceData) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*IssuanceData) ProtoMessage() {}
+
+func (x *IssuanceData) ProtoReflect() protoreflect.Message {
+	mi := &file_universerpc_universe_proto_msgTypes[19]
+	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 IssuanceData.ProtoReflect.Descriptor instead.
+func (*IssuanceData) Descriptor() ([]byte, []int) {
+	return file_universerpc_universe_proto_rawDescGZIP(), []int{19}
+}
+
+func (x *IssuanceData) GetMetaReveal() *taprpc.AssetMeta {
+	if x != nil {
+		return x.MetaReveal
+	}
+	return nil
+}
+
+func (x *IssuanceData) GetGenesisReveal() *taprpc.GenesisReveal {
+	if x != nil {
+		return x.GenesisReveal
+	}
+	return nil
+}
+
+func (x *IssuanceData) GetGroupKeyReveal() *taprpc.GroupKeyReveal {
+	if x != nil {
+		return x.GroupKeyReveal
+	}
+	return nil
+}
+
 type AssetProof struct {
 	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
@@ -1547,7 +1625,7 @@ type AssetProof struct {
 func (x *AssetProof) Reset() {
 	*x = AssetProof{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_universerpc_universe_proto_msgTypes[19]
+		mi := &file_universerpc_universe_proto_msgTypes[20]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -1560,7 +1638,7 @@ func (x *AssetProof) String() string {
 func (*AssetProof) ProtoMessage() {}
 
 func (x *AssetProof) ProtoReflect() protoreflect.Message {
-	mi := &file_universerpc_universe_proto_msgTypes[19]
+	mi := &file_universerpc_universe_proto_msgTypes[20]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -1573,7 +1651,7 @@ func (x *AssetProof) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use AssetProof.ProtoReflect.Descriptor instead.
 func (*AssetProof) Descriptor() ([]byte, []int) {
-	return file_universerpc_universe_proto_rawDescGZIP(), []int{19}
+	return file_universerpc_universe_proto_rawDescGZIP(), []int{20}
 }
 
 func (x *AssetProof) GetKey() *UniverseKey {
@@ -1604,7 +1682,7 @@ type PushProofRequest struct {
 func (x *PushProofRequest) Reset() {
 	*x = PushProofRequest{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_universerpc_universe_proto_msgTypes[20]
+		mi := &file_universerpc_universe_proto_msgTypes[21]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -1617,7 +1695,7 @@ func (x *PushProofRequest) String() string {
 func (*PushProofRequest) ProtoMessage() {}
 
 func (x *PushProofRequest) ProtoReflect() protoreflect.Message {
-	mi := &file_universerpc_universe_proto_msgTypes[20]
+	mi := &file_universerpc_universe_proto_msgTypes[21]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -1630,7 +1708,7 @@ func (x *PushProofRequest) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use PushProofRequest.ProtoReflect.Descriptor instead.
 func (*PushProofRequest) Descriptor() ([]byte, []int) {
-	return file_universerpc_universe_proto_rawDescGZIP(), []int{20}
+	return file_universerpc_universe_proto_rawDescGZIP(), []int{21}
 }
 
 func (x *PushProofRequest) GetKey() *UniverseKey {
@@ -1659,7 +1737,7 @@ type PushProofResponse struct {
 func (x *PushProofResponse) Reset() {
 	*x = PushProofResponse{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_universerpc_universe_proto_msgTypes[21]
+		mi := &file_universerpc_universe_proto_msgTypes[22]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -1672,7 +1750,7 @@ func (x *PushProofResponse) String() string {
 func (*PushProofResponse) ProtoMessage() {}
 
 func (x *PushProofResponse) ProtoReflect() protoreflect.Message {
-	mi := &file_universerpc_universe_proto_msgTypes[21]
+	mi := &file_universerpc_universe_proto_msgTypes[22]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -1685,7 +1763,7 @@ func (x *PushProofResponse) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use PushProofResponse.ProtoReflect.Descriptor instead.
 func (*PushProofResponse) Descriptor() ([]byte, []int) {
-	return file_universerpc_universe_proto_rawDescGZIP(), []int{21}
+	return file_universerpc_universe_proto_rawDescGZIP(), []int{22}
 }
 
 func (x *PushProofResponse) GetKey() *UniverseKey {
@@ -1704,7 +1782,7 @@ type InfoRequest struct {
 func (x *InfoRequest) Reset() {
 	*x = InfoRequest{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_universerpc_universe_proto_msgTypes[22]
+		mi := &file_universerpc_universe_proto_msgTypes[23]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -1717,7 +1795,7 @@ func (x *InfoRequest) String() string {
 func (*InfoRequest) ProtoMessage() {}
 
 func (x *InfoRequest) ProtoReflect() protoreflect.Message {
-	mi := &file_universerpc_universe_proto_msgTypes[22]
+	mi := &file_universerpc_universe_proto_msgTypes[23]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -1730,7 +1808,7 @@ func (x *InfoRequest) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use InfoRequest.ProtoReflect.Descriptor instead.
 func (*InfoRequest) Descriptor() ([]byte, []int) {
-	return file_universerpc_universe_proto_rawDescGZIP(), []int{22}
+	return file_universerpc_universe_proto_rawDescGZIP(), []int{23}
 }
 
 type InfoResponse struct {
@@ -1747,7 +1825,7 @@ type InfoResponse struct {
 func (x *InfoResponse) Reset() {
 	*x = InfoResponse{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_universerpc_universe_proto_msgTypes[23]
+		mi := &file_universerpc_universe_proto_msgTypes[24]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -1760,7 +1838,7 @@ func (x *InfoResponse) String() string {
 func (*InfoResponse) ProtoMessage() {}
 
 func (x *InfoResponse) ProtoReflect() protoreflect.Message {
-	mi := &file_universerpc_universe_proto_msgTypes[23]
+	mi := &file_universerpc_universe_proto_msgTypes[24]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -1773,7 +1851,7 @@ func (x *InfoResponse) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use InfoResponse.ProtoReflect.Descriptor instead.
 func (*InfoResponse) Descriptor() ([]byte, []int) {
-	return file_universerpc_universe_proto_rawDescGZIP(), []int{23}
+	return file_universerpc_universe_proto_rawDescGZIP(), []int{24}
 }
 
 func (x *InfoResponse) GetRuntimeId() int64 {
@@ -1794,7 +1872,7 @@ type SyncTarget struct {
 func (x *SyncTarget) Reset() {
 	*x = SyncTarget{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_universerpc_universe_proto_msgTypes[24]
+		mi := &file_universerpc_universe_proto_msgTypes[25]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -1807,7 +1885,7 @@ func (x *SyncTarget) String() string {
 func (*SyncTarget) ProtoMessage() {}
 
 func (x *SyncTarget) ProtoReflect() protoreflect.Message {
-	mi := &file_universerpc_universe_proto_msgTypes[24]
+	mi := &file_universerpc_universe_proto_msgTypes[25]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -1820,7 +1898,7 @@ func (x *SyncTarget) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use SyncTarget.ProtoReflect.Descriptor instead.
 func (*SyncTarget) Descriptor() ([]byte, []int) {
-	return file_universerpc_universe_proto_rawDescGZIP(), []int{24}
+	return file_universerpc_universe_proto_rawDescGZIP(), []int{25}
 }
 
 func (x *SyncTarget) GetId() *ID {
@@ -1848,7 +1926,7 @@ type SyncRequest struct {
 func (x *SyncRequest) Reset() {
 	*x = SyncRequest{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_universerpc_universe_proto_msgTypes[25]
+		mi := &file_universerpc_universe_proto_msgTypes[26]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -1861,7 +1939,7 @@ func (x *SyncRequest) String() string {
 func (*SyncRequest) ProtoMessage() {}
 
 func (x *SyncRequest) ProtoReflect() protoreflect.Message {
-	mi := &file_universerpc_universe_proto_msgTypes[25]
+	mi := &file_universerpc_universe_proto_msgTypes[26]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -1874,7 +1952,7 @@ func (x *SyncRequest) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use SyncRequest.ProtoReflect.Descriptor instead.
 func (*SyncRequest) Descriptor() ([]byte, []int) {
-	return file_universerpc_universe_proto_rawDescGZIP(), []int{25}
+	return file_universerpc_universe_proto_rawDescGZIP(), []int{26}
 }
 
 func (x *SyncRequest) GetUniverseHost() string {
@@ -1914,7 +1992,7 @@ type SyncedUniverse struct {
 func (x *SyncedUniverse) Reset() {
 	*x = SyncedUniverse{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_universerpc_universe_proto_msgTypes[26]
+		mi := &file_universerpc_universe_proto_msgTypes[27]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -1927,7 +2005,7 @@ func (x *SyncedUniverse) String() string {
 func (*SyncedUniverse) ProtoMessage() {}
 
 func (x *SyncedUniverse) ProtoReflect() protoreflect.Message {
-	mi := &file_universerpc_universe_proto_msgTypes[26]
+	mi := &file_universerpc_universe_proto_msgTypes[27]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -1940,7 +2018,7 @@ func (x *SyncedUniverse) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use SyncedUniverse.ProtoReflect.Descriptor instead.
 func (*SyncedUniverse) Descriptor() ([]byte, []int) {
-	return file_universerpc_universe_proto_rawDescGZIP(), []int{26}
+	return file_universerpc_universe_proto_rawDescGZIP(), []int{27}
 }
 
 func (x *SyncedUniverse) GetOldAssetRoot() *UniverseRoot {
@@ -1973,7 +2051,7 @@ type StatsRequest struct {
 func (x *StatsRequest) Reset() {
 	*x = StatsRequest{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_universerpc_universe_proto_msgTypes[27]
+		mi := &file_universerpc_universe_proto_msgTypes[28]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -1986,7 +2064,7 @@ func (x *StatsRequest) String() string {
 func (*StatsRequest) ProtoMessage() {}
 
 func (x *StatsRequest) ProtoReflect() protoreflect.Message {
-	mi := &file_universerpc_universe_proto_msgTypes[27]
+	mi := &file_universerpc_universe_proto_msgTypes[28]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -1999,7 +2077,7 @@ func (x *StatsRequest) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use StatsRequest.ProtoReflect.Descriptor instead.
 func (*StatsRequest) Descriptor() ([]byte, []int) {
-	return file_universerpc_universe_proto_rawDescGZIP(), []int{27}
+	return file_universerpc_universe_proto_rawDescGZIP(), []int{28}
 }
 
 type SyncResponse struct {
@@ -2014,7 +2092,7 @@ type SyncResponse struct {
 func (x *SyncResponse) Reset() {
 	*x = SyncResponse{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_universerpc_universe_proto_msgTypes[28]
+		mi := &file_universerpc_universe_proto_msgTypes[29]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -2027,7 +2105,7 @@ func (x *SyncResponse) String() string {
 func (*SyncResponse) ProtoMessage() {}
 
 func (x *SyncResponse) ProtoReflect() protoreflect.Message {
-	mi := &file_universerpc_universe_proto_msgTypes[28]
+	mi := &file_universerpc_universe_proto_msgTypes[29]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -2040,7 +2118,7 @@ func (x *SyncResponse) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use SyncResponse.ProtoReflect.Descriptor instead.
 func (*SyncResponse) Descriptor() ([]byte, []int) {
-	return file_universerpc_universe_proto_rawDescGZIP(), []int{28}
+	return file_universerpc_universe_proto_rawDescGZIP(), []int{29}
 }
 
 func (x *SyncResponse) GetSyncedUniverses() []*SyncedUniverse {
@@ -2062,7 +2140,7 @@ type UniverseFederationServer struct {
 func (x *UniverseFederationServer) Reset() {
 	*x = UniverseFederationServer{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_universerpc_universe_proto_msgTypes[29]
+		mi := &file_universerpc_universe_proto_msgTypes[30]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -2075,7 +2153,7 @@ func (x *UniverseFederationServer) String() string {
 func (*UniverseFederationServer) ProtoMessage() {}
 
 func (x *UniverseFederationServer) ProtoReflect() protoreflect.Message {
-	mi := &file_universerpc_universe_proto_msgTypes[29]
+	mi := &file_universerpc_universe_proto_msgTypes[30]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -2088,7 +2166,7 @@ func (x *UniverseFederationServer) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use UniverseFederationServer.ProtoReflect.Descriptor instead.
 func (*UniverseFederationServer) Descriptor() ([]byte, []int) {
-	return file_universerpc_universe_proto_rawDescGZIP(), []int{29}
+	return file_universerpc_universe_proto_rawDescGZIP(), []int{30}
 }
 
 func (x *UniverseFederationServer) GetHost() string {
@@ -2114,7 +2192,7 @@ type ListFederationServersRequest struct {
 func (x *ListFederationServersRequest) Reset() {
 	*x = ListFederationServersRequest{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_universerpc_universe_proto_msgTypes[30]
+		mi := &file_universerpc_universe_proto_msgTypes[31]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -2127,7 +2205,7 @@ func (x *ListFederationServersRequest) String() string {
 func (*ListFederationServersRequest) ProtoMessage() {}
 
 func (x *ListFederationServersRequest) ProtoReflect() protoreflect.Message {
-	mi := &file_universerpc_universe_proto_msgTypes[30]
+	mi := &file_universerpc_universe_proto_msgTypes[31]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -2140,7 +2218,7 @@ func (x *ListFederationServersRequest) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use ListFederationServersRequest.ProtoReflect.Descriptor instead.
 func (*ListFederationServersRequest) Descriptor() ([]byte, []int) {
-	return file_universerpc_universe_proto_rawDescGZIP(), []int{30}
+	return file_universerpc_universe_proto_rawDescGZIP(), []int{31}
 }
 
 type ListFederationServersResponse struct {
@@ -2154,7 +2232,7 @@ type ListFederationServersResponse struct {
 func (x *ListFederationServersResponse) Reset() {
 	*x = ListFederationServersResponse{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_universerpc_universe_proto_msgTypes[31]
+		mi := &file_universerpc_universe_proto_msgTypes[32]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -2167,7 +2245,7 @@ func (x *ListFederationServersResponse) String() string {
 func (*ListFederationServersResponse) ProtoMessage() {}
 
 func (x *ListFederationServersResponse) ProtoReflect() protoreflect.Message {
-	mi := &file_universerpc_universe_proto_msgTypes[31]
+	mi := &file_universerpc_universe_proto_msgTypes[32]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -2180,7 +2258,7 @@ func (x *ListFederationServersResponse) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use ListFederationServersResponse.ProtoReflect.Descriptor instead.
 func (*ListFederationServersResponse) Descriptor() ([]byte, []int) {
-	return file_universerpc_universe_proto_rawDescGZIP(), []int{31}
+	return file_universerpc_universe_proto_rawDescGZIP(), []int{32}
 }
 
 func (x *ListFederationServersResponse) GetServers() []*UniverseFederationServer {
@@ -2201,7 +2279,7 @@ type AddFederationServerRequest struct {
 func (x *AddFederationServerRequest) Reset() {
 	*x = AddFederationServerRequest{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_universerpc_universe_proto_msgTypes[32]
+		mi := &file_universerpc_universe_proto_msgTypes[33]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -2214,7 +2292,7 @@ func (x *AddFederationServerRequest) String() string {
 func (*AddFederationServerRequest) ProtoMessage() {}
 
 func (x *AddFederationServerRequest) ProtoReflect() protoreflect.Message {
-	mi := &file_universerpc_universe_proto_msgTypes[32]
+	mi := &file_universerpc_universe_proto_msgTypes[33]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -2227,7 +2305,7 @@ func (x *AddFederationServerRequest) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use AddFederationServerRequest.ProtoReflect.Descriptor instead.
 func (*AddFederationServerRequest) Descriptor() ([]byte, []int) {
-	return file_universerpc_universe_proto_rawDescGZIP(), []int{32}
+	return file_universerpc_universe_proto_rawDescGZIP(), []int{33}
 }
 
 func (x *AddFederationServerRequest) GetServers() []*UniverseFederationServer {
@@ -2246,7 +2324,7 @@ type AddFederationServerResponse struct {
 func (x *AddFederationServerResponse) Reset() {
 	*x = AddFederationServerResponse{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_universerpc_universe_proto_msgTypes[33]
+		mi := &file_universerpc_universe_proto_msgTypes[34]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -2259,7 +2337,7 @@ func (x *AddFederationServerResponse) String() string {
 func (*AddFederationServerResponse) ProtoMessage() {}
 
 func (x *AddFederationServerResponse) ProtoReflect() protoreflect.Message {
-	mi := &file_universerpc_universe_proto_msgTypes[33]
+	mi := &file_universerpc_universe_proto_msgTypes[34]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -2272,7 +2350,7 @@ func (x *AddFederationServerResponse) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use AddFederationServerResponse.ProtoReflect.Descriptor instead.
 func (*AddFederationServerResponse) Descriptor() ([]byte, []int) {
-	return file_universerpc_universe_proto_rawDescGZIP(), []int{33}
+	return file_universerpc_universe_proto_rawDescGZIP(), []int{34}
 }
 
 type DeleteFederationServerRequest struct {
@@ -2286,7 +2364,7 @@ type DeleteFederationServerRequest struct {
 func (x *DeleteFederationServerRequest) Reset() {
 	*x = DeleteFederationServerRequest{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_universerpc_universe_proto_msgTypes[34]
+		mi := &file_universerpc_universe_proto_msgTypes[35]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -2299,7 +2377,7 @@ func (x *DeleteFederationServerRequest) String() string {
 func (*DeleteFederationServerRequest) ProtoMessage() {}
 
 func (x *DeleteFederationServerRequest) ProtoReflect() protoreflect.Message {
-	mi := &file_universerpc_universe_proto_msgTypes[34]
+	mi := &file_universerpc_universe_proto_msgTypes[35]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -2312,7 +2390,7 @@ func (x *DeleteFederationServerRequest) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use DeleteFederationServerRequest.ProtoReflect.Descriptor instead.
 func (*DeleteFederationServerRequest) Descriptor() ([]byte, []int) {
-	return file_universerpc_universe_proto_rawDescGZIP(), []int{34}
+	return file_universerpc_universe_proto_rawDescGZIP(), []int{35}
 }
 
 func (x *DeleteFederationServerRequest) GetServers() []*UniverseFederationServer {
@@ -2331,7 +2409,7 @@ type DeleteFederationServerResponse struct {
 func (x *DeleteFederationServerResponse) Reset() {
 	*x = DeleteFederationServerResponse{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_universerpc_universe_proto_msgTypes[35]
+		mi := &file_universerpc_universe_proto_msgTypes[36]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -2344,7 +2422,7 @@ func (x *DeleteFederationServerResponse) String() string {
 func (*DeleteFederationServerResponse) ProtoMessage() {}
 
 func (x *DeleteFederationServerResponse) ProtoReflect() protoreflect.Message {
-	mi := &file_universerpc_universe_proto_msgTypes[35]
+	mi := &file_universerpc_universe_proto_msgTypes[36]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -2357,7 +2435,7 @@ func (x *DeleteFederationServerResponse) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use DeleteFederationServerResponse.ProtoReflect.Descriptor instead.
 func (*DeleteFederationServerResponse) Descriptor() ([]byte, []int) {
-	return file_universerpc_universe_proto_rawDescGZIP(), []int{35}
+	return file_universerpc_universe_proto_rawDescGZIP(), []int{36}
 }
 
 type StatsResponse struct {
@@ -2374,7 +2452,7 @@ type StatsResponse struct {
 func (x *StatsResponse) Reset() {
 	*x = StatsResponse{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_universerpc_universe_proto_msgTypes[36]
+		mi := &file_universerpc_universe_proto_msgTypes[37]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -2387,7 +2465,7 @@ func (x *StatsResponse) String() string {
 func (*StatsResponse) ProtoMessage() {}
 
 func (x *StatsResponse) ProtoReflect() protoreflect.Message {
-	mi := &file_universerpc_universe_proto_msgTypes[36]
+	mi := &file_universerpc_universe_proto_msgTypes[37]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -2400,7 +2478,7 @@ func (x *StatsResponse) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use StatsResponse.ProtoReflect.Descriptor instead.
 func (*StatsResponse) Descriptor() ([]byte, []int) {
-	return file_universerpc_universe_proto_rawDescGZIP(), []int{36}
+	return file_universerpc_universe_proto_rawDescGZIP(), []int{37}
 }
 
 func (x *StatsResponse) GetNumTotalAssets() int64 {
@@ -2448,7 +2526,7 @@ type AssetStatsQuery struct {
 func (x *AssetStatsQuery) Reset() {
 	*x = AssetStatsQuery{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_universerpc_universe_proto_msgTypes[37]
+		mi := &file_universerpc_universe_proto_msgTypes[38]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -2461,7 +2539,7 @@ func (x *AssetStatsQuery) String() string {
 func (*AssetStatsQuery) ProtoMessage() {}
 
 func (x *AssetStatsQuery) ProtoReflect() protoreflect.Message {
-	mi := &file_universerpc_universe_proto_msgTypes[37]
+	mi := &file_universerpc_universe_proto_msgTypes[38]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -2474,7 +2552,7 @@ func (x *AssetStatsQuery) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use AssetStatsQuery.ProtoReflect.Descriptor instead.
 func (*AssetStatsQuery) Descriptor() ([]byte, []int) {
-	return file_universerpc_universe_proto_rawDescGZIP(), []int{37}
+	return file_universerpc_universe_proto_rawDescGZIP(), []int{38}
 }
 
 func (x *AssetStatsQuery) GetAssetNameFilter() string {
@@ -2554,7 +2632,7 @@ type AssetStatsSnapshot struct {
 func (x *AssetStatsSnapshot) Reset() {
 	*x = AssetStatsSnapshot{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_universerpc_universe_proto_msgTypes[38]
+		mi := &file_universerpc_universe_proto_msgTypes[39]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -2567,7 +2645,7 @@ func (x *AssetStatsSnapshot) String() string {
 func (*AssetStatsSnapshot) ProtoMessage() {}
 
 func (x *AssetStatsSnapshot) ProtoReflect() protoreflect.Message {
-	mi := &file_universerpc_universe_proto_msgTypes[38]
+	mi := &file_universerpc_universe_proto_msgTypes[39]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -2580,7 +2658,7 @@ func (x *AssetStatsSnapshot) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use AssetStatsSnapshot.ProtoReflect.Descriptor instead.
 func (*AssetStatsSnapshot) Descriptor() ([]byte, []int) {
-	return file_universerpc_universe_proto_rawDescGZIP(), []int{38}
+	return file_universerpc_universe_proto_rawDescGZIP(), []int{39}
 }
 
 func (x *AssetStatsSnapshot) GetGroupKey() []byte {
@@ -2643,7 +2721,7 @@ type AssetStatsAsset struct {
 func (x *AssetStatsAsset) Reset() {
 	*x = AssetStatsAsset{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_universerpc_universe_proto_msgTypes[39]
+		mi := &file_universerpc_universe_proto_msgTypes[40]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -2656,7 +2734,7 @@ func (x *AssetStatsAsset) String() string {
 func (*AssetStatsAsset) ProtoMessage() {}
 
 func (x *AssetStatsAsset) ProtoReflect() protoreflect.Message {
-	mi := &file_universerpc_universe_proto_msgTypes[39]
+	mi := &file_universerpc_universe_proto_msgTypes[40]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -2669,7 +2747,7 @@ func (x *AssetStatsAsset) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use AssetStatsAsset.ProtoReflect.Descriptor instead.
 func (*AssetStatsAsset) Descriptor() ([]byte, []int) {
-	return file_universerpc_universe_proto_rawDescGZIP(), []int{39}
+	return file_universerpc_universe_proto_rawDescGZIP(), []int{40}
 }
 
 func (x *AssetStatsAsset) GetAssetId() []byte {
@@ -2739,7 +2817,7 @@ type UniverseAssetStats struct {
 func (x *UniverseAssetStats) Reset() {
 	*x = UniverseAssetStats{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_universerpc_universe_proto_msgTypes[40]
+		mi := &file_universerpc_universe_proto_msgTypes[41]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -2752,7 +2830,7 @@ func (x *UniverseAssetStats) String() string {
 func (*UniverseAssetStats) ProtoMessage() {}
 
 func (x *UniverseAssetStats) ProtoReflect() protoreflect.Message {
-	mi := &file_universerpc_universe_proto_msgTypes[40]
+	mi := &file_universerpc_universe_proto_msgTypes[41]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -2765,7 +2843,7 @@ func (x *UniverseAssetStats) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use UniverseAssetStats.ProtoReflect.Descriptor instead.
 func (*UniverseAssetStats) Descriptor() ([]byte, []int) {
-	return file_universerpc_universe_proto_rawDescGZIP(), []int{40}
+	return file_universerpc_universe_proto_rawDescGZIP(), []int{41}
 }
 
 func (x *UniverseAssetStats) GetAssetStats() []*AssetStatsSnapshot {
@@ -2787,7 +2865,7 @@ type QueryEventsRequest struct {
 func (x *QueryEventsRequest) Reset() {
 	*x = QueryEventsRequest{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_universerpc_universe_proto_msgTypes[41]
+		mi := &file_universerpc_universe_proto_msgTypes[42]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -2800,7 +2878,7 @@ func (x *QueryEventsRequest) String() string {
 func (*QueryEventsRequest) ProtoMessage() {}
 
 func (x *QueryEventsRequest) ProtoReflect() protoreflect.Message {
-	mi := &file_universerpc_universe_proto_msgTypes[41]
+	mi := &file_universerpc_universe_proto_msgTypes[42]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -2813,7 +2891,7 @@ func (x *QueryEventsRequest) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use QueryEventsRequest.ProtoReflect.Descriptor instead.
 func (*QueryEventsRequest) Descriptor() ([]byte, []int) {
-	return file_universerpc_universe_proto_rawDescGZIP(), []int{41}
+	return file_universerpc_universe_proto_rawDescGZIP(), []int{42}
 }
 
 func (x *QueryEventsRequest) GetStartTimestamp() int64 {
@@ -2841,7 +2919,7 @@ type QueryEventsResponse struct {
 func (x *QueryEventsResponse) Reset() {
 	*x = QueryEventsResponse{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_universerpc_universe_proto_msgTypes[42]
+		mi := &file_universerpc_universe_proto_msgTypes[43]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -2854,7 +2932,7 @@ func (x *QueryEventsResponse) String() string {
 func (*QueryEventsResponse) ProtoMessage() {}
 
 func (x *QueryEventsResponse) ProtoReflect() protoreflect.Message {
-	mi := &file_universerpc_universe_proto_msgTypes[42]
+	mi := &file_universerpc_universe_proto_msgTypes[43]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -2867,7 +2945,7 @@ func (x *QueryEventsResponse) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use QueryEventsResponse.ProtoReflect.Descriptor instead.
 func (*QueryEventsResponse) Descriptor() ([]byte, []int) {
-	return file_universerpc_universe_proto_rawDescGZIP(), []int{42}
+	return file_universerpc_universe_proto_rawDescGZIP(), []int{43}
 }
 
 func (x *QueryEventsResponse) GetEvents() []*GroupedUniverseEvents {
@@ -2891,7 +2969,7 @@ type GroupedUniverseEvents struct {
 func (x *GroupedUniverseEvents) Reset() {
 	*x = GroupedUniverseEvents{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_universerpc_universe_proto_msgTypes[43]
+		mi := &file_universerpc_universe_proto_msgTypes[44]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -2904,7 +2982,7 @@ func (x *GroupedUniverseEvents) String() string {
 func (*GroupedUniverseEvents) ProtoMessage() {}
 
 func (x *GroupedUniverseEvents) ProtoReflect() protoreflect.Message {
-	mi := &file_universerpc_universe_proto_msgTypes[43]
+	mi := &file_universerpc_universe_proto_msgTypes[44]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -2917,7 +2995,7 @@ func (x *GroupedUniverseEvents) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use GroupedUniverseEvents.ProtoReflect.Descriptor instead.
 func (*GroupedUniverseEvents) Descriptor() ([]byte, []int) {
-	return file_universerpc_universe_proto_rawDescGZIP(), []int{43}
+	return file_universerpc_universe_proto_rawDescGZIP(), []int{44}
 }
 
 func (x *GroupedUniverseEvents) GetDate() string {
@@ -2953,7 +3031,7 @@ type SetFederationSyncConfigRequest struct {
 func (x *SetFederationSyncConfigRequest) Reset() {
 	*x = SetFederationSyncConfigRequest{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_universerpc_universe_proto_msgTypes[44]
+		mi := &file_universerpc_universe_proto_msgTypes[45]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -2966,7 +3044,7 @@ func (x *SetFederationSyncConfigRequest) String() string {
 func (*SetFederationSyncConfigRequest) ProtoMessage() {}
 
 func (x *SetFederationSyncConfigRequest) ProtoReflect() protoreflect.Message {
-	mi := &file_universerpc_universe_proto_msgTypes[44]
+	mi := &file_universerpc_universe_proto_msgTypes[45]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -2979,7 +3057,7 @@ func (x *SetFederationSyncConfigRequest) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use SetFederationSyncConfigRequest.ProtoReflect.Descriptor instead.
 func (*SetFederationSyncConfigRequest) Descriptor() ([]byte, []int) {
-	return file_universerpc_universe_proto_rawDescGZIP(), []int{44}
+	return file_universerpc_universe_proto_rawDescGZIP(), []int{45}
 }
 
 func (x *SetFederationSyncConfigRequest) GetGlobalSyncConfigs() []*GlobalFederationSyncConfig {
@@ -3005,7 +3083,7 @@ type SetFederationSyncConfigResponse struct {
 func (x *SetFederationSyncConfigResponse) Reset() {
 	*x = SetFederationSyncConfigResponse{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_universerpc_universe_proto_msgTypes[45]
+		mi := &file_universerpc_universe_proto_msgTypes[46]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -3018,7 +3096,7 @@ func (x *SetFederationSyncConfigResponse) String() string {
 func (*SetFederationSyncConfigResponse) ProtoMessage() {}
 
 func (x *SetFederationSyncConfigResponse) ProtoReflect() protoreflect.Message {
-	mi := &file_universerpc_universe_proto_msgTypes[45]
+	mi := &file_universerpc_universe_proto_msgTypes[46]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -3031,7 +3109,7 @@ func (x *SetFederationSyncConfigResponse) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use SetFederationSyncConfigResponse.ProtoReflect.Descriptor instead.
 func (*SetFederationSyncConfigResponse) Descriptor() ([]byte, []int) {
-	return file_universerpc_universe_proto_rawDescGZIP(), []int{45}
+	return file_universerpc_universe_proto_rawDescGZIP(), []int{46}
 }
 
 // GlobalFederationSyncConfig is a global proof type specific configuration
@@ -3056,7 +3134,7 @@ type GlobalFederationSyncConfig struct {
 func (x *GlobalFederationSyncConfig) Reset() {
 	*x = GlobalFederationSyncConfig{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_universerpc_universe_proto_msgTypes[46]
+		mi := &file_universerpc_universe_proto_msgTypes[47]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -3069,7 +3147,7 @@ func (x *GlobalFederationSyncConfig) String() string {
 func (*GlobalFederationSyncConfig) ProtoMessage() {}
 
 func (x *GlobalFederationSyncConfig) ProtoReflect() protoreflect.Message {
-	mi := &file_universerpc_universe_proto_msgTypes[46]
+	mi := &file_universerpc_universe_proto_msgTypes[47]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -3082,7 +3160,7 @@ func (x *GlobalFederationSyncConfig) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use GlobalFederationSyncConfig.ProtoReflect.Descriptor instead.
 func (*GlobalFederationSyncConfig) Descriptor() ([]byte, []int) {
-	return file_universerpc_universe_proto_rawDescGZIP(), []int{46}
+	return file_universerpc_universe_proto_rawDescGZIP(), []int{47}
 }
 
 func (x *GlobalFederationSyncConfig) GetProofType() ProofType {
@@ -3128,7 +3206,7 @@ type AssetFederationSyncConfig struct {
 func (x *AssetFederationSyncConfig) Reset() {
 	*x = AssetFederationSyncConfig{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_universerpc_universe_proto_msgTypes[47]
+		mi := &file_universerpc_universe_proto_msgTypes[48]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -3141,7 +3219,7 @@ func (x *AssetFederationSyncConfig) String() string {
 func (*AssetFederationSyncConfig) ProtoMessage() {}
 
 func (x *AssetFederationSyncConfig) ProtoReflect() protoreflect.Message {
-	mi := &file_universerpc_universe_proto_msgTypes[47]
+	mi := &file_universerpc_universe_proto_msgTypes[48]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -3154,7 +3232,7 @@ func (x *AssetFederationSyncConfig) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use AssetFederationSyncConfig.ProtoReflect.Descriptor instead.
 func (*AssetFederationSyncConfig) Descriptor() ([]byte, []int) {
-	return file_universerpc_universe_proto_rawDescGZIP(), []int{47}
+	return file_universerpc_universe_proto_rawDescGZIP(), []int{48}
 }
 
 func (x *AssetFederationSyncConfig) GetId() *ID {
@@ -3190,7 +3268,7 @@ type QueryFederationSyncConfigRequest struct {
 func (x *QueryFederationSyncConfigRequest) Reset() {
 	*x = QueryFederationSyncConfigRequest{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_universerpc_universe_proto_msgTypes[48]
+		mi := &file_universerpc_universe_proto_msgTypes[49]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -3203,7 +3281,7 @@ func (x *QueryFederationSyncConfigRequest) String() string {
 func (*QueryFederationSyncConfigRequest) ProtoMessage() {}
 
 func (x *QueryFederationSyncConfigRequest) ProtoReflect() protoreflect.Message {
-	mi := &file_universerpc_universe_proto_msgTypes[48]
+	mi := &file_universerpc_universe_proto_msgTypes[49]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -3216,7 +3294,7 @@ func (x *QueryFederationSyncConfigRequest) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use QueryFederationSyncConfigRequest.ProtoReflect.Descriptor instead.
 func (*QueryFederationSyncConfigRequest) Descriptor() ([]byte, []int) {
-	return file_universerpc_universe_proto_rawDescGZIP(), []int{48}
+	return file_universerpc_universe_proto_rawDescGZIP(), []int{49}
 }
 
 func (x *QueryFederationSyncConfigRequest) GetId() []*ID {
@@ -3238,7 +3316,7 @@ type QueryFederationSyncConfigResponse struct {
 func (x *QueryFederationSyncConfigResponse) Reset() {
 	*x = QueryFederationSyncConfigResponse{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_universerpc_universe_proto_msgTypes[49]
+		mi := &file_universerpc_universe_proto_msgTypes[50]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -3251,7 +3329,7 @@ func (x *QueryFederationSyncConfigResponse) String() string {
 func (*QueryFederationSyncConfigResponse) ProtoMessage() {}
 
 func (x *QueryFederationSyncConfigResponse) ProtoReflect() protoreflect.Message {
-	mi := &file_universerpc_universe_proto_msgTypes[49]
+	mi := &file_universerpc_universe_proto_msgTypes[50]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -3264,7 +3342,7 @@ func (x *QueryFederationSyncConfigResponse) ProtoReflect() protoreflect.Message
 
 // Deprecated: Use QueryFederationSyncConfigResponse.ProtoReflect.Descriptor instead.
 func (*QueryFederationSyncConfigResponse) Descriptor() ([]byte, []int) {
-	return file_universerpc_universe_proto_rawDescGZIP(), []int{49}
+	return file_universerpc_universe_proto_rawDescGZIP(), []int{50}
 }
 
 func (x *QueryFederationSyncConfigResponse) GetGlobalSyncConfigs() []*GlobalFederationSyncConfig {
@@ -3424,7 +3502,7 @@ var file_universerpc_universe_proto_rawDesc = []byte{
 	0x2e, 0x49, 0x44, 0x52, 0x02, 0x69, 0x64, 0x12, 0x30, 0x0a, 0x08, 0x6c, 0x65, 0x61, 0x66, 0x5f,
 	0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x75, 0x6e, 0x69, 0x76,
 	0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x4b, 0x65, 0x79,
-	0x52, 0x07, 0x6c, 0x65, 0x61, 0x66, 0x4b, 0x65, 0x79, 0x22, 0xf4, 0x02, 0x0a, 0x12, 0x41, 0x73,
+	0x52, 0x07, 0x6c, 0x65, 0x61, 0x66, 0x4b, 0x65, 0x79, 0x22, 0xb4, 0x03, 0x0a, 0x12, 0x41, 0x73,
 	0x73, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
 	0x12, 0x2a, 0x0a, 0x03, 0x72, 0x65, 0x71, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e,
 	0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x55, 0x6e, 0x69, 0x76,
@@ -3448,379 +3526,396 @@ var file_universerpc_universe_proto_rawDesc = []byte{
 	0x5f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x72, 0x6f, 0x6f, 0x66,
 	0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x18, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x76, 0x65, 0x72,
 	0x73, 0x65, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66,
-	0x22, 0x6f, 0x0a, 0x0a, 0x41, 0x73, 0x73, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x2a,
-	0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x75, 0x6e,
+	0x12, 0x3e, 0x0a, 0x0d, 0x69, 0x73, 0x73, 0x75, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x64, 0x61, 0x74,
+	0x61, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72,
+	0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x49, 0x73, 0x73, 0x75, 0x61, 0x6e, 0x63, 0x65, 0x44, 0x61,
+	0x74, 0x61, 0x52, 0x0c, 0x69, 0x73, 0x73, 0x75, 0x61, 0x6e, 0x63, 0x65, 0x44, 0x61, 0x74, 0x61,
+	0x22, 0xc2, 0x01, 0x0a, 0x0c, 0x49, 0x73, 0x73, 0x75, 0x61, 0x6e, 0x63, 0x65, 0x44, 0x61, 0x74,
+	0x61, 0x12, 0x32, 0x0a, 0x0b, 0x6d, 0x65, 0x74, 0x61, 0x5f, 0x72, 0x65, 0x76, 0x65, 0x61, 0x6c,
+	0x18, 0x01, 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, 0x3c, 0x0a, 0x0e, 0x67, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73,
+	0x5f, 0x72, 0x65, 0x76, 0x65, 0x61, 0x6c, 0x18, 0x02, 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, 0x03, 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, 0x22, 0x6f, 0x0a, 0x0a, 0x41, 0x73, 0x73, 0x65, 0x74, 0x50, 0x72,
+	0x6f, 0x6f, 0x66, 0x12, 0x2a, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b,
+	0x32, 0x18, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x55,
+	0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x4b, 0x65, 0x79, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12,
+	0x35, 0x0a, 0x0a, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x6c, 0x65, 0x61, 0x66, 0x18, 0x04, 0x20,
+	0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x70,
+	0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x4c, 0x65, 0x61, 0x66, 0x52, 0x09, 0x61, 0x73, 0x73,
+	0x65, 0x74, 0x4c, 0x65, 0x61, 0x66, 0x22, 0x7d, 0x0a, 0x10, 0x50, 0x75, 0x73, 0x68, 0x50, 0x72,
+	0x6f, 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x03, 0x6b, 0x65,
+	0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72,
+	0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x55, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x4b, 0x65,
+	0x79, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x3d, 0x0a, 0x06, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72,
+	0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73,
+	0x65, 0x72, 0x70, 0x63, 0x2e, 0x55, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x46, 0x65, 0x64,
+	0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x52, 0x06, 0x73,
+	0x65, 0x72, 0x76, 0x65, 0x72, 0x22, 0x3f, 0x0a, 0x11, 0x50, 0x75, 0x73, 0x68, 0x50, 0x72, 0x6f,
+	0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2a, 0x0a, 0x03, 0x6b, 0x65,
+	0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72,
+	0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x55, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x4b, 0x65,
+	0x79, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x22, 0x0d, 0x0a, 0x0b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65,
+	0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x2d, 0x0a, 0x0c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73,
+	0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65,
+	0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x72, 0x75, 0x6e, 0x74, 0x69,
+	0x6d, 0x65, 0x49, 0x64, 0x22, 0x2d, 0x0a, 0x0a, 0x53, 0x79, 0x6e, 0x63, 0x54, 0x61, 0x72, 0x67,
+	0x65, 0x74, 0x12, 0x1f, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f,
+	0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x49, 0x44, 0x52,
+	0x02, 0x69, 0x64, 0x22, 0xaa, 0x01, 0x0a, 0x0b, 0x53, 0x79, 0x6e, 0x63, 0x52, 0x65, 0x71, 0x75,
+	0x65, 0x73, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x5f,
+	0x68, 0x6f, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x75, 0x6e, 0x69, 0x76,
+	0x65, 0x72, 0x73, 0x65, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x3a, 0x0a, 0x09, 0x73, 0x79, 0x6e, 0x63,
+	0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1d, 0x2e, 0x75, 0x6e,
 	0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x55, 0x6e, 0x69, 0x76, 0x65, 0x72,
-	0x73, 0x65, 0x4b, 0x65, 0x79, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x35, 0x0a, 0x0a, 0x61, 0x73,
-	0x73, 0x65, 0x74, 0x5f, 0x6c, 0x65, 0x61, 0x66, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16,
-	0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x73, 0x73,
-	0x65, 0x74, 0x4c, 0x65, 0x61, 0x66, 0x52, 0x09, 0x61, 0x73, 0x73, 0x65, 0x74, 0x4c, 0x65, 0x61,
-	0x66, 0x22, 0x7d, 0x0a, 0x10, 0x50, 0x75, 0x73, 0x68, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65,
-	0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01,
-	0x28, 0x0b, 0x32, 0x18, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63,
-	0x2e, 0x55, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x4b, 0x65, 0x79, 0x52, 0x03, 0x6b, 0x65,
-	0x79, 0x12, 0x3d, 0x0a, 0x06, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28,
-	0x0b, 0x32, 0x25, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e,
-	0x55, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69,
-	0x6f, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x52, 0x06, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72,
-	0x22, 0x3f, 0x0a, 0x11, 0x50, 0x75, 0x73, 0x68, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x73,
-	0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2a, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01,
-	0x28, 0x0b, 0x32, 0x18, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63,
-	0x2e, 0x55, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x4b, 0x65, 0x79, 0x52, 0x03, 0x6b, 0x65,
-	0x79, 0x22, 0x0d, 0x0a, 0x0b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
-	0x22, 0x2d, 0x0a, 0x0c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
-	0x12, 0x1d, 0x0a, 0x0a, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01,
-	0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x49, 0x64, 0x22,
-	0x2d, 0x0a, 0x0a, 0x53, 0x79, 0x6e, 0x63, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x1f, 0x0a,
-	0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x75, 0x6e, 0x69, 0x76,
-	0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x49, 0x44, 0x52, 0x02, 0x69, 0x64, 0x22, 0xaa,
-	0x01, 0x0a, 0x0b, 0x53, 0x79, 0x6e, 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x23,
-	0x0a, 0x0d, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x5f, 0x68, 0x6f, 0x73, 0x74, 0x18,
-	0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x48,
-	0x6f, 0x73, 0x74, 0x12, 0x3a, 0x0a, 0x09, 0x73, 0x79, 0x6e, 0x63, 0x5f, 0x6d, 0x6f, 0x64, 0x65,
-	0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1d, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73,
-	0x65, 0x72, 0x70, 0x63, 0x2e, 0x55, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x53, 0x79, 0x6e,
-	0x63, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x08, 0x73, 0x79, 0x6e, 0x63, 0x4d, 0x6f, 0x64, 0x65, 0x12,
-	0x3a, 0x0a, 0x0c, 0x73, 0x79, 0x6e, 0x63, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x18,
-	0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65,
-	0x72, 0x70, 0x63, 0x2e, 0x53, 0x79, 0x6e, 0x63, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x0b,
-	0x73, 0x79, 0x6e, 0x63, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x22, 0xd4, 0x01, 0x0a, 0x0e,
-	0x53, 0x79, 0x6e, 0x63, 0x65, 0x64, 0x55, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x12, 0x3f,
-	0x0a, 0x0e, 0x6f, 0x6c, 0x64, 0x5f, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x72, 0x6f, 0x6f, 0x74,
-	0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73,
-	0x65, 0x72, 0x70, 0x63, 0x2e, 0x55, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x52, 0x6f, 0x6f,
-	0x74, 0x52, 0x0c, 0x6f, 0x6c, 0x64, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x6f, 0x6f, 0x74, 0x12,
-	0x3f, 0x0a, 0x0e, 0x6e, 0x65, 0x77, 0x5f, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x72, 0x6f, 0x6f,
-	0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72,
-	0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x55, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x52, 0x6f,
-	0x6f, 0x74, 0x52, 0x0c, 0x6e, 0x65, 0x77, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x6f, 0x6f, 0x74,
-	0x12, 0x40, 0x0a, 0x10, 0x6e, 0x65, 0x77, 0x5f, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x6c, 0x65,
-	0x61, 0x76, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x75, 0x6e, 0x69,
-	0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x4c, 0x65,
-	0x61, 0x66, 0x52, 0x0e, 0x6e, 0x65, 0x77, 0x41, 0x73, 0x73, 0x65, 0x74, 0x4c, 0x65, 0x61, 0x76,
-	0x65, 0x73, 0x22, 0x0e, 0x0a, 0x0c, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65,
-	0x73, 0x74, 0x22, 0x56, 0x0a, 0x0c, 0x53, 0x79, 0x6e, 0x63, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,
-	0x73, 0x65, 0x12, 0x46, 0x0a, 0x10, 0x73, 0x79, 0x6e, 0x63, 0x65, 0x64, 0x5f, 0x75, 0x6e, 0x69,
-	0x76, 0x65, 0x72, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x75,
-	0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x79, 0x6e, 0x63, 0x65,
-	0x64, 0x55, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x52, 0x0f, 0x73, 0x79, 0x6e, 0x63, 0x65,
-	0x64, 0x55, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x73, 0x22, 0x3e, 0x0a, 0x18, 0x55, 0x6e,
-	0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,
-	0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x6f, 0x73, 0x74, 0x18, 0x01,
-	0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x68, 0x6f, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64,
-	0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x69, 0x64, 0x22, 0x1e, 0x0a, 0x1c, 0x4c, 0x69,
-	0x73, 0x74, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x72, 0x76,
-	0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x60, 0x0a, 0x1d, 0x4c, 0x69,
-	0x73, 0x74, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x72, 0x76,
-	0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3f, 0x0a, 0x07, 0x73,
-	0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x75,
-	0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x55, 0x6e, 0x69, 0x76, 0x65,
-	0x72, 0x73, 0x65, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x72,
-	0x76, 0x65, 0x72, 0x52, 0x07, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x22, 0x5d, 0x0a, 0x1a,
-	0x41, 0x64, 0x64, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x72,
-	0x76, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3f, 0x0a, 0x07, 0x73, 0x65,
-	0x72, 0x76, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x75, 0x6e,
+	0x73, 0x65, 0x53, 0x79, 0x6e, 0x63, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x08, 0x73, 0x79, 0x6e, 0x63,
+	0x4d, 0x6f, 0x64, 0x65, 0x12, 0x3a, 0x0a, 0x0c, 0x73, 0x79, 0x6e, 0x63, 0x5f, 0x74, 0x61, 0x72,
+	0x67, 0x65, 0x74, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x75, 0x6e, 0x69,
+	0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x79, 0x6e, 0x63, 0x54, 0x61, 0x72,
+	0x67, 0x65, 0x74, 0x52, 0x0b, 0x73, 0x79, 0x6e, 0x63, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73,
+	0x22, 0xd4, 0x01, 0x0a, 0x0e, 0x53, 0x79, 0x6e, 0x63, 0x65, 0x64, 0x55, 0x6e, 0x69, 0x76, 0x65,
+	0x72, 0x73, 0x65, 0x12, 0x3f, 0x0a, 0x0e, 0x6f, 0x6c, 0x64, 0x5f, 0x61, 0x73, 0x73, 0x65, 0x74,
+	0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x75, 0x6e,
 	0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x55, 0x6e, 0x69, 0x76, 0x65, 0x72,
-	0x73, 0x65, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x72, 0x76,
-	0x65, 0x72, 0x52, 0x07, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x22, 0x1d, 0x0a, 0x1b, 0x41,
-	0x64, 0x64, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x72, 0x76,
-	0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x60, 0x0a, 0x1d, 0x44, 0x65,
-	0x6c, 0x65, 0x74, 0x65, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65,
-	0x72, 0x76, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3f, 0x0a, 0x07, 0x73,
-	0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x75,
+	0x73, 0x65, 0x52, 0x6f, 0x6f, 0x74, 0x52, 0x0c, 0x6f, 0x6c, 0x64, 0x41, 0x73, 0x73, 0x65, 0x74,
+	0x52, 0x6f, 0x6f, 0x74, 0x12, 0x3f, 0x0a, 0x0e, 0x6e, 0x65, 0x77, 0x5f, 0x61, 0x73, 0x73, 0x65,
+	0x74, 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x75,
 	0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x55, 0x6e, 0x69, 0x76, 0x65,
-	0x72, 0x73, 0x65, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x72,
-	0x76, 0x65, 0x72, 0x52, 0x07, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x22, 0x20, 0x0a, 0x1e,
-	0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,
-	0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xb5,
-	0x01, 0x0a, 0x0d, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
-	0x12, 0x28, 0x0a, 0x10, 0x6e, 0x75, 0x6d, 0x5f, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x61, 0x73,
-	0x73, 0x65, 0x74, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x6e, 0x75, 0x6d, 0x54,
-	0x6f, 0x74, 0x61, 0x6c, 0x41, 0x73, 0x73, 0x65, 0x74, 0x73, 0x12, 0x28, 0x0a, 0x10, 0x6e, 0x75,
-	0x6d, 0x5f, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x18, 0x02,
-	0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x6e, 0x75, 0x6d, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x47, 0x72,
-	0x6f, 0x75, 0x70, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x75, 0x6d, 0x5f, 0x74, 0x6f, 0x74, 0x61,
-	0x6c, 0x5f, 0x73, 0x79, 0x6e, 0x63, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x6e,
-	0x75, 0x6d, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x53, 0x79, 0x6e, 0x63, 0x73, 0x12, 0x28, 0x0a, 0x10,
-	0x6e, 0x75, 0x6d, 0x5f, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x73,
-	0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x6e, 0x75, 0x6d, 0x54, 0x6f, 0x74, 0x61, 0x6c,
-	0x50, 0x72, 0x6f, 0x6f, 0x66, 0x73, 0x22, 0xcd, 0x02, 0x0a, 0x0f, 0x41, 0x73, 0x73, 0x65, 0x74,
-	0x53, 0x74, 0x61, 0x74, 0x73, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x2a, 0x0a, 0x11, 0x61, 0x73,
-	0x73, 0x65, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18,
-	0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x61, 0x73, 0x73, 0x65, 0x74, 0x4e, 0x61, 0x6d, 0x65,
-	0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x26, 0x0a, 0x0f, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f,
-	0x69, 0x64, 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52,
-	0x0d, 0x61, 0x73, 0x73, 0x65, 0x74, 0x49, 0x64, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x48,
-	0x0a, 0x11, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x66, 0x69, 0x6c,
-	0x74, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1c, 0x2e, 0x75, 0x6e, 0x69, 0x76,
-	0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x54, 0x79, 0x70,
-	0x65, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x52, 0x0f, 0x61, 0x73, 0x73, 0x65, 0x74, 0x54, 0x79,
-	0x70, 0x65, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x34, 0x0a, 0x07, 0x73, 0x6f, 0x72, 0x74,
-	0x5f, 0x62, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1b, 0x2e, 0x75, 0x6e, 0x69, 0x76,
-	0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x51, 0x75, 0x65,
-	0x72, 0x79, 0x53, 0x6f, 0x72, 0x74, 0x52, 0x06, 0x73, 0x6f, 0x72, 0x74, 0x42, 0x79, 0x12, 0x16,
-	0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06,
-	0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18,
-	0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x38, 0x0a, 0x09,
-	0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32,
-	0x1a, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x6f,
-	0x72, 0x74, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x09, 0x64, 0x69, 0x72,
-	0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x8d, 0x02, 0x0a, 0x12, 0x41, 0x73, 0x73, 0x65, 0x74,
-	0x53, 0x74, 0x61, 0x74, 0x73, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 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, 0x21, 0x0a, 0x0c, 0x67, 0x72,
-	0x6f, 0x75, 0x70, 0x5f, 0x73, 0x75, 0x70, 0x70, 0x6c, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03,
-	0x52, 0x0b, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x53, 0x75, 0x70, 0x70, 0x6c, 0x79, 0x12, 0x3f, 0x0a,
-	0x0c, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x18, 0x03, 0x20,
-	0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x70,
-	0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x73, 0x41, 0x73, 0x73, 0x65,
-	0x74, 0x52, 0x0b, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x41, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x12, 0x32,
-	0x0a, 0x05, 0x61, 0x73, 0x73, 0x65, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e,
-	0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x73, 0x73, 0x65,
-	0x74, 0x53, 0x74, 0x61, 0x74, 0x73, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x05, 0x61, 0x73, 0x73,
-	0x65, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x73, 0x79, 0x6e, 0x63,
-	0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x53, 0x79,
-	0x6e, 0x63, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x70, 0x72, 0x6f,
-	0x6f, 0x66, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x74, 0x6f, 0x74, 0x61, 0x6c,
-	0x50, 0x72, 0x6f, 0x6f, 0x66, 0x73, 0x22, 0xbc, 0x02, 0x0a, 0x0f, 0x41, 0x73, 0x73, 0x65, 0x74,
-	0x53, 0x74, 0x61, 0x74, 0x73, 0x41, 0x73, 0x73, 0x65, 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, 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, 0x12, 0x21, 0x0a, 0x0c, 0x74, 0x6f,
-	0x74, 0x61, 0x6c, 0x5f, 0x73, 0x75, 0x70, 0x70, 0x6c, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03,
-	0x52, 0x0b, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x53, 0x75, 0x70, 0x70, 0x6c, 0x79, 0x12, 0x1d, 0x0a,
-	0x0a, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28,
-	0x09, 0x52, 0x09, 0x61, 0x73, 0x73, 0x65, 0x74, 0x4e, 0x61, 0x6d, 0x65, 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, 0x25,
-	0x0a, 0x0e, 0x67, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74,
-	0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x67, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x48,
-	0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x2b, 0x0a, 0x11, 0x67, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73,
-	0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03,
-	0x52, 0x10, 0x67, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61,
-	0x6d, 0x70, 0x12, 0x21, 0x0a, 0x0c, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x5f, 0x70, 0x6f, 0x69,
-	0x6e, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72,
-	0x50, 0x6f, 0x69, 0x6e, 0x74, 0x22, 0x56, 0x0a, 0x12, 0x55, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73,
-	0x65, 0x41, 0x73, 0x73, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, 0x40, 0x0a, 0x0b, 0x61,
-	0x73, 0x73, 0x65, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b,
-	0x32, 0x1f, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x41,
-	0x73, 0x73, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x73, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f,
-	0x74, 0x52, 0x0a, 0x61, 0x73, 0x73, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x73, 0x22, 0x62, 0x0a,
-	0x12, 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75,
-	0x65, 0x73, 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d,
-	0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x73, 0x74,
-	0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x23, 0x0a, 0x0d,
-	0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x02, 0x20,
-	0x01, 0x28, 0x03, 0x52, 0x0c, 0x65, 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d,
-	0x70, 0x22, 0x51, 0x0a, 0x13, 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73,
-	0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3a, 0x0a, 0x06, 0x65, 0x76, 0x65, 0x6e,
-	0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65,
-	0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x65, 0x64, 0x55, 0x6e,
-	0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x06, 0x65, 0x76,
-	0x65, 0x6e, 0x74, 0x73, 0x22, 0x76, 0x0a, 0x15, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x65, 0x64, 0x55,
-	0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x12, 0x0a,
-	0x04, 0x64, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x61, 0x74,
-	0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x79, 0x6e, 0x63, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73,
-	0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, 0x73, 0x79, 0x6e, 0x63, 0x45, 0x76, 0x65, 0x6e,
-	0x74, 0x73, 0x12, 0x28, 0x0a, 0x10, 0x6e, 0x65, 0x77, 0x5f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x5f,
-	0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0e, 0x6e, 0x65,
-	0x77, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x22, 0xcf, 0x01, 0x0a,
-	0x1e, 0x53, 0x65, 0x74, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x79,
-	0x6e, 0x63, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12,
-	0x57, 0x0a, 0x13, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x5f, 0x73, 0x79, 0x6e, 0x63, 0x5f, 0x63,
-	0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x75,
-	0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x47, 0x6c, 0x6f, 0x62, 0x61,
+	0x72, 0x73, 0x65, 0x52, 0x6f, 0x6f, 0x74, 0x52, 0x0c, 0x6e, 0x65, 0x77, 0x41, 0x73, 0x73, 0x65,
+	0x74, 0x52, 0x6f, 0x6f, 0x74, 0x12, 0x40, 0x0a, 0x10, 0x6e, 0x65, 0x77, 0x5f, 0x61, 0x73, 0x73,
+	0x65, 0x74, 0x5f, 0x6c, 0x65, 0x61, 0x76, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32,
+	0x16, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x73,
+	0x73, 0x65, 0x74, 0x4c, 0x65, 0x61, 0x66, 0x52, 0x0e, 0x6e, 0x65, 0x77, 0x41, 0x73, 0x73, 0x65,
+	0x74, 0x4c, 0x65, 0x61, 0x76, 0x65, 0x73, 0x22, 0x0e, 0x0a, 0x0c, 0x53, 0x74, 0x61, 0x74, 0x73,
+	0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x56, 0x0a, 0x0c, 0x53, 0x79, 0x6e, 0x63, 0x52,
+	0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x46, 0x0a, 0x10, 0x73, 0x79, 0x6e, 0x63, 0x65,
+	0x64, 0x5f, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28,
+	0x0b, 0x32, 0x1b, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e,
+	0x53, 0x79, 0x6e, 0x63, 0x65, 0x64, 0x55, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x52, 0x0f,
+	0x73, 0x79, 0x6e, 0x63, 0x65, 0x64, 0x55, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x73, 0x22,
+	0x3e, 0x0a, 0x18, 0x55, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x46, 0x65, 0x64, 0x65, 0x72,
+	0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x68,
+	0x6f, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x68, 0x6f, 0x73, 0x74, 0x12,
+	0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x69, 0x64, 0x22,
+	0x1e, 0x0a, 0x1c, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,
+	0x6e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22,
+	0x60, 0x0a, 0x1d, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,
+	0x6e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
+	0x12, 0x3f, 0x0a, 0x07, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28,
+	0x0b, 0x32, 0x25, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e,
+	0x55, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69,
+	0x6f, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x52, 0x07, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72,
+	0x73, 0x22, 0x5d, 0x0a, 0x1a, 0x41, 0x64, 0x64, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69,
+	0x6f, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12,
+	0x3f, 0x0a, 0x07, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b,
+	0x32, 0x25, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x55,
+	0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,
+	0x6e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x52, 0x07, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x73,
+	0x22, 0x1d, 0x0a, 0x1b, 0x41, 0x64, 0x64, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,
+	0x6e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22,
+	0x60, 0x0a, 0x1d, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74,
+	0x69, 0x6f, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
+	0x12, 0x3f, 0x0a, 0x07, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28,
+	0x0b, 0x32, 0x25, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e,
+	0x55, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69,
+	0x6f, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x52, 0x07, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72,
+	0x73, 0x22, 0x20, 0x0a, 0x1e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x46, 0x65, 0x64, 0x65, 0x72,
+	0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f,
+	0x6e, 0x73, 0x65, 0x22, 0xb5, 0x01, 0x0a, 0x0d, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, 0x73,
+	0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x28, 0x0a, 0x10, 0x6e, 0x75, 0x6d, 0x5f, 0x74, 0x6f, 0x74,
+	0x61, 0x6c, 0x5f, 0x61, 0x73, 0x73, 0x65, 0x74, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52,
+	0x0e, 0x6e, 0x75, 0x6d, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x41, 0x73, 0x73, 0x65, 0x74, 0x73, 0x12,
+	0x28, 0x0a, 0x10, 0x6e, 0x75, 0x6d, 0x5f, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x67, 0x72, 0x6f,
+	0x75, 0x70, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x6e, 0x75, 0x6d, 0x54, 0x6f,
+	0x74, 0x61, 0x6c, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x75, 0x6d,
+	0x5f, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x73, 0x79, 0x6e, 0x63, 0x73, 0x18, 0x03, 0x20, 0x01,
+	0x28, 0x03, 0x52, 0x0d, 0x6e, 0x75, 0x6d, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x53, 0x79, 0x6e, 0x63,
+	0x73, 0x12, 0x28, 0x0a, 0x10, 0x6e, 0x75, 0x6d, 0x5f, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x70,
+	0x72, 0x6f, 0x6f, 0x66, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x6e, 0x75, 0x6d,
+	0x54, 0x6f, 0x74, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x73, 0x22, 0xcd, 0x02, 0x0a, 0x0f,
+	0x41, 0x73, 0x73, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x73, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12,
+	0x2a, 0x0a, 0x11, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x66, 0x69,
+	0x6c, 0x74, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x61, 0x73, 0x73, 0x65,
+	0x74, 0x4e, 0x61, 0x6d, 0x65, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x26, 0x0a, 0x0f, 0x61,
+	0x73, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x02,
+	0x20, 0x01, 0x28, 0x0c, 0x52, 0x0d, 0x61, 0x73, 0x73, 0x65, 0x74, 0x49, 0x64, 0x46, 0x69, 0x6c,
+	0x74, 0x65, 0x72, 0x12, 0x48, 0x0a, 0x11, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x74, 0x79, 0x70,
+	0x65, 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1c,
+	0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x73, 0x73,
+	0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x52, 0x0f, 0x61, 0x73,
+	0x73, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x34, 0x0a,
+	0x07, 0x73, 0x6f, 0x72, 0x74, 0x5f, 0x62, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1b,
+	0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x73, 0x73,
+	0x65, 0x74, 0x51, 0x75, 0x65, 0x72, 0x79, 0x53, 0x6f, 0x72, 0x74, 0x52, 0x06, 0x73, 0x6f, 0x72,
+	0x74, 0x42, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x05, 0x20,
+	0x01, 0x28, 0x05, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c,
+	0x69, 0x6d, 0x69, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69,
+	0x74, 0x12, 0x38, 0x0a, 0x09, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x07,
+	0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72,
+	0x70, 0x63, 0x2e, 0x53, 0x6f, 0x72, 0x74, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e,
+	0x52, 0x09, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x8d, 0x02, 0x0a, 0x12,
+	0x41, 0x73, 0x73, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x73, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68,
+	0x6f, 0x74, 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,
+	0x21, 0x0a, 0x0c, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x73, 0x75, 0x70, 0x70, 0x6c, 0x79, 0x18,
+	0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x53, 0x75, 0x70, 0x70,
+	0x6c, 0x79, 0x12, 0x3f, 0x0a, 0x0c, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x61, 0x6e, 0x63, 0x68,
+	0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65,
+	0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74,
+	0x73, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x0b, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x41, 0x6e, 0x63,
+	0x68, 0x6f, 0x72, 0x12, 0x32, 0x0a, 0x05, 0x61, 0x73, 0x73, 0x65, 0x74, 0x18, 0x04, 0x20, 0x01,
+	0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63,
+	0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x73, 0x41, 0x73, 0x73, 0x65, 0x74,
+	0x52, 0x05, 0x61, 0x73, 0x73, 0x65, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x6f, 0x74, 0x61, 0x6c,
+	0x5f, 0x73, 0x79, 0x6e, 0x63, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x74, 0x6f,
+	0x74, 0x61, 0x6c, 0x53, 0x79, 0x6e, 0x63, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x74, 0x6f, 0x74, 0x61,
+	0x6c, 0x5f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b,
+	0x74, 0x6f, 0x74, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x73, 0x22, 0xbc, 0x02, 0x0a, 0x0f,
+	0x41, 0x73, 0x73, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x73, 0x41, 0x73, 0x73, 0x65, 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, 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, 0x12,
+	0x21, 0x0a, 0x0c, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x73, 0x75, 0x70, 0x70, 0x6c, 0x79, 0x18,
+	0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x53, 0x75, 0x70, 0x70,
+	0x6c, 0x79, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65,
+	0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x73, 0x73, 0x65, 0x74, 0x4e, 0x61, 0x6d,
+	0x65, 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, 0x25, 0x0a, 0x0e, 0x67, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x5f, 0x68,
+	0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x67, 0x65, 0x6e,
+	0x65, 0x73, 0x69, 0x73, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x2b, 0x0a, 0x11, 0x67, 0x65,
+	0x6e, 0x65, 0x73, 0x69, 0x73, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18,
+	0x07, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x67, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x54, 0x69,
+	0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x21, 0x0a, 0x0c, 0x61, 0x6e, 0x63, 0x68, 0x6f,
+	0x72, 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x61,
+	0x6e, 0x63, 0x68, 0x6f, 0x72, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x22, 0x56, 0x0a, 0x12, 0x55, 0x6e,
+	0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x41, 0x73, 0x73, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x73,
+	0x12, 0x40, 0x0a, 0x0b, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x73, 0x18,
+	0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65,
+	0x72, 0x70, 0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x73, 0x53, 0x6e,
+	0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x0a, 0x61, 0x73, 0x73, 0x65, 0x74, 0x53, 0x74, 0x61,
+	0x74, 0x73, 0x22, 0x62, 0x0a, 0x12, 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, 0x76, 0x65, 0x6e, 0x74,
+	0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x73, 0x74, 0x61, 0x72,
+	0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28,
+	0x03, 0x52, 0x0e, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d,
+	0x70, 0x12, 0x23, 0x0a, 0x0d, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61,
+	0x6d, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x65, 0x6e, 0x64, 0x54, 0x69, 0x6d,
+	0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0x51, 0x0a, 0x13, 0x51, 0x75, 0x65, 0x72, 0x79, 0x45,
+	0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3a, 0x0a,
+	0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e,
+	0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x47, 0x72, 0x6f, 0x75,
+	0x70, 0x65, 0x64, 0x55, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74,
+	0x73, 0x52, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x76, 0x0a, 0x15, 0x47, 0x72, 0x6f,
+	0x75, 0x70, 0x65, 0x64, 0x55, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x45, 0x76, 0x65, 0x6e,
+	0x74, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,
+	0x52, 0x04, 0x64, 0x61, 0x74, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x79, 0x6e, 0x63, 0x5f, 0x65,
+	0x76, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, 0x73, 0x79, 0x6e,
+	0x63, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x28, 0x0a, 0x10, 0x6e, 0x65, 0x77, 0x5f, 0x70,
+	0x72, 0x6f, 0x6f, 0x66, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28,
+	0x04, 0x52, 0x0e, 0x6e, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x45, 0x76, 0x65, 0x6e, 0x74,
+	0x73, 0x22, 0xcf, 0x01, 0x0a, 0x1e, 0x53, 0x65, 0x74, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74,
+	0x69, 0x6f, 0x6e, 0x53, 0x79, 0x6e, 0x63, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71,
+	0x75, 0x65, 0x73, 0x74, 0x12, 0x57, 0x0a, 0x13, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x5f, 0x73,
+	0x79, 0x6e, 0x63, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28,
+	0x0b, 0x32, 0x27, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e,
+	0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,
+	0x53, 0x79, 0x6e, 0x63, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x11, 0x67, 0x6c, 0x6f, 0x62,
+	0x61, 0x6c, 0x53, 0x79, 0x6e, 0x63, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x12, 0x54, 0x0a,
+	0x12, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x73, 0x79, 0x6e, 0x63, 0x5f, 0x63, 0x6f, 0x6e, 0x66,
+	0x69, 0x67, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x75, 0x6e, 0x69, 0x76,
+	0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x46, 0x65, 0x64,
+	0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x79, 0x6e, 0x63, 0x43, 0x6f, 0x6e, 0x66, 0x69,
+	0x67, 0x52, 0x10, 0x61, 0x73, 0x73, 0x65, 0x74, 0x53, 0x79, 0x6e, 0x63, 0x43, 0x6f, 0x6e, 0x66,
+	0x69, 0x67, 0x73, 0x22, 0x21, 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61,
+	0x74, 0x69, 0x6f, 0x6e, 0x53, 0x79, 0x6e, 0x63, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65,
+	0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xab, 0x01, 0x0a, 0x1a, 0x47, 0x6c, 0x6f, 0x62, 0x61,
 	0x6c, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x79, 0x6e, 0x63, 0x43,
-	0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x11, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x53, 0x79, 0x6e,
-	0x63, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x12, 0x54, 0x0a, 0x12, 0x61, 0x73, 0x73, 0x65,
-	0x74, 0x5f, 0x73, 0x79, 0x6e, 0x63, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x18, 0x02,
-	0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72,
-	0x70, 0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69,
-	0x6f, 0x6e, 0x53, 0x79, 0x6e, 0x63, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x10, 0x61, 0x73,
-	0x73, 0x65, 0x74, 0x53, 0x79, 0x6e, 0x63, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x22, 0x21,
-	0x0a, 0x1f, 0x53, 0x65, 0x74, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53,
-	0x79, 0x6e, 0x63, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
-	0x65, 0x22, 0xab, 0x01, 0x0a, 0x1a, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x46, 0x65, 0x64, 0x65,
-	0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x79, 0x6e, 0x63, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67,
-	0x12, 0x35, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01,
-	0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72,
-	0x70, 0x63, 0x2e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x54, 0x79, 0x70, 0x65, 0x52, 0x09, 0x70, 0x72,
-	0x6f, 0x6f, 0x66, 0x54, 0x79, 0x70, 0x65, 0x12, 0x2a, 0x0a, 0x11, 0x61, 0x6c, 0x6c, 0x6f, 0x77,
-	0x5f, 0x73, 0x79, 0x6e, 0x63, 0x5f, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x18, 0x02, 0x20, 0x01,
-	0x28, 0x08, 0x52, 0x0f, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x53, 0x79, 0x6e, 0x63, 0x49, 0x6e, 0x73,
-	0x65, 0x72, 0x74, 0x12, 0x2a, 0x0a, 0x11, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x73, 0x79, 0x6e,
-	0x63, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f,
-	0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x53, 0x79, 0x6e, 0x63, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x22,
-	0x94, 0x01, 0x0a, 0x19, 0x41, 0x73, 0x73, 0x65, 0x74, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74,
-	0x69, 0x6f, 0x6e, 0x53, 0x79, 0x6e, 0x63, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x1f, 0x0a,
-	0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x75, 0x6e, 0x69, 0x76,
-	0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x49, 0x44, 0x52, 0x02, 0x69, 0x64, 0x12, 0x2a,
-	0x0a, 0x11, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x73, 0x79, 0x6e, 0x63, 0x5f, 0x69, 0x6e, 0x73,
-	0x65, 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x61, 0x6c, 0x6c, 0x6f, 0x77,
-	0x53, 0x79, 0x6e, 0x63, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x12, 0x2a, 0x0a, 0x11, 0x61, 0x6c,
-	0x6c, 0x6f, 0x77, 0x5f, 0x73, 0x79, 0x6e, 0x63, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x18,
-	0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x53, 0x79, 0x6e, 0x63,
-	0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x22, 0x43, 0x0a, 0x20, 0x51, 0x75, 0x65, 0x72, 0x79, 0x46,
+	0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x35, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x5f, 0x74,
+	0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x75, 0x6e, 0x69, 0x76,
+	0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x54, 0x79, 0x70,
+	0x65, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x54, 0x79, 0x70, 0x65, 0x12, 0x2a, 0x0a, 0x11,
+	0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x73, 0x79, 0x6e, 0x63, 0x5f, 0x69, 0x6e, 0x73, 0x65, 0x72,
+	0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x53, 0x79,
+	0x6e, 0x63, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x12, 0x2a, 0x0a, 0x11, 0x61, 0x6c, 0x6c, 0x6f,
+	0x77, 0x5f, 0x73, 0x79, 0x6e, 0x63, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x03, 0x20,
+	0x01, 0x28, 0x08, 0x52, 0x0f, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x53, 0x79, 0x6e, 0x63, 0x45, 0x78,
+	0x70, 0x6f, 0x72, 0x74, 0x22, 0x94, 0x01, 0x0a, 0x19, 0x41, 0x73, 0x73, 0x65, 0x74, 0x46, 0x65,
+	0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x79, 0x6e, 0x63, 0x43, 0x6f, 0x6e, 0x66,
+	0x69, 0x67, 0x12, 0x1f, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f,
+	0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x49, 0x44, 0x52,
+	0x02, 0x69, 0x64, 0x12, 0x2a, 0x0a, 0x11, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x73, 0x79, 0x6e,
+	0x63, 0x5f, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f,
+	0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x53, 0x79, 0x6e, 0x63, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x12,
+	0x2a, 0x0a, 0x11, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x73, 0x79, 0x6e, 0x63, 0x5f, 0x65, 0x78,
+	0x70, 0x6f, 0x72, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x61, 0x6c, 0x6c, 0x6f,
+	0x77, 0x53, 0x79, 0x6e, 0x63, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x22, 0x43, 0x0a, 0x20, 0x51,
+	0x75, 0x65, 0x72, 0x79, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x79,
+	0x6e, 0x63, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12,
+	0x1f, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x75, 0x6e,
+	0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x49, 0x44, 0x52, 0x02, 0x69, 0x64,
+	0x22, 0xd2, 0x01, 0x0a, 0x21, 0x51, 0x75, 0x65, 0x72, 0x79, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61,
+	0x74, 0x69, 0x6f, 0x6e, 0x53, 0x79, 0x6e, 0x63, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65,
+	0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x57, 0x0a, 0x13, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c,
+	0x5f, 0x73, 0x79, 0x6e, 0x63, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x18, 0x01, 0x20,
+	0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x70,
+	0x63, 0x2e, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69,
+	0x6f, 0x6e, 0x53, 0x79, 0x6e, 0x63, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x11, 0x67, 0x6c,
+	0x6f, 0x62, 0x61, 0x6c, 0x53, 0x79, 0x6e, 0x63, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x12,
+	0x54, 0x0a, 0x12, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x73, 0x79, 0x6e, 0x63, 0x5f, 0x63, 0x6f,
+	0x6e, 0x66, 0x69, 0x67, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x75, 0x6e,
+	0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x46,
 	0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x79, 0x6e, 0x63, 0x43, 0x6f, 0x6e,
-	0x66, 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x02, 0x69, 0x64,
-	0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73,
-	0x65, 0x72, 0x70, 0x63, 0x2e, 0x49, 0x44, 0x52, 0x02, 0x69, 0x64, 0x22, 0xd2, 0x01, 0x0a, 0x21,
-	0x51, 0x75, 0x65, 0x72, 0x79, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53,
-	0x79, 0x6e, 0x63, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
-	0x65, 0x12, 0x57, 0x0a, 0x13, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x5f, 0x73, 0x79, 0x6e, 0x63,
-	0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27,
-	0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x47, 0x6c, 0x6f,
-	0x62, 0x61, 0x6c, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x79, 0x6e,
-	0x63, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x11, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x53,
-	0x79, 0x6e, 0x63, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x12, 0x54, 0x0a, 0x12, 0x61, 0x73,
-	0x73, 0x65, 0x74, 0x5f, 0x73, 0x79, 0x6e, 0x63, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73,
-	0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73,
-	0x65, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61,
-	0x74, 0x69, 0x6f, 0x6e, 0x53, 0x79, 0x6e, 0x63, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x10,
-	0x61, 0x73, 0x73, 0x65, 0x74, 0x53, 0x79, 0x6e, 0x63, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73,
-	0x2a, 0x59, 0x0a, 0x09, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a,
-	0x16, 0x50, 0x52, 0x4f, 0x4f, 0x46, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50,
-	0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x17, 0x0a, 0x13, 0x50, 0x52, 0x4f,
-	0x4f, 0x46, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x49, 0x53, 0x53, 0x55, 0x41, 0x4e, 0x43, 0x45,
-	0x10, 0x01, 0x12, 0x17, 0x0a, 0x13, 0x50, 0x52, 0x4f, 0x4f, 0x46, 0x5f, 0x54, 0x59, 0x50, 0x45,
-	0x5f, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x10, 0x02, 0x2a, 0x39, 0x0a, 0x10, 0x55,
-	0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x53, 0x79, 0x6e, 0x63, 0x4d, 0x6f, 0x64, 0x65, 0x12,
-	0x16, 0x0a, 0x12, 0x53, 0x59, 0x4e, 0x43, 0x5f, 0x49, 0x53, 0x53, 0x55, 0x41, 0x4e, 0x43, 0x45,
-	0x5f, 0x4f, 0x4e, 0x4c, 0x59, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x53, 0x59, 0x4e, 0x43, 0x5f,
-	0x46, 0x55, 0x4c, 0x4c, 0x10, 0x01, 0x2a, 0xd1, 0x01, 0x0a, 0x0e, 0x41, 0x73, 0x73, 0x65, 0x74,
-	0x51, 0x75, 0x65, 0x72, 0x79, 0x53, 0x6f, 0x72, 0x74, 0x12, 0x10, 0x0a, 0x0c, 0x53, 0x4f, 0x52,
-	0x54, 0x5f, 0x42, 0x59, 0x5f, 0x4e, 0x4f, 0x4e, 0x45, 0x10, 0x00, 0x12, 0x16, 0x0a, 0x12, 0x53,
-	0x4f, 0x52, 0x54, 0x5f, 0x42, 0x59, 0x5f, 0x41, 0x53, 0x53, 0x45, 0x54, 0x5f, 0x4e, 0x41, 0x4d,
-	0x45, 0x10, 0x01, 0x12, 0x14, 0x0a, 0x10, 0x53, 0x4f, 0x52, 0x54, 0x5f, 0x42, 0x59, 0x5f, 0x41,
-	0x53, 0x53, 0x45, 0x54, 0x5f, 0x49, 0x44, 0x10, 0x02, 0x12, 0x16, 0x0a, 0x12, 0x53, 0x4f, 0x52,
-	0x54, 0x5f, 0x42, 0x59, 0x5f, 0x41, 0x53, 0x53, 0x45, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x10,
-	0x03, 0x12, 0x17, 0x0a, 0x13, 0x53, 0x4f, 0x52, 0x54, 0x5f, 0x42, 0x59, 0x5f, 0x54, 0x4f, 0x54,
-	0x41, 0x4c, 0x5f, 0x53, 0x59, 0x4e, 0x43, 0x53, 0x10, 0x04, 0x12, 0x18, 0x0a, 0x14, 0x53, 0x4f,
-	0x52, 0x54, 0x5f, 0x42, 0x59, 0x5f, 0x54, 0x4f, 0x54, 0x41, 0x4c, 0x5f, 0x50, 0x52, 0x4f, 0x4f,
-	0x46, 0x53, 0x10, 0x05, 0x12, 0x1a, 0x0a, 0x16, 0x53, 0x4f, 0x52, 0x54, 0x5f, 0x42, 0x59, 0x5f,
-	0x47, 0x45, 0x4e, 0x45, 0x53, 0x49, 0x53, 0x5f, 0x48, 0x45, 0x49, 0x47, 0x48, 0x54, 0x10, 0x06,
-	0x12, 0x18, 0x0a, 0x14, 0x53, 0x4f, 0x52, 0x54, 0x5f, 0x42, 0x59, 0x5f, 0x54, 0x4f, 0x54, 0x41,
-	0x4c, 0x5f, 0x53, 0x55, 0x50, 0x50, 0x4c, 0x59, 0x10, 0x07, 0x2a, 0x40, 0x0a, 0x0d, 0x53, 0x6f,
-	0x72, 0x74, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x12, 0x53,
-	0x4f, 0x52, 0x54, 0x5f, 0x44, 0x49, 0x52, 0x45, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x41, 0x53,
-	0x43, 0x10, 0x00, 0x12, 0x17, 0x0a, 0x13, 0x53, 0x4f, 0x52, 0x54, 0x5f, 0x44, 0x49, 0x52, 0x45,
-	0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x44, 0x45, 0x53, 0x43, 0x10, 0x01, 0x2a, 0x5f, 0x0a, 0x0f,
-	0x41, 0x73, 0x73, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12,
-	0x15, 0x0a, 0x11, 0x46, 0x49, 0x4c, 0x54, 0x45, 0x52, 0x5f, 0x41, 0x53, 0x53, 0x45, 0x54, 0x5f,
-	0x4e, 0x4f, 0x4e, 0x45, 0x10, 0x00, 0x12, 0x17, 0x0a, 0x13, 0x46, 0x49, 0x4c, 0x54, 0x45, 0x52,
-	0x5f, 0x41, 0x53, 0x53, 0x45, 0x54, 0x5f, 0x4e, 0x4f, 0x52, 0x4d, 0x41, 0x4c, 0x10, 0x01, 0x12,
-	0x1c, 0x0a, 0x18, 0x46, 0x49, 0x4c, 0x54, 0x45, 0x52, 0x5f, 0x41, 0x53, 0x53, 0x45, 0x54, 0x5f,
-	0x43, 0x4f, 0x4c, 0x4c, 0x45, 0x43, 0x54, 0x49, 0x42, 0x4c, 0x45, 0x10, 0x02, 0x32, 0xf6, 0x0c,
-	0x0a, 0x08, 0x55, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x12, 0x59, 0x0a, 0x0e, 0x4d, 0x75,
-	0x6c, 0x74, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x52, 0x6f, 0x6f, 0x74, 0x12, 0x22, 0x2e, 0x75,
-	0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x4d, 0x75, 0x6c, 0x74, 0x69,
-	0x76, 0x65, 0x72, 0x73, 0x65, 0x52, 0x6f, 0x6f, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
-	0x1a, 0x23, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x4d,
-	0x75, 0x6c, 0x74, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x52, 0x6f, 0x6f, 0x74, 0x52, 0x65, 0x73,
-	0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4b, 0x0a, 0x0a, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x6f,
-	0x6f, 0x74, 0x73, 0x12, 0x1d, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x70,
-	0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x6f, 0x6f, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65,
-	0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63,
-	0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x6f, 0x6f, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,
-	0x73, 0x65, 0x12, 0x4e, 0x0a, 0x0f, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x73, 0x73, 0x65, 0x74,
-	0x52, 0x6f, 0x6f, 0x74, 0x73, 0x12, 0x1b, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65,
-	0x72, 0x70, 0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x6f, 0x6f, 0x74, 0x51, 0x75, 0x65,
-	0x72, 0x79, 0x1a, 0x1e, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63,
-	0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x6f, 0x6f, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,
-	0x73, 0x65, 0x12, 0x50, 0x0a, 0x0f, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x41, 0x73, 0x73, 0x65,
-	0x74, 0x52, 0x6f, 0x6f, 0x74, 0x12, 0x1c, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65,
-	0x72, 0x70, 0x63, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x6f, 0x6f, 0x74, 0x51, 0x75,
-	0x65, 0x72, 0x79, 0x1a, 0x1f, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x70,
-	0x63, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x6f, 0x6f, 0x74, 0x52, 0x65, 0x73, 0x70,
-	0x6f, 0x6e, 0x73, 0x65, 0x12, 0x55, 0x0a, 0x0d, 0x41, 0x73, 0x73, 0x65, 0x74, 0x4c, 0x65, 0x61,
-	0x66, 0x4b, 0x65, 0x79, 0x73, 0x12, 0x21, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65,
-	0x72, 0x70, 0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x4c, 0x65, 0x61, 0x66, 0x4b, 0x65, 0x79,
-	0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65,
-	0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x4c, 0x65, 0x61, 0x66,
-	0x4b, 0x65, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3e, 0x0a, 0x0b, 0x41,
-	0x73, 0x73, 0x65, 0x74, 0x4c, 0x65, 0x61, 0x76, 0x65, 0x73, 0x12, 0x0f, 0x2e, 0x75, 0x6e, 0x69,
-	0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x49, 0x44, 0x1a, 0x1e, 0x2e, 0x75, 0x6e,
-	0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x4c,
-	0x65, 0x61, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x47, 0x0a, 0x0a, 0x51,
-	0x75, 0x65, 0x72, 0x79, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x18, 0x2e, 0x75, 0x6e, 0x69, 0x76,
-	0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x55, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65,
-	0x4b, 0x65, 0x79, 0x1a, 0x1f, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x70,
-	0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70,
-	0x6f, 0x6e, 0x73, 0x65, 0x12, 0x47, 0x0a, 0x0b, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x50, 0x72,
-	0x6f, 0x6f, 0x66, 0x12, 0x17, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x70,
-	0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x1a, 0x1f, 0x2e, 0x75,
-	0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74,
-	0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4a, 0x0a,
-	0x09, 0x50, 0x75, 0x73, 0x68, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x1d, 0x2e, 0x75, 0x6e, 0x69,
-	0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x50, 0x75, 0x73, 0x68, 0x50, 0x72, 0x6f,
-	0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x75, 0x6e, 0x69, 0x76,
-	0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x50, 0x75, 0x73, 0x68, 0x50, 0x72, 0x6f, 0x6f,
-	0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3b, 0x0a, 0x04, 0x49, 0x6e, 0x66,
-	0x6f, 0x12, 0x18, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e,
-	0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x75, 0x6e,
-	0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65,
-	0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x43, 0x0a, 0x0c, 0x53, 0x79, 0x6e, 0x63, 0x55, 0x6e,
-	0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x12, 0x18, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73,
-	0x65, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x79, 0x6e, 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
-	0x1a, 0x19, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x53,
-	0x79, 0x6e, 0x63, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6e, 0x0a, 0x15, 0x4c,
-	0x69, 0x73, 0x74, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x72,
-	0x76, 0x65, 0x72, 0x73, 0x12, 0x29, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72,
+	0x66, 0x69, 0x67, 0x52, 0x10, 0x61, 0x73, 0x73, 0x65, 0x74, 0x53, 0x79, 0x6e, 0x63, 0x43, 0x6f,
+	0x6e, 0x66, 0x69, 0x67, 0x73, 0x2a, 0x59, 0x0a, 0x09, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x54, 0x79,
+	0x70, 0x65, 0x12, 0x1a, 0x0a, 0x16, 0x50, 0x52, 0x4f, 0x4f, 0x46, 0x5f, 0x54, 0x59, 0x50, 0x45,
+	0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x17,
+	0x0a, 0x13, 0x50, 0x52, 0x4f, 0x4f, 0x46, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x49, 0x53, 0x53,
+	0x55, 0x41, 0x4e, 0x43, 0x45, 0x10, 0x01, 0x12, 0x17, 0x0a, 0x13, 0x50, 0x52, 0x4f, 0x4f, 0x46,
+	0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x10, 0x02,
+	0x2a, 0x39, 0x0a, 0x10, 0x55, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x53, 0x79, 0x6e, 0x63,
+	0x4d, 0x6f, 0x64, 0x65, 0x12, 0x16, 0x0a, 0x12, 0x53, 0x59, 0x4e, 0x43, 0x5f, 0x49, 0x53, 0x53,
+	0x55, 0x41, 0x4e, 0x43, 0x45, 0x5f, 0x4f, 0x4e, 0x4c, 0x59, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09,
+	0x53, 0x59, 0x4e, 0x43, 0x5f, 0x46, 0x55, 0x4c, 0x4c, 0x10, 0x01, 0x2a, 0xd1, 0x01, 0x0a, 0x0e,
+	0x41, 0x73, 0x73, 0x65, 0x74, 0x51, 0x75, 0x65, 0x72, 0x79, 0x53, 0x6f, 0x72, 0x74, 0x12, 0x10,
+	0x0a, 0x0c, 0x53, 0x4f, 0x52, 0x54, 0x5f, 0x42, 0x59, 0x5f, 0x4e, 0x4f, 0x4e, 0x45, 0x10, 0x00,
+	0x12, 0x16, 0x0a, 0x12, 0x53, 0x4f, 0x52, 0x54, 0x5f, 0x42, 0x59, 0x5f, 0x41, 0x53, 0x53, 0x45,
+	0x54, 0x5f, 0x4e, 0x41, 0x4d, 0x45, 0x10, 0x01, 0x12, 0x14, 0x0a, 0x10, 0x53, 0x4f, 0x52, 0x54,
+	0x5f, 0x42, 0x59, 0x5f, 0x41, 0x53, 0x53, 0x45, 0x54, 0x5f, 0x49, 0x44, 0x10, 0x02, 0x12, 0x16,
+	0x0a, 0x12, 0x53, 0x4f, 0x52, 0x54, 0x5f, 0x42, 0x59, 0x5f, 0x41, 0x53, 0x53, 0x45, 0x54, 0x5f,
+	0x54, 0x59, 0x50, 0x45, 0x10, 0x03, 0x12, 0x17, 0x0a, 0x13, 0x53, 0x4f, 0x52, 0x54, 0x5f, 0x42,
+	0x59, 0x5f, 0x54, 0x4f, 0x54, 0x41, 0x4c, 0x5f, 0x53, 0x59, 0x4e, 0x43, 0x53, 0x10, 0x04, 0x12,
+	0x18, 0x0a, 0x14, 0x53, 0x4f, 0x52, 0x54, 0x5f, 0x42, 0x59, 0x5f, 0x54, 0x4f, 0x54, 0x41, 0x4c,
+	0x5f, 0x50, 0x52, 0x4f, 0x4f, 0x46, 0x53, 0x10, 0x05, 0x12, 0x1a, 0x0a, 0x16, 0x53, 0x4f, 0x52,
+	0x54, 0x5f, 0x42, 0x59, 0x5f, 0x47, 0x45, 0x4e, 0x45, 0x53, 0x49, 0x53, 0x5f, 0x48, 0x45, 0x49,
+	0x47, 0x48, 0x54, 0x10, 0x06, 0x12, 0x18, 0x0a, 0x14, 0x53, 0x4f, 0x52, 0x54, 0x5f, 0x42, 0x59,
+	0x5f, 0x54, 0x4f, 0x54, 0x41, 0x4c, 0x5f, 0x53, 0x55, 0x50, 0x50, 0x4c, 0x59, 0x10, 0x07, 0x2a,
+	0x40, 0x0a, 0x0d, 0x53, 0x6f, 0x72, 0x74, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e,
+	0x12, 0x16, 0x0a, 0x12, 0x53, 0x4f, 0x52, 0x54, 0x5f, 0x44, 0x49, 0x52, 0x45, 0x43, 0x54, 0x49,
+	0x4f, 0x4e, 0x5f, 0x41, 0x53, 0x43, 0x10, 0x00, 0x12, 0x17, 0x0a, 0x13, 0x53, 0x4f, 0x52, 0x54,
+	0x5f, 0x44, 0x49, 0x52, 0x45, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x44, 0x45, 0x53, 0x43, 0x10,
+	0x01, 0x2a, 0x5f, 0x0a, 0x0f, 0x41, 0x73, 0x73, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x46, 0x69,
+	0x6c, 0x74, 0x65, 0x72, 0x12, 0x15, 0x0a, 0x11, 0x46, 0x49, 0x4c, 0x54, 0x45, 0x52, 0x5f, 0x41,
+	0x53, 0x53, 0x45, 0x54, 0x5f, 0x4e, 0x4f, 0x4e, 0x45, 0x10, 0x00, 0x12, 0x17, 0x0a, 0x13, 0x46,
+	0x49, 0x4c, 0x54, 0x45, 0x52, 0x5f, 0x41, 0x53, 0x53, 0x45, 0x54, 0x5f, 0x4e, 0x4f, 0x52, 0x4d,
+	0x41, 0x4c, 0x10, 0x01, 0x12, 0x1c, 0x0a, 0x18, 0x46, 0x49, 0x4c, 0x54, 0x45, 0x52, 0x5f, 0x41,
+	0x53, 0x53, 0x45, 0x54, 0x5f, 0x43, 0x4f, 0x4c, 0x4c, 0x45, 0x43, 0x54, 0x49, 0x42, 0x4c, 0x45,
+	0x10, 0x02, 0x32, 0xf6, 0x0c, 0x0a, 0x08, 0x55, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x12,
+	0x59, 0x0a, 0x0e, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x52, 0x6f, 0x6f,
+	0x74, 0x12, 0x22, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e,
+	0x4d, 0x75, 0x6c, 0x74, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x52, 0x6f, 0x6f, 0x74, 0x52, 0x65,
+	0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65,
+	0x72, 0x70, 0x63, 0x2e, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x52, 0x6f,
+	0x6f, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4b, 0x0a, 0x0a, 0x41, 0x73,
+	0x73, 0x65, 0x74, 0x52, 0x6f, 0x6f, 0x74, 0x73, 0x12, 0x1d, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65,
+	0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x6f, 0x6f, 0x74,
+	0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72,
+	0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x6f, 0x6f, 0x74, 0x52,
+	0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4e, 0x0a, 0x0f, 0x51, 0x75, 0x65, 0x72, 0x79,
+	0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x6f, 0x6f, 0x74, 0x73, 0x12, 0x1b, 0x2e, 0x75, 0x6e, 0x69,
+	0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x6f,
+	0x6f, 0x74, 0x51, 0x75, 0x65, 0x72, 0x79, 0x1a, 0x1e, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72,
+	0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x6f, 0x6f, 0x74, 0x52,
+	0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x50, 0x0a, 0x0f, 0x44, 0x65, 0x6c, 0x65, 0x74,
+	0x65, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x6f, 0x6f, 0x74, 0x12, 0x1c, 0x2e, 0x75, 0x6e, 0x69,
+	0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52,
+	0x6f, 0x6f, 0x74, 0x51, 0x75, 0x65, 0x72, 0x79, 0x1a, 0x1f, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65,
+	0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x6f, 0x6f,
+	0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x55, 0x0a, 0x0d, 0x41, 0x73, 0x73,
+	0x65, 0x74, 0x4c, 0x65, 0x61, 0x66, 0x4b, 0x65, 0x79, 0x73, 0x12, 0x21, 0x2e, 0x75, 0x6e, 0x69,
+	0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x4c, 0x65,
+	0x61, 0x66, 0x4b, 0x65, 0x79, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e,
+	0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x73, 0x73, 0x65,
+	0x74, 0x4c, 0x65, 0x61, 0x66, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
+	0x12, 0x3e, 0x0a, 0x0b, 0x41, 0x73, 0x73, 0x65, 0x74, 0x4c, 0x65, 0x61, 0x76, 0x65, 0x73, 0x12,
+	0x0f, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x49, 0x44,
+	0x1a, 0x1e, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x41,
+	0x73, 0x73, 0x65, 0x74, 0x4c, 0x65, 0x61, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
+	0x12, 0x47, 0x0a, 0x0a, 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x18,
+	0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x55, 0x6e, 0x69,
+	0x76, 0x65, 0x72, 0x73, 0x65, 0x4b, 0x65, 0x79, 0x1a, 0x1f, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65,
+	0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x6f,
+	0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x47, 0x0a, 0x0b, 0x49, 0x6e, 0x73,
+	0x65, 0x72, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x17, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65,
+	0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x6f,
+	0x66, 0x1a, 0x1f, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e,
+	0x41, 0x73, 0x73, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,
+	0x73, 0x65, 0x12, 0x4a, 0x0a, 0x09, 0x50, 0x75, 0x73, 0x68, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12,
+	0x1d, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x50, 0x75,
+	0x73, 0x68, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e,
+	0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x50, 0x75, 0x73,
+	0x68, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3b,
+	0x0a, 0x04, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x18, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73,
+	0x65, 0x72, 0x70, 0x63, 0x2e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
+	0x1a, 0x19, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x49,
+	0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x43, 0x0a, 0x0c, 0x53,
+	0x79, 0x6e, 0x63, 0x55, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x12, 0x18, 0x2e, 0x75, 0x6e,
+	0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x79, 0x6e, 0x63, 0x52, 0x65,
+	0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65,
+	0x72, 0x70, 0x63, 0x2e, 0x53, 0x79, 0x6e, 0x63, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
+	0x12, 0x6e, 0x0a, 0x15, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69,
+	0x6f, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x12, 0x29, 0x2e, 0x75, 0x6e, 0x69, 0x76,
+	0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x65, 0x64, 0x65,
+	0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71,
+	0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72,
 	0x70, 0x63, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,
-	0x6e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a,
-	0x2a, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x69,
-	0x73, 0x74, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x72, 0x76,
-	0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x68, 0x0a, 0x13, 0x41,
+	0x6e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
+	0x12, 0x68, 0x0a, 0x13, 0x41, 0x64, 0x64, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,
+	0x6e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x12, 0x27, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72,
+	0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x64, 0x64, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74,
+	0x69, 0x6f, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
+	0x1a, 0x28, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x41,
 	0x64, 0x64, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x72, 0x76,
-	0x65, 0x72, 0x12, 0x27, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63,
-	0x2e, 0x41, 0x64, 0x64, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65,
-	0x72, 0x76, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x75, 0x6e,
-	0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x64, 0x64, 0x46, 0x65, 0x64,
-	0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x52, 0x65, 0x73,
-	0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x71, 0x0a, 0x16, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x46,
-	0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x12,
-	0x2a, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x44, 0x65,
+	0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x71, 0x0a, 0x16, 0x44, 0x65,
 	0x6c, 0x65, 0x74, 0x65, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65,
-	0x72, 0x76, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x75, 0x6e,
-	0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65,
-	0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72,
-	0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x46, 0x0a, 0x0d, 0x55, 0x6e, 0x69, 0x76,
-	0x65, 0x72, 0x73, 0x65, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, 0x19, 0x2e, 0x75, 0x6e, 0x69, 0x76,
-	0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, 0x71,
-	0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72,
-	0x70, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
-	0x12, 0x50, 0x0a, 0x0f, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x73, 0x73, 0x65, 0x74, 0x53, 0x74,
-	0x61, 0x74, 0x73, 0x12, 0x1c, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x70,
-	0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x73, 0x51, 0x75, 0x65, 0x72,
-	0x79, 0x1a, 0x1f, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e,
-	0x55, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x41, 0x73, 0x73, 0x65, 0x74, 0x53, 0x74, 0x61,
-	0x74, 0x73, 0x12, 0x50, 0x0a, 0x0b, 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, 0x76, 0x65, 0x6e, 0x74,
-	0x73, 0x12, 0x1f, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e,
-	0x51, 0x75, 0x65, 0x72, 0x79, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65,
-	0x73, 0x74, 0x1a, 0x20, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63,
-	0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70,
-	0x6f, 0x6e, 0x73, 0x65, 0x12, 0x74, 0x0a, 0x17, 0x53, 0x65, 0x74, 0x46, 0x65, 0x64, 0x65, 0x72,
-	0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x79, 0x6e, 0x63, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12,
-	0x2b, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x65,
-	0x74, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x79, 0x6e, 0x63, 0x43,
-	0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x75,
-	0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x65, 0x74, 0x46, 0x65,
-	0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x79, 0x6e, 0x63, 0x43, 0x6f, 0x6e, 0x66,
-	0x69, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x7a, 0x0a, 0x19, 0x51, 0x75,
-	0x65, 0x72, 0x79, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x79, 0x6e,
-	0x63, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x2d, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72,
-	0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x46, 0x65, 0x64, 0x65, 0x72,
-	0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x79, 0x6e, 0x63, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52,
-	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73,
-	0x65, 0x72, 0x70, 0x63, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61,
-	0x74, 0x69, 0x6f, 0x6e, 0x53, 0x79, 0x6e, 0x63, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65,
-	0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x3c, 0x5a, 0x3a, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62,
-	0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x6e, 0x69, 0x6e, 0x67, 0x6c, 0x61,
-	0x62, 0x73, 0x2f, 0x74, 0x61, 0x70, 0x72, 0x6f, 0x6f, 0x74, 0x2d, 0x61, 0x73, 0x73, 0x65, 0x74,
-	0x73, 0x2f, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2f, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73,
-	0x65, 0x72, 0x70, 0x63, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+	0x72, 0x76, 0x65, 0x72, 0x12, 0x2a, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72,
+	0x70, 0x63, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74,
+	0x69, 0x6f, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
+	0x1a, 0x2b, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x44,
+	0x65, 0x6c, 0x65, 0x74, 0x65, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53,
+	0x65, 0x72, 0x76, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x46, 0x0a,
+	0x0d, 0x55, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, 0x19,
+	0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x74, 0x61,
+	0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x75, 0x6e, 0x69, 0x76,
+	0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, 0x73,
+	0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x50, 0x0a, 0x0f, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x73,
+	0x73, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, 0x1c, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65,
+	0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74,
+	0x73, 0x51, 0x75, 0x65, 0x72, 0x79, 0x1a, 0x1f, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73,
+	0x65, 0x72, 0x70, 0x63, 0x2e, 0x55, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x41, 0x73, 0x73,
+	0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, 0x50, 0x0a, 0x0b, 0x51, 0x75, 0x65, 0x72, 0x79,
+	0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x1f, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73,
+	0x65, 0x72, 0x70, 0x63, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73,
+	0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72,
+	0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, 0x76, 0x65, 0x6e, 0x74,
+	0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x74, 0x0a, 0x17, 0x53, 0x65, 0x74,
+	0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x79, 0x6e, 0x63, 0x43, 0x6f,
+	0x6e, 0x66, 0x69, 0x67, 0x12, 0x2b, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72,
+	0x70, 0x63, 0x2e, 0x53, 0x65, 0x74, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,
+	0x53, 0x79, 0x6e, 0x63, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
+	0x74, 0x1a, 0x2c, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e,
+	0x53, 0x65, 0x74, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x79, 0x6e,
+	0x63, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12,
+	0x7a, 0x0a, 0x19, 0x51, 0x75, 0x65, 0x72, 0x79, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69,
+	0x6f, 0x6e, 0x53, 0x79, 0x6e, 0x63, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x2d, 0x2e, 0x75,
+	0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79,
+	0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x79, 0x6e, 0x63, 0x43, 0x6f,
+	0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x75, 0x6e,
+	0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x46,
+	0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x79, 0x6e, 0x63, 0x43, 0x6f, 0x6e,
+	0x66, 0x69, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x3c, 0x5a, 0x3a, 0x67,
+	0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x6e,
+	0x69, 0x6e, 0x67, 0x6c, 0x61, 0x62, 0x73, 0x2f, 0x74, 0x61, 0x70, 0x72, 0x6f, 0x6f, 0x74, 0x2d,
+	0x61, 0x73, 0x73, 0x65, 0x74, 0x73, 0x2f, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2f, 0x75, 0x6e,
+	0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f,
+	0x33,
 }
 
 var (
@@ -3836,8 +3931,8 @@ 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_msgTypes = make([]protoimpl.MessageInfo, 53)
+var file_universerpc_universe_proto_goTypes = []any{
 	(ProofType)(0),                            // 0: universerpc.ProofType
 	(UniverseSyncMode)(0),                     // 1: universerpc.UniverseSyncMode
 	(AssetQuerySort)(0),                       // 2: universerpc.AssetQuerySort
@@ -3862,41 +3957,45 @@ var file_universerpc_universe_proto_goTypes = []interface{}{
 	(*AssetLeafResponse)(nil),                 // 21: universerpc.AssetLeafResponse
 	(*UniverseKey)(nil),                       // 22: universerpc.UniverseKey
 	(*AssetProofResponse)(nil),                // 23: universerpc.AssetProofResponse
-	(*AssetProof)(nil),                        // 24: universerpc.AssetProof
-	(*PushProofRequest)(nil),                  // 25: universerpc.PushProofRequest
-	(*PushProofResponse)(nil),                 // 26: universerpc.PushProofResponse
-	(*InfoRequest)(nil),                       // 27: universerpc.InfoRequest
-	(*InfoResponse)(nil),                      // 28: universerpc.InfoResponse
-	(*SyncTarget)(nil),                        // 29: universerpc.SyncTarget
-	(*SyncRequest)(nil),                       // 30: universerpc.SyncRequest
-	(*SyncedUniverse)(nil),                    // 31: universerpc.SyncedUniverse
-	(*StatsRequest)(nil),                      // 32: universerpc.StatsRequest
-	(*SyncResponse)(nil),                      // 33: universerpc.SyncResponse
-	(*UniverseFederationServer)(nil),          // 34: universerpc.UniverseFederationServer
-	(*ListFederationServersRequest)(nil),      // 35: universerpc.ListFederationServersRequest
-	(*ListFederationServersResponse)(nil),     // 36: universerpc.ListFederationServersResponse
-	(*AddFederationServerRequest)(nil),        // 37: universerpc.AddFederationServerRequest
-	(*AddFederationServerResponse)(nil),       // 38: universerpc.AddFederationServerResponse
-	(*DeleteFederationServerRequest)(nil),     // 39: universerpc.DeleteFederationServerRequest
-	(*DeleteFederationServerResponse)(nil),    // 40: universerpc.DeleteFederationServerResponse
-	(*StatsResponse)(nil),                     // 41: universerpc.StatsResponse
-	(*AssetStatsQuery)(nil),                   // 42: universerpc.AssetStatsQuery
-	(*AssetStatsSnapshot)(nil),                // 43: universerpc.AssetStatsSnapshot
-	(*AssetStatsAsset)(nil),                   // 44: universerpc.AssetStatsAsset
-	(*UniverseAssetStats)(nil),                // 45: universerpc.UniverseAssetStats
-	(*QueryEventsRequest)(nil),                // 46: universerpc.QueryEventsRequest
-	(*QueryEventsResponse)(nil),               // 47: universerpc.QueryEventsResponse
-	(*GroupedUniverseEvents)(nil),             // 48: universerpc.GroupedUniverseEvents
-	(*SetFederationSyncConfigRequest)(nil),    // 49: universerpc.SetFederationSyncConfigRequest
-	(*SetFederationSyncConfigResponse)(nil),   // 50: universerpc.SetFederationSyncConfigResponse
-	(*GlobalFederationSyncConfig)(nil),        // 51: universerpc.GlobalFederationSyncConfig
-	(*AssetFederationSyncConfig)(nil),         // 52: universerpc.AssetFederationSyncConfig
-	(*QueryFederationSyncConfigRequest)(nil),  // 53: universerpc.QueryFederationSyncConfigRequest
-	(*QueryFederationSyncConfigResponse)(nil), // 54: universerpc.QueryFederationSyncConfigResponse
-	nil,                   // 55: universerpc.UniverseRoot.AmountsByAssetIdEntry
-	nil,                   // 56: universerpc.AssetRootResponse.UniverseRootsEntry
-	(*taprpc.Asset)(nil),  // 57: taprpc.Asset
-	(taprpc.AssetType)(0), // 58: taprpc.AssetType
+	(*IssuanceData)(nil),                      // 24: universerpc.IssuanceData
+	(*AssetProof)(nil),                        // 25: universerpc.AssetProof
+	(*PushProofRequest)(nil),                  // 26: universerpc.PushProofRequest
+	(*PushProofResponse)(nil),                 // 27: universerpc.PushProofResponse
+	(*InfoRequest)(nil),                       // 28: universerpc.InfoRequest
+	(*InfoResponse)(nil),                      // 29: universerpc.InfoResponse
+	(*SyncTarget)(nil),                        // 30: universerpc.SyncTarget
+	(*SyncRequest)(nil),                       // 31: universerpc.SyncRequest
+	(*SyncedUniverse)(nil),                    // 32: universerpc.SyncedUniverse
+	(*StatsRequest)(nil),                      // 33: universerpc.StatsRequest
+	(*SyncResponse)(nil),                      // 34: universerpc.SyncResponse
+	(*UniverseFederationServer)(nil),          // 35: universerpc.UniverseFederationServer
+	(*ListFederationServersRequest)(nil),      // 36: universerpc.ListFederationServersRequest
+	(*ListFederationServersResponse)(nil),     // 37: universerpc.ListFederationServersResponse
+	(*AddFederationServerRequest)(nil),        // 38: universerpc.AddFederationServerRequest
+	(*AddFederationServerResponse)(nil),       // 39: universerpc.AddFederationServerResponse
+	(*DeleteFederationServerRequest)(nil),     // 40: universerpc.DeleteFederationServerRequest
+	(*DeleteFederationServerResponse)(nil),    // 41: universerpc.DeleteFederationServerResponse
+	(*StatsResponse)(nil),                     // 42: universerpc.StatsResponse
+	(*AssetStatsQuery)(nil),                   // 43: universerpc.AssetStatsQuery
+	(*AssetStatsSnapshot)(nil),                // 44: universerpc.AssetStatsSnapshot
+	(*AssetStatsAsset)(nil),                   // 45: universerpc.AssetStatsAsset
+	(*UniverseAssetStats)(nil),                // 46: universerpc.UniverseAssetStats
+	(*QueryEventsRequest)(nil),                // 47: universerpc.QueryEventsRequest
+	(*QueryEventsResponse)(nil),               // 48: universerpc.QueryEventsResponse
+	(*GroupedUniverseEvents)(nil),             // 49: universerpc.GroupedUniverseEvents
+	(*SetFederationSyncConfigRequest)(nil),    // 50: universerpc.SetFederationSyncConfigRequest
+	(*SetFederationSyncConfigResponse)(nil),   // 51: universerpc.SetFederationSyncConfigResponse
+	(*GlobalFederationSyncConfig)(nil),        // 52: universerpc.GlobalFederationSyncConfig
+	(*AssetFederationSyncConfig)(nil),         // 53: universerpc.AssetFederationSyncConfig
+	(*QueryFederationSyncConfigRequest)(nil),  // 54: universerpc.QueryFederationSyncConfigRequest
+	(*QueryFederationSyncConfigResponse)(nil), // 55: universerpc.QueryFederationSyncConfigResponse
+	nil,                           // 56: universerpc.UniverseRoot.AmountsByAssetIdEntry
+	nil,                           // 57: universerpc.AssetRootResponse.UniverseRootsEntry
+	(*taprpc.Asset)(nil),          // 58: taprpc.Asset
+	(*taprpc.AssetMeta)(nil),      // 59: taprpc.AssetMeta
+	(*taprpc.GenesisReveal)(nil),  // 60: taprpc.GenesisReveal
+	(*taprpc.GroupKeyReveal)(nil), // 61: taprpc.GroupKeyReveal
+	(taprpc.AssetType)(0),         // 62: taprpc.AssetType
 }
 var file_universerpc_universe_proto_depIdxs = []int32{
 	0,  // 0: universerpc.MultiverseRootRequest.proof_type:type_name -> universerpc.ProofType
@@ -3906,8 +4005,8 @@ var file_universerpc_universe_proto_depIdxs = []int32{
 	0,  // 4: universerpc.ID.proof_type:type_name -> universerpc.ProofType
 	9,  // 5: universerpc.UniverseRoot.id:type_name -> universerpc.ID
 	8,  // 6: universerpc.UniverseRoot.mssmt_root:type_name -> universerpc.MerkleSumNode
-	55, // 7: universerpc.UniverseRoot.amounts_by_asset_id:type_name -> universerpc.UniverseRoot.AmountsByAssetIdEntry
-	56, // 8: universerpc.AssetRootResponse.universe_roots:type_name -> universerpc.AssetRootResponse.UniverseRootsEntry
+	56, // 7: universerpc.UniverseRoot.amounts_by_asset_id:type_name -> universerpc.UniverseRoot.AmountsByAssetIdEntry
+	57, // 8: universerpc.AssetRootResponse.universe_roots:type_name -> universerpc.AssetRootResponse.UniverseRootsEntry
 	9,  // 9: universerpc.AssetRootQuery.id:type_name -> universerpc.ID
 	10, // 10: universerpc.QueryRootResponse.issuance_root:type_name -> universerpc.UniverseRoot
 	10, // 11: universerpc.QueryRootResponse.transfer_root:type_name -> universerpc.UniverseRoot
@@ -3916,7 +4015,7 @@ var file_universerpc_universe_proto_depIdxs = []int32{
 	9,  // 14: universerpc.AssetLeafKeysRequest.id:type_name -> universerpc.ID
 	3,  // 15: universerpc.AssetLeafKeysRequest.direction:type_name -> universerpc.SortDirection
 	17, // 16: universerpc.AssetLeafKeyResponse.asset_keys:type_name -> universerpc.AssetKey
-	57, // 17: universerpc.AssetLeaf.asset:type_name -> taprpc.Asset
+	58, // 17: universerpc.AssetLeaf.asset:type_name -> taprpc.Asset
 	20, // 18: universerpc.AssetLeafResponse.leaves:type_name -> universerpc.AssetLeaf
 	9,  // 19: universerpc.UniverseKey.id:type_name -> universerpc.ID
 	17, // 20: universerpc.UniverseKey.leaf_key:type_name -> universerpc.AssetKey
@@ -3924,80 +4023,84 @@ var file_universerpc_universe_proto_depIdxs = []int32{
 	10, // 22: universerpc.AssetProofResponse.universe_root:type_name -> universerpc.UniverseRoot
 	20, // 23: universerpc.AssetProofResponse.asset_leaf:type_name -> universerpc.AssetLeaf
 	8,  // 24: universerpc.AssetProofResponse.multiverse_root:type_name -> universerpc.MerkleSumNode
-	22, // 25: universerpc.AssetProof.key:type_name -> universerpc.UniverseKey
-	20, // 26: universerpc.AssetProof.asset_leaf:type_name -> universerpc.AssetLeaf
-	22, // 27: universerpc.PushProofRequest.key:type_name -> universerpc.UniverseKey
-	34, // 28: universerpc.PushProofRequest.server:type_name -> universerpc.UniverseFederationServer
-	22, // 29: universerpc.PushProofResponse.key:type_name -> universerpc.UniverseKey
-	9,  // 30: universerpc.SyncTarget.id:type_name -> universerpc.ID
-	1,  // 31: universerpc.SyncRequest.sync_mode:type_name -> universerpc.UniverseSyncMode
-	29, // 32: universerpc.SyncRequest.sync_targets:type_name -> universerpc.SyncTarget
-	10, // 33: universerpc.SyncedUniverse.old_asset_root:type_name -> universerpc.UniverseRoot
-	10, // 34: universerpc.SyncedUniverse.new_asset_root:type_name -> universerpc.UniverseRoot
-	20, // 35: universerpc.SyncedUniverse.new_asset_leaves:type_name -> universerpc.AssetLeaf
-	31, // 36: universerpc.SyncResponse.synced_universes:type_name -> universerpc.SyncedUniverse
-	34, // 37: universerpc.ListFederationServersResponse.servers:type_name -> universerpc.UniverseFederationServer
-	34, // 38: universerpc.AddFederationServerRequest.servers:type_name -> universerpc.UniverseFederationServer
-	34, // 39: universerpc.DeleteFederationServerRequest.servers:type_name -> universerpc.UniverseFederationServer
-	4,  // 40: universerpc.AssetStatsQuery.asset_type_filter:type_name -> universerpc.AssetTypeFilter
-	2,  // 41: universerpc.AssetStatsQuery.sort_by:type_name -> universerpc.AssetQuerySort
-	3,  // 42: universerpc.AssetStatsQuery.direction:type_name -> universerpc.SortDirection
-	44, // 43: universerpc.AssetStatsSnapshot.group_anchor:type_name -> universerpc.AssetStatsAsset
-	44, // 44: universerpc.AssetStatsSnapshot.asset:type_name -> universerpc.AssetStatsAsset
-	58, // 45: universerpc.AssetStatsAsset.asset_type:type_name -> taprpc.AssetType
-	43, // 46: universerpc.UniverseAssetStats.asset_stats:type_name -> universerpc.AssetStatsSnapshot
-	48, // 47: universerpc.QueryEventsResponse.events:type_name -> universerpc.GroupedUniverseEvents
-	51, // 48: universerpc.SetFederationSyncConfigRequest.global_sync_configs:type_name -> universerpc.GlobalFederationSyncConfig
-	52, // 49: universerpc.SetFederationSyncConfigRequest.asset_sync_configs:type_name -> universerpc.AssetFederationSyncConfig
-	0,  // 50: universerpc.GlobalFederationSyncConfig.proof_type:type_name -> universerpc.ProofType
-	9,  // 51: universerpc.AssetFederationSyncConfig.id:type_name -> universerpc.ID
-	9,  // 52: universerpc.QueryFederationSyncConfigRequest.id:type_name -> universerpc.ID
-	51, // 53: universerpc.QueryFederationSyncConfigResponse.global_sync_configs:type_name -> universerpc.GlobalFederationSyncConfig
-	52, // 54: universerpc.QueryFederationSyncConfigResponse.asset_sync_configs:type_name -> universerpc.AssetFederationSyncConfig
-	10, // 55: universerpc.AssetRootResponse.UniverseRootsEntry.value:type_name -> universerpc.UniverseRoot
-	5,  // 56: universerpc.Universe.MultiverseRoot:input_type -> universerpc.MultiverseRootRequest
-	7,  // 57: universerpc.Universe.AssetRoots:input_type -> universerpc.AssetRootRequest
-	12, // 58: universerpc.Universe.QueryAssetRoots:input_type -> universerpc.AssetRootQuery
-	14, // 59: universerpc.Universe.DeleteAssetRoot:input_type -> universerpc.DeleteRootQuery
-	18, // 60: universerpc.Universe.AssetLeafKeys:input_type -> universerpc.AssetLeafKeysRequest
-	9,  // 61: universerpc.Universe.AssetLeaves:input_type -> universerpc.ID
-	22, // 62: universerpc.Universe.QueryProof:input_type -> universerpc.UniverseKey
-	24, // 63: universerpc.Universe.InsertProof:input_type -> universerpc.AssetProof
-	25, // 64: universerpc.Universe.PushProof:input_type -> universerpc.PushProofRequest
-	27, // 65: universerpc.Universe.Info:input_type -> universerpc.InfoRequest
-	30, // 66: universerpc.Universe.SyncUniverse:input_type -> universerpc.SyncRequest
-	35, // 67: universerpc.Universe.ListFederationServers:input_type -> universerpc.ListFederationServersRequest
-	37, // 68: universerpc.Universe.AddFederationServer:input_type -> universerpc.AddFederationServerRequest
-	39, // 69: universerpc.Universe.DeleteFederationServer:input_type -> universerpc.DeleteFederationServerRequest
-	32, // 70: universerpc.Universe.UniverseStats:input_type -> universerpc.StatsRequest
-	42, // 71: universerpc.Universe.QueryAssetStats:input_type -> universerpc.AssetStatsQuery
-	46, // 72: universerpc.Universe.QueryEvents:input_type -> universerpc.QueryEventsRequest
-	49, // 73: universerpc.Universe.SetFederationSyncConfig:input_type -> universerpc.SetFederationSyncConfigRequest
-	53, // 74: universerpc.Universe.QueryFederationSyncConfig:input_type -> universerpc.QueryFederationSyncConfigRequest
-	6,  // 75: universerpc.Universe.MultiverseRoot:output_type -> universerpc.MultiverseRootResponse
-	11, // 76: universerpc.Universe.AssetRoots:output_type -> universerpc.AssetRootResponse
-	13, // 77: universerpc.Universe.QueryAssetRoots:output_type -> universerpc.QueryRootResponse
-	15, // 78: universerpc.Universe.DeleteAssetRoot:output_type -> universerpc.DeleteRootResponse
-	19, // 79: universerpc.Universe.AssetLeafKeys:output_type -> universerpc.AssetLeafKeyResponse
-	21, // 80: universerpc.Universe.AssetLeaves:output_type -> universerpc.AssetLeafResponse
-	23, // 81: universerpc.Universe.QueryProof:output_type -> universerpc.AssetProofResponse
-	23, // 82: universerpc.Universe.InsertProof:output_type -> universerpc.AssetProofResponse
-	26, // 83: universerpc.Universe.PushProof:output_type -> universerpc.PushProofResponse
-	28, // 84: universerpc.Universe.Info:output_type -> universerpc.InfoResponse
-	33, // 85: universerpc.Universe.SyncUniverse:output_type -> universerpc.SyncResponse
-	36, // 86: universerpc.Universe.ListFederationServers:output_type -> universerpc.ListFederationServersResponse
-	38, // 87: universerpc.Universe.AddFederationServer:output_type -> universerpc.AddFederationServerResponse
-	40, // 88: universerpc.Universe.DeleteFederationServer:output_type -> universerpc.DeleteFederationServerResponse
-	41, // 89: universerpc.Universe.UniverseStats:output_type -> universerpc.StatsResponse
-	45, // 90: universerpc.Universe.QueryAssetStats:output_type -> universerpc.UniverseAssetStats
-	47, // 91: universerpc.Universe.QueryEvents:output_type -> universerpc.QueryEventsResponse
-	50, // 92: universerpc.Universe.SetFederationSyncConfig:output_type -> universerpc.SetFederationSyncConfigResponse
-	54, // 93: universerpc.Universe.QueryFederationSyncConfig:output_type -> universerpc.QueryFederationSyncConfigResponse
-	75, // [75:94] is the sub-list for method output_type
-	56, // [56:75] is the sub-list for method input_type
-	56, // [56:56] is the sub-list for extension type_name
-	56, // [56:56] is the sub-list for extension extendee
-	0,  // [0:56] is the sub-list for field type_name
+	24, // 25: universerpc.AssetProofResponse.issuance_data:type_name -> universerpc.IssuanceData
+	59, // 26: universerpc.IssuanceData.meta_reveal:type_name -> taprpc.AssetMeta
+	60, // 27: universerpc.IssuanceData.genesis_reveal:type_name -> taprpc.GenesisReveal
+	61, // 28: universerpc.IssuanceData.group_key_reveal:type_name -> taprpc.GroupKeyReveal
+	22, // 29: universerpc.AssetProof.key:type_name -> universerpc.UniverseKey
+	20, // 30: universerpc.AssetProof.asset_leaf:type_name -> universerpc.AssetLeaf
+	22, // 31: universerpc.PushProofRequest.key:type_name -> universerpc.UniverseKey
+	35, // 32: universerpc.PushProofRequest.server:type_name -> universerpc.UniverseFederationServer
+	22, // 33: universerpc.PushProofResponse.key:type_name -> universerpc.UniverseKey
+	9,  // 34: universerpc.SyncTarget.id:type_name -> universerpc.ID
+	1,  // 35: universerpc.SyncRequest.sync_mode:type_name -> universerpc.UniverseSyncMode
+	30, // 36: universerpc.SyncRequest.sync_targets:type_name -> universerpc.SyncTarget
+	10, // 37: universerpc.SyncedUniverse.old_asset_root:type_name -> universerpc.UniverseRoot
+	10, // 38: universerpc.SyncedUniverse.new_asset_root:type_name -> universerpc.UniverseRoot
+	20, // 39: universerpc.SyncedUniverse.new_asset_leaves:type_name -> universerpc.AssetLeaf
+	32, // 40: universerpc.SyncResponse.synced_universes:type_name -> universerpc.SyncedUniverse
+	35, // 41: universerpc.ListFederationServersResponse.servers:type_name -> universerpc.UniverseFederationServer
+	35, // 42: universerpc.AddFederationServerRequest.servers:type_name -> universerpc.UniverseFederationServer
+	35, // 43: universerpc.DeleteFederationServerRequest.servers:type_name -> universerpc.UniverseFederationServer
+	4,  // 44: universerpc.AssetStatsQuery.asset_type_filter:type_name -> universerpc.AssetTypeFilter
+	2,  // 45: universerpc.AssetStatsQuery.sort_by:type_name -> universerpc.AssetQuerySort
+	3,  // 46: universerpc.AssetStatsQuery.direction:type_name -> universerpc.SortDirection
+	45, // 47: universerpc.AssetStatsSnapshot.group_anchor:type_name -> universerpc.AssetStatsAsset
+	45, // 48: universerpc.AssetStatsSnapshot.asset:type_name -> universerpc.AssetStatsAsset
+	62, // 49: universerpc.AssetStatsAsset.asset_type:type_name -> taprpc.AssetType
+	44, // 50: universerpc.UniverseAssetStats.asset_stats:type_name -> universerpc.AssetStatsSnapshot
+	49, // 51: universerpc.QueryEventsResponse.events:type_name -> universerpc.GroupedUniverseEvents
+	52, // 52: universerpc.SetFederationSyncConfigRequest.global_sync_configs:type_name -> universerpc.GlobalFederationSyncConfig
+	53, // 53: universerpc.SetFederationSyncConfigRequest.asset_sync_configs:type_name -> universerpc.AssetFederationSyncConfig
+	0,  // 54: universerpc.GlobalFederationSyncConfig.proof_type:type_name -> universerpc.ProofType
+	9,  // 55: universerpc.AssetFederationSyncConfig.id:type_name -> universerpc.ID
+	9,  // 56: universerpc.QueryFederationSyncConfigRequest.id:type_name -> universerpc.ID
+	52, // 57: universerpc.QueryFederationSyncConfigResponse.global_sync_configs:type_name -> universerpc.GlobalFederationSyncConfig
+	53, // 58: universerpc.QueryFederationSyncConfigResponse.asset_sync_configs:type_name -> universerpc.AssetFederationSyncConfig
+	10, // 59: universerpc.AssetRootResponse.UniverseRootsEntry.value:type_name -> universerpc.UniverseRoot
+	5,  // 60: universerpc.Universe.MultiverseRoot:input_type -> universerpc.MultiverseRootRequest
+	7,  // 61: universerpc.Universe.AssetRoots:input_type -> universerpc.AssetRootRequest
+	12, // 62: universerpc.Universe.QueryAssetRoots:input_type -> universerpc.AssetRootQuery
+	14, // 63: universerpc.Universe.DeleteAssetRoot:input_type -> universerpc.DeleteRootQuery
+	18, // 64: universerpc.Universe.AssetLeafKeys:input_type -> universerpc.AssetLeafKeysRequest
+	9,  // 65: universerpc.Universe.AssetLeaves:input_type -> universerpc.ID
+	22, // 66: universerpc.Universe.QueryProof:input_type -> universerpc.UniverseKey
+	25, // 67: universerpc.Universe.InsertProof:input_type -> universerpc.AssetProof
+	26, // 68: universerpc.Universe.PushProof:input_type -> universerpc.PushProofRequest
+	28, // 69: universerpc.Universe.Info:input_type -> universerpc.InfoRequest
+	31, // 70: universerpc.Universe.SyncUniverse:input_type -> universerpc.SyncRequest
+	36, // 71: universerpc.Universe.ListFederationServers:input_type -> universerpc.ListFederationServersRequest
+	38, // 72: universerpc.Universe.AddFederationServer:input_type -> universerpc.AddFederationServerRequest
+	40, // 73: universerpc.Universe.DeleteFederationServer:input_type -> universerpc.DeleteFederationServerRequest
+	33, // 74: universerpc.Universe.UniverseStats:input_type -> universerpc.StatsRequest
+	43, // 75: universerpc.Universe.QueryAssetStats:input_type -> universerpc.AssetStatsQuery
+	47, // 76: universerpc.Universe.QueryEvents:input_type -> universerpc.QueryEventsRequest
+	50, // 77: universerpc.Universe.SetFederationSyncConfig:input_type -> universerpc.SetFederationSyncConfigRequest
+	54, // 78: universerpc.Universe.QueryFederationSyncConfig:input_type -> universerpc.QueryFederationSyncConfigRequest
+	6,  // 79: universerpc.Universe.MultiverseRoot:output_type -> universerpc.MultiverseRootResponse
+	11, // 80: universerpc.Universe.AssetRoots:output_type -> universerpc.AssetRootResponse
+	13, // 81: universerpc.Universe.QueryAssetRoots:output_type -> universerpc.QueryRootResponse
+	15, // 82: universerpc.Universe.DeleteAssetRoot:output_type -> universerpc.DeleteRootResponse
+	19, // 83: universerpc.Universe.AssetLeafKeys:output_type -> universerpc.AssetLeafKeyResponse
+	21, // 84: universerpc.Universe.AssetLeaves:output_type -> universerpc.AssetLeafResponse
+	23, // 85: universerpc.Universe.QueryProof:output_type -> universerpc.AssetProofResponse
+	23, // 86: universerpc.Universe.InsertProof:output_type -> universerpc.AssetProofResponse
+	27, // 87: universerpc.Universe.PushProof:output_type -> universerpc.PushProofResponse
+	29, // 88: universerpc.Universe.Info:output_type -> universerpc.InfoResponse
+	34, // 89: universerpc.Universe.SyncUniverse:output_type -> universerpc.SyncResponse
+	37, // 90: universerpc.Universe.ListFederationServers:output_type -> universerpc.ListFederationServersResponse
+	39, // 91: universerpc.Universe.AddFederationServer:output_type -> universerpc.AddFederationServerResponse
+	41, // 92: universerpc.Universe.DeleteFederationServer:output_type -> universerpc.DeleteFederationServerResponse
+	42, // 93: universerpc.Universe.UniverseStats:output_type -> universerpc.StatsResponse
+	46, // 94: universerpc.Universe.QueryAssetStats:output_type -> universerpc.UniverseAssetStats
+	48, // 95: universerpc.Universe.QueryEvents:output_type -> universerpc.QueryEventsResponse
+	51, // 96: universerpc.Universe.SetFederationSyncConfig:output_type -> universerpc.SetFederationSyncConfigResponse
+	55, // 97: universerpc.Universe.QueryFederationSyncConfig:output_type -> universerpc.QueryFederationSyncConfigResponse
+	79, // [79:98] is the sub-list for method output_type
+	60, // [60:79] is the sub-list for method input_type
+	60, // [60:60] is the sub-list for extension type_name
+	60, // [60:60] is the sub-list for extension extendee
+	0,  // [0:60] is the sub-list for field type_name
 }
 
 func init() { file_universerpc_universe_proto_init() }
@@ -4006,7 +4109,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 +4121,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 +4133,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 +4145,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 +4157,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 +4169,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 +4181,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 +4193,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 +4205,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 +4217,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 +4229,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 +4241,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 +4253,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 +4265,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 +4277,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 +4289,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 +4301,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 +4313,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 +4325,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 +4337,19 @@ 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.(*IssuanceData); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_universerpc_universe_proto_msgTypes[20].Exporter = func(v any, i int) any {
 			switch v := v.(*AssetProof); i {
 			case 0:
 				return &v.state
@@ -4246,7 +4361,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[21].Exporter = func(v any, i int) any {
 			switch v := v.(*PushProofRequest); i {
 			case 0:
 				return &v.state
@@ -4258,7 +4373,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[22].Exporter = func(v any, i int) any {
 			switch v := v.(*PushProofResponse); i {
 			case 0:
 				return &v.state
@@ -4270,7 +4385,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[23].Exporter = func(v any, i int) any {
 			switch v := v.(*InfoRequest); i {
 			case 0:
 				return &v.state
@@ -4282,7 +4397,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[24].Exporter = func(v any, i int) any {
 			switch v := v.(*InfoResponse); i {
 			case 0:
 				return &v.state
@@ -4294,7 +4409,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[25].Exporter = func(v any, i int) any {
 			switch v := v.(*SyncTarget); i {
 			case 0:
 				return &v.state
@@ -4306,7 +4421,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[26].Exporter = func(v any, i int) any {
 			switch v := v.(*SyncRequest); i {
 			case 0:
 				return &v.state
@@ -4318,7 +4433,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[27].Exporter = func(v any, i int) any {
 			switch v := v.(*SyncedUniverse); i {
 			case 0:
 				return &v.state
@@ -4330,7 +4445,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[28].Exporter = func(v any, i int) any {
 			switch v := v.(*StatsRequest); i {
 			case 0:
 				return &v.state
@@ -4342,7 +4457,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[29].Exporter = func(v any, i int) any {
 			switch v := v.(*SyncResponse); i {
 			case 0:
 				return &v.state
@@ -4354,7 +4469,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[30].Exporter = func(v any, i int) any {
 			switch v := v.(*UniverseFederationServer); i {
 			case 0:
 				return &v.state
@@ -4366,7 +4481,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[31].Exporter = func(v any, i int) any {
 			switch v := v.(*ListFederationServersRequest); i {
 			case 0:
 				return &v.state
@@ -4378,7 +4493,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[32].Exporter = func(v any, i int) any {
 			switch v := v.(*ListFederationServersResponse); i {
 			case 0:
 				return &v.state
@@ -4390,7 +4505,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[33].Exporter = func(v any, i int) any {
 			switch v := v.(*AddFederationServerRequest); i {
 			case 0:
 				return &v.state
@@ -4402,7 +4517,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[34].Exporter = func(v any, i int) any {
 			switch v := v.(*AddFederationServerResponse); i {
 			case 0:
 				return &v.state
@@ -4414,7 +4529,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[35].Exporter = func(v any, i int) any {
 			switch v := v.(*DeleteFederationServerRequest); i {
 			case 0:
 				return &v.state
@@ -4426,7 +4541,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[36].Exporter = func(v any, i int) any {
 			switch v := v.(*DeleteFederationServerResponse); i {
 			case 0:
 				return &v.state
@@ -4438,7 +4553,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[37].Exporter = func(v any, i int) any {
 			switch v := v.(*StatsResponse); i {
 			case 0:
 				return &v.state
@@ -4450,7 +4565,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[38].Exporter = func(v any, i int) any {
 			switch v := v.(*AssetStatsQuery); i {
 			case 0:
 				return &v.state
@@ -4462,7 +4577,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[39].Exporter = func(v any, i int) any {
 			switch v := v.(*AssetStatsSnapshot); i {
 			case 0:
 				return &v.state
@@ -4474,7 +4589,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[40].Exporter = func(v any, i int) any {
 			switch v := v.(*AssetStatsAsset); i {
 			case 0:
 				return &v.state
@@ -4486,7 +4601,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[41].Exporter = func(v any, i int) any {
 			switch v := v.(*UniverseAssetStats); i {
 			case 0:
 				return &v.state
@@ -4498,7 +4613,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[42].Exporter = func(v any, i int) any {
 			switch v := v.(*QueryEventsRequest); i {
 			case 0:
 				return &v.state
@@ -4510,7 +4625,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[43].Exporter = func(v any, i int) any {
 			switch v := v.(*QueryEventsResponse); i {
 			case 0:
 				return &v.state
@@ -4522,7 +4637,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[44].Exporter = func(v any, i int) any {
 			switch v := v.(*GroupedUniverseEvents); i {
 			case 0:
 				return &v.state
@@ -4534,7 +4649,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[45].Exporter = func(v any, i int) any {
 			switch v := v.(*SetFederationSyncConfigRequest); i {
 			case 0:
 				return &v.state
@@ -4546,7 +4661,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[46].Exporter = func(v any, i int) any {
 			switch v := v.(*SetFederationSyncConfigResponse); i {
 			case 0:
 				return &v.state
@@ -4558,7 +4673,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[47].Exporter = func(v any, i int) any {
 			switch v := v.(*GlobalFederationSyncConfig); i {
 			case 0:
 				return &v.state
@@ -4570,7 +4685,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[48].Exporter = func(v any, i int) any {
 			switch v := v.(*AssetFederationSyncConfig); i {
 			case 0:
 				return &v.state
@@ -4582,7 +4697,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[49].Exporter = func(v any, i int) any {
 			switch v := v.(*QueryFederationSyncConfigRequest); i {
 			case 0:
 				return &v.state
@@ -4594,7 +4709,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[50].Exporter = func(v any, i int) any {
 			switch v := v.(*QueryFederationSyncConfigResponse); i {
 			case 0:
 				return &v.state
@@ -4607,13 +4722,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),
@@ -4625,7 +4740,7 @@ func file_universerpc_universe_proto_init() {
 			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
 			RawDescriptor: file_universerpc_universe_proto_rawDesc,
 			NumEnums:      5,
-			NumMessages:   52,
+			NumMessages:   53,
 			NumExtensions: 0,
 			NumServices:   1,
 		},
diff --git a/taprpc/universerpc/universe.pb.gw.go b/taprpc/universerpc/universe.pb.gw.go
index 91fe7c2a..cd8d3721 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.proto b/taprpc/universerpc/universe.proto
index f719fb9f..41ef3694 100644
--- a/taprpc/universerpc/universe.proto
+++ b/taprpc/universerpc/universe.proto
@@ -367,6 +367,23 @@ message AssetProofResponse {
     // MultiverseInclusionProof is the inclusion proof for the asset leaf in the
     // multiverse.
     bytes multiverse_inclusion_proof = 6;
+
+    // The issuance related data for an issuance asset leaf. This is empty for
+    // any other type of asset leaf.
+    IssuanceData issuance_data = 7;
+}
+
+message IssuanceData {
+    // The reveal meta data associated with the proof, if available.
+    taprpc.AssetMeta meta_reveal = 1;
+
+    // GenesisReveal is an optional field that is the Genesis information for
+    // the asset. This is required for minting proofs.
+    taprpc.GenesisReveal genesis_reveal = 2;
+
+    // GroupKeyReveal is an optional field that includes the information needed
+    // to derive the tweaked group key.
+    taprpc.GroupKeyReveal group_key_reveal = 3;
 }
 
 message AssetProof {
diff --git a/taprpc/universerpc/universe.swagger.json b/taprpc/universerpc/universe.swagger.json
index f8242fad..72596f45 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": {
@@ -1700,6 +1598,11 @@
           "type": "integer",
           "format": "int64",
           "description": "The height of the block which contains the anchor transaction."
+        },
+        "block_timestamp": {
+          "type": "string",
+          "format": "int64",
+          "description": "The UTC Unix timestamp of the block containing the anchor transaction."
         }
       }
     },
@@ -1778,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)."
         }
       }
     },
@@ -1815,6 +1722,34 @@
         }
       }
     },
+    "taprpcAssetMeta": {
+      "type": "object",
+      "properties": {
+        "data": {
+          "type": "string",
+          "format": "byte",
+          "description": "The raw data of the asset meta data. Based on the type below, this may be\nstructured data such as a text file or PDF. The size of the data is limited\nto 1MiB."
+        },
+        "type": {
+          "$ref": "#/definitions/taprpcAssetMetaType",
+          "description": "The type of the asset meta data."
+        },
+        "meta_hash": {
+          "type": "string",
+          "format": "byte",
+          "description": "The hash of the meta. This is the hash of the TLV serialization of the meta\nitself."
+        }
+      }
+    },
+    "taprpcAssetMetaType": {
+      "type": "string",
+      "enum": [
+        "META_TYPE_OPAQUE",
+        "META_TYPE_JSON"
+      ],
+      "default": "META_TYPE_OPAQUE",
+      "description": " - META_TYPE_OPAQUE: Opaque is used for asset meta blobs that have no true structure and instead\nshould be interpreted as opaque blobs.\n - META_TYPE_JSON: JSON is used for asset meta blobs that are to be interpreted as valid JSON\nstrings."
+    },
     "taprpcAssetType": {
       "type": "string",
       "enum": [
@@ -1875,6 +1810,30 @@
         }
       }
     },
+    "taprpcGenesisReveal": {
+      "type": "object",
+      "properties": {
+        "genesis_base_reveal": {
+          "$ref": "#/definitions/taprpcGenesisInfo",
+          "description": "The base genesis information in the genesis reveal."
+        }
+      }
+    },
+    "taprpcGroupKeyReveal": {
+      "type": "object",
+      "properties": {
+        "raw_group_key": {
+          "type": "string",
+          "format": "byte",
+          "description": "The raw group key which is a normal public key."
+        },
+        "tapscript_root": {
+          "type": "string",
+          "format": "byte",
+          "description": "The tapscript root included in the tweaked group key, which may be empty."
+        }
+      }
+    },
     "taprpcPrevInputAsset": {
       "type": "object",
       "properties": {
@@ -1913,6 +1872,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": {
@@ -2040,6 +2012,10 @@
           "type": "string",
           "format": "byte",
           "description": "MultiverseInclusionProof is the inclusion proof for the asset leaf in the\nmultiverse."
+        },
+        "issuance_data": {
+          "$ref": "#/definitions/universerpcIssuanceData",
+          "description": "The issuance related data for an issuance asset leaf. This is empty for\nany other type of asset leaf."
         }
       }
     },
@@ -2221,6 +2197,23 @@
         }
       }
     },
+    "universerpcIssuanceData": {
+      "type": "object",
+      "properties": {
+        "meta_reveal": {
+          "$ref": "#/definitions/taprpcAssetMeta",
+          "description": "The reveal meta data associated with the proof, if available."
+        },
+        "genesis_reveal": {
+          "$ref": "#/definitions/taprpcGenesisReveal",
+          "description": "GenesisReveal is an optional field that is the Genesis information for\nthe asset. This is required for minting proofs."
+        },
+        "group_key_reveal": {
+          "$ref": "#/definitions/taprpcGroupKeyReveal",
+          "description": "GroupKeyReveal is an optional field that includes the information needed\nto derive the tweaked group key."
+        }
+      }
+    },
     "universerpcListFederationServersResponse": {
       "type": "object",
       "properties": {
diff --git a/tapsend/allocation.go b/tapsend/allocation.go
index 31a48be7..1c2b258a 100644
--- a/tapsend/allocation.go
+++ b/tapsend/allocation.go
@@ -486,19 +486,13 @@ func DistributeCoins(inputs []*proof.Proof, allocations []*Allocation,
 	// We group the assets by asset ID, since we'll want to create a single
 	// virtual packet per asset ID (with each virtual packet potentially
 	// having multiple inputs and outputs).
-	assetIDs := fn.Map(inputs, func(input *proof.Proof) asset.ID {
-		return input.Asset.ID()
-	})
-	uniqueAssetIDs := fn.NewSet(assetIDs...).ToSlice()
+	groupedProofs := GroupProofsByAssetID(inputs)
 
 	// Each "piece" keeps track of how many assets of a specific asset ID
 	// we have already distributed. The pieces are also the main way to
 	// reference an asset ID's virtual packet.
-	pieces := make([]*piece, len(uniqueAssetIDs))
-	for i, assetID := range uniqueAssetIDs {
-		proofsByID := fn.Filter(inputs, func(i *proof.Proof) bool {
-			return i.Asset.ID() == assetID
-		})
+	pieces := make([]*piece, 0, len(groupedProofs))
+	for assetID, proofsByID := range groupedProofs {
 		sumByID := fn.Reduce(
 			proofsByID, func(sum uint64, i *proof.Proof) uint64 {
 				return sum + i.Asset.Amount
@@ -512,12 +506,12 @@ func DistributeCoins(inputs []*proof.Proof, allocations []*Allocation,
 			return nil, err
 		}
 
-		pieces[i] = &piece{
+		pieces = append(pieces, &piece{
 			assetID:        assetID,
 			totalAvailable: sumByID,
 			proofs:         proofsByID,
 			packet:         pkt,
-		}
+		})
 	}
 
 	// Make sure the pieces are in a stable and reproducible order before we
@@ -840,3 +834,22 @@ func setAllocationFieldsFromOutput(alloc *Allocation, vOut *tappsbt.VOutput) {
 	alloc.AltLeaves = vOut.AltLeaves
 	alloc.SiblingPreimage = vOut.AnchorOutputTapscriptSibling
 }
+
+// GroupProofsByAssetID groups the given proofs by their asset ID.
+func GroupProofsByAssetID(proofs []*proof.Proof) map[asset.ID][]*proof.Proof {
+	assetIDs := fn.Map(proofs, func(p *proof.Proof) asset.ID {
+		return p.Asset.ID()
+	})
+	uniqueAssetIDs := fn.NewSet(assetIDs...).ToSlice()
+
+	groupedProofs := make(map[asset.ID][]*proof.Proof, len(uniqueAssetIDs))
+	for _, assetID := range uniqueAssetIDs {
+		groupedProofs[assetID] = fn.Filter(
+			proofs, func(p *proof.Proof) bool {
+				return p.Asset.ID() == assetID
+			},
+		)
+	}
+
+	return groupedProofs
+}
diff --git a/tapsend/send.go b/tapsend/send.go
index bcce1e36..9a381076 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



Test patch:
diff --git a/itest/assertions.go b/itest/assertions.go
index bd208c5d..d8e6afcf 100644
--- a/itest/assertions.go
+++ b/itest/assertions.go
@@ -21,6 +21,7 @@ import (
 	"github.com/lightninglabs/taproot-assets/commitment"
 	"github.com/lightninglabs/taproot-assets/fn"
 	"github.com/lightninglabs/taproot-assets/proof"
+	"github.com/lightninglabs/taproot-assets/rpcutils"
 	"github.com/lightninglabs/taproot-assets/tapfreighter"
 	"github.com/lightninglabs/taproot-assets/tappsbt"
 	"github.com/lightninglabs/taproot-assets/taprpc"
@@ -46,6 +47,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 +1351,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 +1918,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 +2019,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 +2030,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 +2073,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 +2092,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: rpcutils.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 +2502,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 31b14f36..f0f6b9aa 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 ec65142a..87185593 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 8b264579..8c3f9517 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/mint_fund_seal_test.go b/itest/mint_fund_seal_test.go
index 04c1e698..4e1b8c4f 100644
--- a/itest/mint_fund_seal_test.go
+++ b/itest/mint_fund_seal_test.go
@@ -20,6 +20,7 @@ import (
 	"github.com/lightninglabs/taproot-assets/fn"
 	"github.com/lightninglabs/taproot-assets/internal/test"
 	"github.com/lightninglabs/taproot-assets/proof"
+	"github.com/lightninglabs/taproot-assets/rpcutils"
 	"github.com/lightninglabs/taproot-assets/tappsbt"
 	"github.com/lightninglabs/taproot-assets/taprpc"
 	wrpc "github.com/lightninglabs/taproot-assets/taprpc/assetwalletrpc"
@@ -109,7 +110,7 @@ func testMintFundSealAssets(t *harnessTest) {
 	// Asset 0 will have no asset group, and an external script key with a
 	// tapscript root.
 	assetReqWithScriptKey := CopyRequest(simpleAssets[0])
-	assetReqWithScriptKey.Asset.ScriptKey = taprpc.MarshalScriptKey(
+	assetReqWithScriptKey.Asset.ScriptKey = rpcutils.MarshalScriptKey(
 		tweakedScript,
 	)
 
@@ -117,15 +118,15 @@ func testMintFundSealAssets(t *harnessTest) {
 	// root. This asset will be a group anchor.
 	assetReqGroupedInternalTweaked := CopyRequest(simpleAssets[1])
 	assetReqGroupedInternalTweaked.Asset.NewGroupedAsset = true
-	assetReqGroupedInternalTweaked.Asset.GroupInternalKey = taprpc.
-		MarshalKeyDescriptor(managedGroupInternal)
+	assetReqGroupedInternalTweaked.Asset.GroupInternalKey =
+		rpcutils.MarshalKeyDescriptor(managedGroupInternal)
 	assetReqGroupedInternalTweaked.Asset.
 		GroupTapscriptRoot = groupInternalTweak
 
 	// Asset 2 will have an external group key with a tapscript root.
 	assetReqGroupedExternal := CopyRequest(issuableAssets[0])
-	assetReqGroupedExternal.Asset.GroupInternalKey = taprpc.
-		MarshalKeyDescriptor(groupExternalDesc)
+	assetReqGroupedExternal.Asset.GroupInternalKey =
+		rpcutils.MarshalKeyDescriptor(groupExternalDesc)
 	assetReqGroupedExternal.Asset.GroupTapscriptRoot = groupExternalTweak[:]
 
 	// Asset 3 will be a member of the asset group created by Asset 1.
@@ -701,7 +702,7 @@ func unmarshalPendingAssetGroup(t *testing.T,
 	asset.GroupVirtualTx) {
 
 	require.NotNil(t, a.GroupVirtualTx)
-	virtualTx, err := taprpc.UnmarshalGroupVirtualTx(a.GroupVirtualTx)
+	virtualTx, err := rpcutils.UnmarshalGroupVirtualTx(a.GroupVirtualTx)
 	require.NoError(t, err)
 
 	// Ensure that the group virtual tx is the same as the grouped virtual
@@ -721,7 +722,7 @@ func unmarshalPendingAssetGroup(t *testing.T,
 
 	// Unmarshal group key request.
 	require.NotNil(t, a.GroupKeyRequest)
-	keyReq, err := taprpc.UnmarshalGroupKeyRequest(a.GroupKeyRequest)
+	keyReq, err := rpcutils.UnmarshalGroupKeyRequest(a.GroupKeyRequest)
 	require.NoError(t, err)
 
 	return *keyReq, *virtualTx
diff --git a/itest/multisig.go b/itest/multisig.go
index 65fbf2bb..de3fa2e5 100644
--- a/itest/multisig.go
+++ b/itest/multisig.go
@@ -21,6 +21,7 @@ import (
 	"github.com/lightninglabs/taproot-assets/cmd/commands"
 	"github.com/lightninglabs/taproot-assets/commitment"
 	"github.com/lightninglabs/taproot-assets/fn"
+	"github.com/lightninglabs/taproot-assets/rpcutils"
 	"github.com/lightninglabs/taproot-assets/tappsbt"
 	"github.com/lightninglabs/taproot-assets/taprpc"
 	wrpc "github.com/lightninglabs/taproot-assets/taprpc/assetwalletrpc"
@@ -171,7 +172,7 @@ func MultiSigTest(t *testing.T, ctx context.Context, aliceTapd,
 	muSig2Addr, err := bobTapd.NewAddr(ctxt, &taprpc.NewAddrRequest{
 		AssetId:   firstBatchGenesis.AssetId,
 		Amt:       assetsToSend,
-		ScriptKey: taprpc.MarshalScriptKey(tapScriptKey),
+		ScriptKey: rpcutils.MarshalScriptKey(tapScriptKey),
 		InternalKey: &taprpc.KeyDescriptor{
 			RawKeyBytes: pubKeyBytes(btcInternalKey),
 		},
@@ -372,7 +373,7 @@ func DeriveKeys(t *testing.T, tapd commands.RpcClientsBundle) (asset.ScriptKey,
 		},
 	)
 	require.NoError(t, err)
-	scriptKey, err := taprpc.UnmarshalScriptKey(scriptKeyDesc.ScriptKey)
+	scriptKey, err := rpcutils.UnmarshalScriptKey(scriptKeyDesc.ScriptKey)
 	require.NoError(t, err)
 
 	internalKeyDesc, err := tapd.NextInternalKey(
@@ -381,7 +382,7 @@ func DeriveKeys(t *testing.T, tapd commands.RpcClientsBundle) (asset.ScriptKey,
 		},
 	)
 	require.NoError(t, err)
-	internalKeyLnd, err := taprpc.UnmarshalKeyDescriptor(
+	internalKeyLnd, err := rpcutils.UnmarshalKeyDescriptor(
 		internalKeyDesc.InternalKey,
 	)
 	require.NoError(t, err)
diff --git a/itest/oracle_harness.go b/itest/oracle_harness.go
index 0db11981..ca854f45 100644
--- a/itest/oracle_harness.go
+++ b/itest/oracle_harness.go
@@ -13,6 +13,7 @@ import (
 	"github.com/lightninglabs/taproot-assets/asset"
 	"github.com/lightninglabs/taproot-assets/rfqmath"
 	"github.com/lightninglabs/taproot-assets/rfqmsg"
+	"github.com/lightninglabs/taproot-assets/rpcutils"
 	oraclerpc "github.com/lightninglabs/taproot-assets/taprpc/priceoraclerpc"
 	"github.com/lightningnetwork/lnd/cert"
 	"github.com/stretchr/testify/require"
@@ -128,7 +129,7 @@ func (o *oracleHarness) getAssetRates(specifier asset.Specifier,
 	}
 
 	// Marshal subject asset rate to RPC format.
-	rpcSubjectAssetToBtcRate, err := oraclerpc.MarshalBigIntFixedPoint(
+	rpcSubjectAssetToBtcRate, err := rpcutils.MarshalBigIntFixedPoint(
 		subjectAssetRate,
 	)
 	if err != nil {
@@ -136,7 +137,7 @@ func (o *oracleHarness) getAssetRates(specifier asset.Specifier,
 	}
 
 	// Marshal payment asset rate to RPC format.
-	rpcPaymentAssetToBtcRate, err := oraclerpc.MarshalBigIntFixedPoint(
+	rpcPaymentAssetToBtcRate, err := rpcutils.MarshalBigIntFixedPoint(
 		rfqmsg.MilliSatPerBtc,
 	)
 	if err != nil {
@@ -182,7 +183,7 @@ func (o *oracleHarness) QueryAssetRates(_ context.Context,
 
 	// Ensure that the payment asset is BTC. We only support BTC as the
 	// payment asset in this example.
-	if !oraclerpc.IsAssetBtc(req.PaymentAsset) {
+	if !rpcutils.IsAssetBtc(req.PaymentAsset) {
 		log.Infof("Payment asset is not BTC: %v", req.PaymentAsset)
 
 		return &oraclerpc.QueryAssetRatesResponse{
diff --git a/itest/psbt_test.go b/itest/psbt_test.go
index 753832a7..51c7f1c6 100644
--- a/itest/psbt_test.go
+++ b/itest/psbt_test.go
@@ -21,6 +21,7 @@ import (
 	"github.com/lightninglabs/taproot-assets/fn"
 	"github.com/lightninglabs/taproot-assets/internal/test"
 	"github.com/lightninglabs/taproot-assets/proof"
+	"github.com/lightninglabs/taproot-assets/rpcutils"
 	"github.com/lightninglabs/taproot-assets/tapfreighter"
 	"github.com/lightninglabs/taproot-assets/tappsbt"
 	"github.com/lightninglabs/taproot-assets/taprpc"
@@ -85,6 +86,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 +157,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 +215,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 +289,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 +894,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 +920,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 +1250,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 +1430,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)
@@ -2677,7 +2709,7 @@ func testPsbtLockTimeSend(t *harnessTest) {
 	// We need to let the wallet of Bob know that we're going to use a
 	// script key with a custom root.
 	_, err = bob.DeclareScriptKey(ctxt, &wrpc.DeclareScriptKeyRequest{
-		ScriptKey: taprpc.MarshalScriptKey(bobAssetScriptKey),
+		ScriptKey: rpcutils.MarshalScriptKey(bobAssetScriptKey),
 	})
 	require.NoError(t.t, err)
 
@@ -2892,7 +2924,7 @@ func testPsbtRelativeLockTimeSend(t *harnessTest) {
 	// We need to let the wallet of Bob know that we're going to use a
 	// script key with a custom root.
 	_, err = bob.DeclareScriptKey(ctxt, &wrpc.DeclareScriptKeyRequest{
-		ScriptKey: taprpc.MarshalScriptKey(bobAssetScriptKey),
+		ScriptKey: rpcutils.MarshalScriptKey(bobAssetScriptKey),
 	})
 	require.NoError(t.t, err)
 
@@ -3108,7 +3140,7 @@ func testPsbtRelativeLockTimeSendProofFail(t *harnessTest) {
 	// We need to let the wallet of Bob know that we're going to use a
 	// script key with a custom root.
 	_, err = bob.DeclareScriptKey(ctxt, &wrpc.DeclareScriptKeyRequest{
-		ScriptKey: taprpc.MarshalScriptKey(bobAssetScriptKey),
+		ScriptKey: rpcutils.MarshalScriptKey(bobAssetScriptKey),
 	})
 	require.NoError(t.t, err)
 
@@ -3302,12 +3334,12 @@ func sendToTapscriptAddr(ctx context.Context, t *harnessTest, alice,
 		AssetVersion: mintedAsset.Version,
 		ScriptKey: &taprpc.ScriptKey{
 			PubKey: schnorr.SerializePubKey(bobAssetScriptKey),
-			KeyDesc: taprpc.MarshalKeyDescriptor(
+			KeyDesc: rpcutils.MarshalKeyDescriptor(
 				bobScriptKey.RawKey,
 			),
 			TapTweak: rootHash,
 		},
-		InternalKey: taprpc.MarshalKeyDescriptor(bobInternalKey),
+		InternalKey: rpcutils.MarshalKeyDescriptor(bobInternalKey),
 	})
 
 	require.NoError(t.t, err)
diff --git a/itest/send_test.go b/itest/send_test.go
index 1a7b037d..6645ce0f 100644
--- a/itest/send_test.go
+++ b/itest/send_test.go
@@ -13,6 +13,7 @@ import (
 	"github.com/lightninglabs/taproot-assets/fn"
 	"github.com/lightninglabs/taproot-assets/internal/test"
 	"github.com/lightninglabs/taproot-assets/proof"
+	"github.com/lightninglabs/taproot-assets/rpcutils"
 	"github.com/lightninglabs/taproot-assets/tapfreighter"
 	"github.com/lightninglabs/taproot-assets/taprpc"
 	wrpc "github.com/lightninglabs/taproot-assets/taprpc/assetwalletrpc"
@@ -1150,7 +1151,7 @@ func testSpendChangeOutputWhenProofTransferFail(t *harnessTest) {
 		// for this output.
 		firstOutput := firstTransfer.Outputs[0]
 		require.Equal(
-			t.t, taprpc.ProofDeliveryStatusNotApplicable,
+			t.t, rpcutils.ProofDeliveryStatusNotApplicable,
 			firstOutput.ProofDeliveryStatus,
 		)
 
@@ -1159,7 +1160,7 @@ func testSpendChangeOutputWhenProofTransferFail(t *harnessTest) {
 		// completed successfully.
 		secondOutput := firstTransfer.Outputs[1]
 		require.Equal(
-			t.t, taprpc.ProofDeliveryStatusPending,
+			t.t, rpcutils.ProofDeliveryStatusPending,
 			secondOutput.ProofDeliveryStatus,
 		)
 
@@ -1228,7 +1229,7 @@ func testSpendChangeOutputWhenProofTransferFail(t *harnessTest) {
 		// for this output.
 		firstOutput := firstTransfer.Outputs[0]
 		require.Equal(
-			t.t, taprpc.ProofDeliveryStatusNotApplicable,
+			t.t, rpcutils.ProofDeliveryStatusNotApplicable,
 			firstOutput.ProofDeliveryStatus,
 		)
 
@@ -1237,7 +1238,7 @@ func testSpendChangeOutputWhenProofTransferFail(t *harnessTest) {
 		// completed successfully.
 		secondOutput := firstTransfer.Outputs[1]
 		require.Equal(
-			t.t, taprpc.ProofDeliveryStatusPending,
+			t.t, rpcutils.ProofDeliveryStatusPending,
 			secondOutput.ProofDeliveryStatus,
 		)
 
@@ -1254,7 +1255,7 @@ func testSpendChangeOutputWhenProofTransferFail(t *harnessTest) {
 		// for this output.
 		firstOutput = secondTransfer.Outputs[0]
 		require.Equal(
-			t.t, taprpc.ProofDeliveryStatusNotApplicable,
+			t.t, rpcutils.ProofDeliveryStatusNotApplicable,
 			firstOutput.ProofDeliveryStatus,
 		)
 
@@ -1263,7 +1264,7 @@ func testSpendChangeOutputWhenProofTransferFail(t *harnessTest) {
 		// completed successfully.
 		secondOutput = secondTransfer.Outputs[1]
 		require.Equal(
-			t.t, taprpc.ProofDeliveryStatusPending,
+			t.t, rpcutils.ProofDeliveryStatusPending,
 			secondOutput.ProofDeliveryStatus,
 		)
 
@@ -1757,6 +1758,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 +1814,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/universe_test.go b/itest/universe_test.go
index 17e798bc..344b5a7b 100644
--- a/itest/universe_test.go
+++ b/itest/universe_test.go
@@ -17,6 +17,7 @@ import (
 	"github.com/lightninglabs/taproot-assets/fn"
 	"github.com/lightninglabs/taproot-assets/internal/test"
 	"github.com/lightninglabs/taproot-assets/mssmt"
+	"github.com/lightninglabs/taproot-assets/rpcutils"
 	"github.com/lightninglabs/taproot-assets/taprpc"
 	"github.com/lightninglabs/taproot-assets/taprpc/mintrpc"
 	unirpc "github.com/lightninglabs/taproot-assets/taprpc/universerpc"
@@ -760,7 +761,7 @@ func testFederationSyncConfig(t *harnessTest) {
 		AssetID:   assetID1,
 		ProofType: universe.ProofTypeIssuance,
 	}
-	uniIdRpc1 := unirpc.MarshalUniverseID(assetIDBytes1, nil)
+	uniIdRpc1 := rpcutils.MarshalUniverseID(assetIDBytes1, nil)
 	uniIdRpc1.ProofType = unirpc.ProofType_PROOF_TYPE_ISSUANCE
 
 	// Generate universe ID #2.
@@ -771,7 +772,7 @@ func testFederationSyncConfig(t *harnessTest) {
 		GroupKey:  groupKey2,
 		ProofType: universe.ProofTypeTransfer,
 	}
-	uniIdRpc2 := unirpc.MarshalUniverseID(nil, groupKeyBytes2)
+	uniIdRpc2 := rpcutils.MarshalUniverseID(nil, groupKeyBytes2)
 	uniIdRpc2.ProofType = unirpc.ProofType_PROOF_TYPE_TRANSFER
 
 	// Set both the global and a universe specific federation sync configs.
diff --git a/itest/utils.go b/itest/utils.go
index aaa63b1f..35056f0a 100644
--- a/itest/utils.go
+++ b/itest/utils.go
@@ -22,6 +22,7 @@ import (
 	"github.com/lightninglabs/taproot-assets/commitment"
 	"github.com/lightninglabs/taproot-assets/fn"
 	"github.com/lightninglabs/taproot-assets/proof"
+	"github.com/lightninglabs/taproot-assets/rpcutils"
 	"github.com/lightninglabs/taproot-assets/tapgarden"
 	"github.com/lightninglabs/taproot-assets/taprpc"
 	"github.com/lightninglabs/taproot-assets/taprpc/mintrpc"
@@ -449,6 +450,7 @@ func FinalizeBatchUnconfirmed(t *testing.T, minerClient *rpcclient.Client,
 	listRespUnconfirmed, err := tapClient.ListAssets(
 		ctxt, &taprpc.ListAssetRequest{
 			IncludeUnconfirmedMints: true,
+			ScriptKeyType:           allScriptKeysQuery,
 		},
 	)
 	require.NoError(t, err)
@@ -665,7 +667,7 @@ func ManualMintSimpleAsset(t *harnessTest, lndNode *node.HarnessNode,
 		OutputIndex:  anchorIdx,
 		Type:         asset.Type(req.AssetType),
 	}
-	assetVersion, err := taprpc.UnmarshalAssetVersion(req.AssetVersion)
+	assetVersion, err := rpcutils.UnmarshalAssetVersion(req.AssetVersion)
 	require.NoError(t.t, err)
 
 	newAsset, err := asset.New(
diff --git a/rfq/oracle_test.go b/rfq/oracle_test.go
index 7a99c629..e012c4d4 100644
--- a/rfq/oracle_test.go
+++ b/rfq/oracle_test.go
@@ -13,6 +13,7 @@ import (
 	"github.com/lightninglabs/taproot-assets/internal/test"
 	"github.com/lightninglabs/taproot-assets/rfqmath"
 	"github.com/lightninglabs/taproot-assets/rfqmsg"
+	"github.com/lightninglabs/taproot-assets/rpcutils"
 	"github.com/lightninglabs/taproot-assets/taprpc/priceoraclerpc"
 	"github.com/lightningnetwork/lnd/lnwire"
 	"github.com/stretchr/testify/require"
@@ -41,7 +42,7 @@ func (p *mockRpcPriceOracleServer) QueryAssetRates(_ context.Context,
 	subjectAssetRate := rfqmath.NewBigIntFixedPoint(testAssetRate, 3)
 
 	// Marshal the subject asset rate to a fixed point.
-	subjectAssetFp, err := priceoraclerpc.MarshalBigIntFixedPoint(
+	subjectAssetFp, err := rpcutils.MarshalBigIntFixedPoint(
 		subjectAssetRate,
 	)
 	if err != nil {
diff --git a/taprpc/priceoraclerpc/marshal_test.go b/rpcutils/price_oracle_marshal_test.go
similarity index 68%
rename from taprpc/priceoraclerpc/marshal_test.go
rename to rpcutils/price_oracle_marshal_test.go
index 23266c27..a8a352c6 100644
--- a/taprpc/priceoraclerpc/marshal_test.go
+++ b/rpcutils/price_oracle_marshal_test.go
@@ -1,9 +1,10 @@
-package priceoraclerpc
+package rpcutils
 
 import (
 	"encoding/hex"
 	"testing"
 
+	"github.com/lightninglabs/taproot-assets/taprpc/priceoraclerpc"
 	"github.com/stretchr/testify/require"
 )
 
@@ -11,7 +12,7 @@ import (
 type isAssetBtcTC struct {
 	testName string
 
-	assetSpecifier *AssetSpecifier
+	assetSpecifier *priceoraclerpc.AssetSpecifier
 	expected       bool
 }
 
@@ -32,13 +33,13 @@ func TestIsAssetBtc(t *testing.T) {
 		},
 		{
 			testName:       "empty asset specifier",
-			assetSpecifier: &AssetSpecifier{},
+			assetSpecifier: &priceoraclerpc.AssetSpecifier{},
 			expected:       false,
 		},
 		{
 			testName: "asset specifier with zero asset ID bytes",
-			assetSpecifier: &AssetSpecifier{
-				Id: &AssetSpecifier_AssetId{
+			assetSpecifier: &priceoraclerpc.AssetSpecifier{
+				Id: &priceoraclerpc.AssetSpecifier_AssetId{
 					AssetId: zeroAssetId[:],
 				},
 			},
@@ -47,8 +48,8 @@ func TestIsAssetBtc(t *testing.T) {
 		{
 			testName: "asset specifier with incorrect length " +
 				"zero asset ID bytes",
-			assetSpecifier: &AssetSpecifier{
-				Id: &AssetSpecifier_AssetId{
+			assetSpecifier: &priceoraclerpc.AssetSpecifier{
+				Id: &priceoraclerpc.AssetSpecifier_AssetId{
 					AssetId: []byte{0, 0, 0},
 				},
 			},
@@ -56,8 +57,8 @@ func TestIsAssetBtc(t *testing.T) {
 		},
 		{
 			testName: "asset specifier with empty asset ID bytes",
-			assetSpecifier: &AssetSpecifier{
-				Id: &AssetSpecifier_AssetId{
+			assetSpecifier: &priceoraclerpc.AssetSpecifier{
+				Id: &priceoraclerpc.AssetSpecifier_AssetId{
 					AssetId: []byte{},
 				},
 			},
@@ -65,8 +66,8 @@ func TestIsAssetBtc(t *testing.T) {
 		},
 		{
 			testName: "asset specifier with zero asset ID string",
-			assetSpecifier: &AssetSpecifier{
-				Id: &AssetSpecifier_AssetIdStr{
+			assetSpecifier: &priceoraclerpc.AssetSpecifier{
+				Id: &priceoraclerpc.AssetSpecifier_AssetIdStr{
 					AssetIdStr: zeroAssetHexStr,
 				},
 			},
@@ -74,8 +75,8 @@ func TestIsAssetBtc(t *testing.T) {
 		},
 		{
 			testName: "asset specifier with empty asset ID string",
-			assetSpecifier: &AssetSpecifier{
-				Id: &AssetSpecifier_AssetIdStr{
+			assetSpecifier: &priceoraclerpc.AssetSpecifier{
+				Id: &priceoraclerpc.AssetSpecifier_AssetIdStr{
 					AssetIdStr: "",
 				},
 			},
@@ -83,8 +84,8 @@ func TestIsAssetBtc(t *testing.T) {
 		},
 		{
 			testName: "asset specifier with set group key bytes",
-			assetSpecifier: &AssetSpecifier{
-				Id: &AssetSpecifier_GroupKey{
+			assetSpecifier: &priceoraclerpc.AssetSpecifier{
+				Id: &priceoraclerpc.AssetSpecifier_GroupKey{
 					GroupKey: []byte{0, 0, 0},
 				},
 			},
@@ -92,8 +93,8 @@ func TestIsAssetBtc(t *testing.T) {
 		},
 		{
 			testName: "asset specifier with set group key string",
-			assetSpecifier: &AssetSpecifier{
-				Id: &AssetSpecifier_GroupKeyStr{
+			assetSpecifier: &priceoraclerpc.AssetSpecifier{
+				Id: &priceoraclerpc.AssetSpecifier_GroupKeyStr{
 					GroupKeyStr: "test-group-key",
 				},
 			},
diff --git a/tapdb/addrs_test.go b/tapdb/addrs_test.go
index c3e306ac..b700dd4d 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_test.go b/tapdb/asset_minting_test.go
index 4f71cfd2..0c59de0b 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_store_test.go b/tapdb/assets_store_test.go
index bcc5ccf8..25b8ab19 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_test.go b/tapdb/migrations_test.go
index bb0eba0d..0696b3c5 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/testdata/migrations_test_00033_dummy_data.sql b/tapdb/testdata/migrations_test_00033_dummy_data.sql
new file mode 100644
index 00000000..dae50eed
--- /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);