diff --git a/lib/types/proto/lit/lit-status.ts b/lib/types/proto/lit/lit-status.ts index 2a9de7b..5cf28c6 100644 --- a/lib/types/proto/lit/lit-status.ts +++ b/lib/types/proto/lit/lit-status.ts @@ -24,6 +24,12 @@ export interface SubServerStatus { * starting up properly. */ error: string; + /** + * custom_status details a custom state that the sub-server has entered, + * which is unique to the sub-server, and which is not the standard + * disabled, running or errored state. + */ + customStatus: string; } /** The Status server can be used to query the state of various LiT sub-servers. */ diff --git a/lib/types/proto/lnd/walletrpc/walletkit.ts b/lib/types/proto/lnd/walletrpc/walletkit.ts index f786c7b..6ba68a0 100644 --- a/lib/types/proto/lnd/walletrpc/walletkit.ts +++ b/lib/types/proto/lnd/walletrpc/walletkit.ts @@ -677,6 +677,12 @@ export interface ListSweepsRequest { * replaced-by-fee, so will not be included in this output. */ verbose: boolean; + /** + * The start height to use when fetching sweeps. If not specified (0), the + * result will start from the earliest sweep. If set to -1 the result will + * only include unconfirmed sweeps (at the time of the call). + */ + startHeight: number; } export interface ListSweepsResponse { diff --git a/lib/types/proto/loop/client.ts b/lib/types/proto/loop/client.ts index 6fef79d..a9966dd 100644 --- a/lib/types/proto/loop/client.ts +++ b/lib/types/proto/loop/client.ts @@ -98,6 +98,16 @@ export enum FailureReason { * because the amount extended by an external loop in htlc is insufficient. */ FAILURE_REASON_INCORRECT_AMOUNT = 'FAILURE_REASON_INCORRECT_AMOUNT', + /** + * FAILURE_REASON_ABANDONED - FAILURE_REASON_ABANDONED indicates that a swap permanently failed because + * the client manually abandoned the swap. + */ + FAILURE_REASON_ABANDONED = 'FAILURE_REASON_ABANDONED', + /** + * FAILURE_REASON_INSUFFICIENT_CONFIRMED_BALANCE - FAILURE_REASON_INSUFFICIENT_CONFIRMED_BALANCE indicates that a swap + * wasn't published due to insufficient confirmed balance. + */ + FAILURE_REASON_INSUFFICIENT_CONFIRMED_BALANCE = 'FAILURE_REASON_INSUFFICIENT_CONFIRMED_BALANCE', UNRECOGNIZED = 'UNRECOGNIZED' } @@ -267,6 +277,12 @@ export interface LoopOutRequest { account: string; /** The address type of the account specified in the account field. */ accountAddrType: AddressType; + /** + * A flag indicating whether the defined destination address does not belong to + * the wallet. This is used to flag whether this loop out swap could have its + * associated sweep batched. + */ + isExternalAddr: boolean; } export interface LoopInRequest { @@ -422,7 +438,33 @@ export interface SwapStatus { label: string; } -export interface ListSwapsRequest {} +export interface ListSwapsRequest { + /** Optional filter to only return swaps that match the filter. */ + listSwapFilter: ListSwapsFilter | undefined; +} + +export interface ListSwapsFilter { + /** The type of the swap. */ + swapType: ListSwapsFilter_SwapTypeFilter; + /** If set, only pending swaps are returned. */ + pendingOnly: boolean; + /** If specified on creation, the outgoing channel set of the swap. */ + outgoingChanSet: string[]; + /** Label of swap to filter for. */ + label: string; + /** If specified on creation, the last hop of the swap. */ + loopInLastHop: Uint8Array | string; +} + +export enum ListSwapsFilter_SwapTypeFilter { + /** ANY - ANY indicates that no filter is applied. */ + ANY = 'ANY', + /** LOOP_OUT - LOOP_OUT indicates an loop out swap (off-chain to on-chain). */ + LOOP_OUT = 'LOOP_OUT', + /** LOOP_IN - LOOP_IN indicates a loop in swap (on-chain to off-chain). */ + LOOP_IN = 'LOOP_IN', + UNRECOGNIZED = 'UNRECOGNIZED' +} export interface ListSwapsResponse { /** The list of all currently known swaps and their status. */ @@ -814,6 +856,44 @@ export interface SuggestSwapsResponse { disqualified: Disqualified[]; } +export interface AbandonSwapRequest { + /** + * The swap identifier which currently is the hash that locks the HTLCs. When + * using REST, this field must be encoded as URL safe base64. + */ + id: Uint8Array | string; + /** + * A flag that tries to ensure that the client understands that they are + * risking loss of funds by abandoning a swap. This could happen if an + * abandoned swap would wait on a timeout sweep by the client. + */ + iKnowWhatIAmDoing: boolean; +} + +export interface AbandonSwapResponse {} + +export interface ListReservationsRequest {} + +export interface ListReservationsResponse { + /** The list of all currently known reservations and their status. */ + reservations: ClientReservation[]; +} + +export interface ClientReservation { + /** The reservation id that identifies this reservation. */ + reservationId: Uint8Array | string; + /** The state the reservation is in. */ + state: string; + /** The amount that the reservation is for. */ + amount: string; + /** The transaction id of the reservation. */ + txId: Uint8Array | string; + /** The vout of the reservation. */ + vout: number; + /** The expiry of the reservation. */ + expiry: number; +} + /** * SwapClient is a service that handles the client side process of onchain/offchain * swaps. The service is designed for a single client. @@ -857,6 +937,13 @@ export interface SwapClient { * SwapInfo returns all known details about a single swap. */ swapInfo(request?: DeepPartial): Promise; + /** + * loop: `abandonswap` + * AbandonSwap allows the client to abandon a swap. + */ + abandonSwap( + request?: DeepPartial + ): Promise; /** * loop: `terms` * LoopOutTerms returns the terms that the server enforces for a loop out swap. @@ -932,6 +1019,13 @@ export interface SwapClient { suggestSwaps( request?: DeepPartial ): Promise; + /** + * loop: `listreservations` + * ListReservations returns a list of all reservations the server opened to us. + */ + listReservations( + request?: DeepPartial + ): Promise; } type Builtin = diff --git a/lib/types/proto/schema.ts b/lib/types/proto/schema.ts index 041607c..d32d01e 100644 --- a/lib/types/proto/schema.ts +++ b/lib/types/proto/schema.ts @@ -70,5 +70,6 @@ export const subscriptionMethods = [ 'poolrpc.ChannelAuctioneer.SubscribeBatchAuction', 'poolrpc.ChannelAuctioneer.SubscribeSidecar', 'poolrpc.HashMail.RecvStream', - 'taprpc.TaprootAssets.SubscribeSendAssetEventNtfns' + 'taprpc.TaprootAssets.SubscribeSendAssetEventNtfns', + 'taprpc.TaprootAssets.SubscribeReceiveAssetEventNtfns' ]; diff --git a/lib/types/proto/tapd/assetwalletrpc/assetwallet.ts b/lib/types/proto/tapd/assetwalletrpc/assetwallet.ts index 524019c..4cef8d0 100644 --- a/lib/types/proto/tapd/assetwalletrpc/assetwallet.ts +++ b/lib/types/proto/tapd/assetwalletrpc/assetwallet.ts @@ -1,5 +1,6 @@ /* eslint-disable */ import type { + OutPoint, KeyDescriptor, ScriptKey, SendAssetResponse @@ -59,13 +60,6 @@ export interface PrevId { scriptKey: Uint8Array | string; } -export interface OutPoint { - /** Raw bytes representing the transaction id. */ - txid: Uint8Array | string; - /** The index of the output on the transaction. */ - outputIndex: number; -} - export interface SignVirtualPsbtRequest { /** * The PSBT of the virtual transaction that should be signed. The PSBT must @@ -109,6 +103,7 @@ export interface NextScriptKeyResponse { export interface ProveAssetOwnershipRequest { assetId: Uint8Array | string; scriptKey: Uint8Array | string; + outpoint: OutPoint | undefined; } export interface ProveAssetOwnershipResponse { @@ -175,6 +170,7 @@ export interface AssetWallet { request?: DeepPartial ): Promise; /** + * tapcli: `proofs proveownership` * ProveAssetOwnership creates an ownership proof embedded in an asset * transition proof. That ownership proof is a signed virtual transaction * spending the asset with a valid witness to prove the prover owns the keys @@ -184,6 +180,7 @@ export interface AssetWallet { request?: DeepPartial ): Promise; /** + * tapcli: `proofs verifyownership` * VerifyAssetOwnership verifies the asset ownership proof embedded in the * given transition proof of an asset and returns true if the proof is valid. */ diff --git a/lib/types/proto/tapd/mintrpc/mint.ts b/lib/types/proto/tapd/mintrpc/mint.ts index 01c017d..597333d 100644 --- a/lib/types/proto/tapd/mintrpc/mint.ts +++ b/lib/types/proto/tapd/mintrpc/mint.ts @@ -1,9 +1,9 @@ /* eslint-disable */ -import type { AssetType, AssetVersion, AssetMeta } from '../taprootassets'; +import type { AssetVersion, AssetType, AssetMeta } from '../taprootassets'; export enum BatchState { BATCH_STATE_UNKNOWN = 'BATCH_STATE_UNKNOWN', - BATCH_STATE_PEDNING = 'BATCH_STATE_PEDNING', + BATCH_STATE_PENDING = 'BATCH_STATE_PENDING', BATCH_STATE_FROZEN = 'BATCH_STATE_FROZEN', BATCH_STATE_COMMITTED = 'BATCH_STATE_COMMITTED', BATCH_STATE_BROADCAST = 'BATCH_STATE_BROADCAST', @@ -14,7 +14,9 @@ export enum BatchState { UNRECOGNIZED = 'UNRECOGNIZED' } -export interface MintAsset { +export interface PendingAsset { + /** The version of asset to mint. */ + assetVersion: AssetVersion; /** The type of the asset to be created. */ assetType: AssetType; /** The name, or "tag" of the asset. This will affect the final asset ID. */ @@ -29,6 +31,11 @@ export interface MintAsset { * AssetType is Collectible, then this field cannot be set. */ amount: string; + /** + * If true, then the asset will be created with a new group key, which allows + * for future asset issuance. + */ + newGroupedAsset: boolean; /** The specific group key this asset should be minted with. */ groupKey: Uint8Array | string; /** @@ -36,18 +43,47 @@ export interface MintAsset { * This asset will be minted with the same group key as the anchor asset. */ groupAnchor: string; +} + +export interface MintAsset { /** The version of asset to mint. */ assetVersion: AssetVersion; + /** The type of the asset to be created. */ + assetType: AssetType; + /** The name, or "tag" of the asset. This will affect the final asset ID. */ + name: string; + /** + * A blob that resents metadata related to the asset. This will affect the + * final asset ID. + */ + assetMeta: AssetMeta | undefined; + /** + * The total amount of units of the new asset that should be created. If the + * AssetType is Collectible, then this field cannot be set. + */ + amount: string; + /** + * If true, then the asset will be created with a group key, which allows for + * future asset issuance. + */ + newGroupedAsset: boolean; + /** + * If true, then a group key or group anchor can be set to mint this asset into + * an existing asset group. + */ + groupedAsset: boolean; + /** The specific group key this asset should be minted with. */ + groupKey: Uint8Array | string; + /** + * The name of the asset in the batch that will anchor a new asset group. + * This asset will be minted with the same group key as the anchor asset. + */ + groupAnchor: string; } export interface MintAssetRequest { /** The asset to be minted. */ asset: MintAsset | undefined; - /** - * If true, then the asset will be created with a group key, which allows for - * future asset issuance. - */ - enableEmission: boolean; /** * If true, then the assets currently in the batch won't be returned in the * response. This is mainly to avoid a lot of data being transmitted and @@ -68,10 +104,15 @@ export interface MintingBatch { * batched into the same minting transaction. */ batchKey: Uint8Array | string; - /** The assets that are part of the batch. */ - assets: MintAsset[]; + /** + * The transaction ID of the batch. Only populated if the batch has been + * committed. + */ + batchTxid: string; /** The state of the batch. */ state: BatchState; + /** The assets that are part of the batch. */ + assets: PendingAsset[]; } export interface FinalizeBatchRequest { diff --git a/lib/types/proto/tapd/taprootassets.ts b/lib/types/proto/tapd/taprootassets.ts index 539e175..410877b 100644 --- a/lib/types/proto/tapd/taprootassets.ts +++ b/lib/types/proto/tapd/taprootassets.ts @@ -86,6 +86,26 @@ export enum AddrEventStatus { UNRECOGNIZED = 'UNRECOGNIZED' } +/** + * ProofTransferType is the type of proof transfer attempt. The transfer is + * either a proof delivery to the transfer counterparty or receiving a proof + * from the transfer counterparty. Note that the transfer counterparty is + * usually the proof courier service. + */ +export enum ProofTransferType { + /** + * PROOF_TRANSFER_TYPE_SEND - This value indicates that the proof transfer attempt is a delivery to the + * transfer counterparty. + */ + PROOF_TRANSFER_TYPE_SEND = 'PROOF_TRANSFER_TYPE_SEND', + /** + * PROOF_TRANSFER_TYPE_RECEIVE - This value indicates that the proof transfer attempt is a receive from + * the transfer counterparty. + */ + PROOF_TRANSFER_TYPE_RECEIVE = 'PROOF_TRANSFER_TYPE_RECEIVE', + UNRECOGNIZED = 'UNRECOGNIZED' +} + export interface AssetMeta { /** * The raw data of the asset meta data. Based on the type below, this may be @@ -114,8 +134,6 @@ export interface AnchorInfo { * resides. */ anchorTx: Uint8Array | string; - /** The txid of the above transaction. */ - anchorTxid: string; /** The block hash the contains the anchor transaction above. */ anchorBlockHash: string; /** The outpoint (txid:vout) that stores the Taproot Asset commitment. */ @@ -147,6 +165,8 @@ export interface GenesisInfo { metaHash: Uint8Array | string; /** The asset ID that uniquely identifies the asset. */ assetId: Uint8Array | string; + /** The type of the asset. */ + assetType: AssetType; /** * The index of the output that carries the unique Taproot Asset commitment in * the genesis transaction. @@ -181,8 +201,6 @@ export interface GroupKeyReveal { export interface GenesisReveal { /** The base genesis information in the genesis reveal. */ genesisBaseReveal: GenesisInfo | undefined; - /** The asset type, not included in the base genesis info. */ - assetType: AssetType; } export interface Asset { @@ -190,8 +208,6 @@ export interface Asset { version: AssetVersion; /** The base genesis information of an asset. This information never changes. */ assetGenesis: GenesisInfo | undefined; - /** The type of the asset. */ - assetType: AssetType; /** The total amount of the asset stored in this Taproot Asset UTXO. */ amount: string; /** An optional locktime, as with Bitcoin transactions. */ @@ -335,8 +351,6 @@ export interface ListBalancesRequest { export interface AssetBalance { /** The base genesis information of an asset. This information never changes. */ assetGenesis: GenesisInfo | undefined; - /** The type of the asset. */ - assetType: AssetType; /** The balance of the asset owned by the target daemon. */ balance: string; } @@ -679,6 +693,7 @@ export interface DecodeProofResponse { export interface ExportProofRequest { assetId: Uint8Array | string; scriptKey: Uint8Array | string; + outpoint: OutPoint | undefined; } export interface AddrEvent { @@ -758,10 +773,10 @@ export interface SendAssetEvent { /** An event which indicates that a send state is about to be executed. */ executeSendStateEvent: ExecuteSendStateEvent | undefined; /** - * An event which indicates that the proof send backoff wait period will - * start imminently. + * An event which indicates that the proof transfer backoff wait period + * will start imminently. */ - receiverProofBackoffWaitEvent: ReceiverProofBackoffWaitEvent | undefined; + proofTransferBackoffWaitEvent: ProofTransferBackoffWaitEvent | undefined; } export interface ExecuteSendStateEvent { @@ -771,7 +786,7 @@ export interface ExecuteSendStateEvent { sendState: string; } -export interface ReceiverProofBackoffWaitEvent { +export interface ProofTransferBackoffWaitEvent { /** Transfer attempt timestamp (microseconds). */ timestamp: string; /** Backoff is the active backoff wait duration. */ @@ -782,6 +797,29 @@ export interface ReceiverProofBackoffWaitEvent { * receiver. */ triesCounter: string; + /** The type of proof transfer attempt. */ + transferType: ProofTransferType; +} + +export interface SubscribeReceiveAssetEventNtfnsRequest {} + +export interface AssetReceiveCompleteEvent { + /** Event creation timestamp. */ + timestamp: string; + /** The address that received the asset. */ + address: Addr | undefined; + /** The outpoint of the transaction that was used to receive the asset. */ + outpoint: string; +} + +export interface ReceiveAssetEvent { + /** + * An event which indicates that the proof transfer backoff wait period + * will start imminently. + */ + proofTransferBackoffWaitEvent: ProofTransferBackoffWaitEvent | undefined; + /** An event which indicates that an asset receive process has finished. */ + assetReceiveCompleteEvent: AssetReceiveCompleteEvent | undefined; } export interface FetchAssetMetaRequest { @@ -816,6 +854,13 @@ export interface BurnAssetResponse { burnProof: DecodedProof | undefined; } +export interface OutPoint { + /** Raw bytes representing the transaction id. */ + txid: Uint8Array | string; + /** The index of the output on the transaction. */ + outputIndex: number; +} + export interface TaprootAssets { /** * tapcli: `assets list` @@ -953,6 +998,16 @@ export interface TaprootAssets { onError?: (err: Error) => void ): void; /** + * SubscribeReceiveAssetEventNtfns registers a subscription to the event + * notification stream which relates to the asset receive process. + */ + subscribeReceiveAssetEventNtfns( + request?: DeepPartial, + onMessage?: (msg: ReceiveAssetEvent) => void, + onError?: (err: Error) => void + ): void; + /** + * tapcli: `assets meta` * FetchAssetMeta allows a caller to fetch the reveal meta data for an asset * either by the asset ID for that asset, or a meta hash. */ diff --git a/lib/types/proto/tapd/universerpc/universe.ts b/lib/types/proto/tapd/universerpc/universe.ts index 0b83b85..c490eed 100644 --- a/lib/types/proto/tapd/universerpc/universe.ts +++ b/lib/types/proto/tapd/universerpc/universe.ts @@ -47,8 +47,19 @@ export enum AssetTypeFilter { UNRECOGNIZED = 'UNRECOGNIZED' } -/** TODO(roasbeef): filter by asset ID, etc? */ -export interface AssetRootRequest {} +export interface AssetRootRequest { + /** + * If true, then the response will include the amounts for each asset ID + * of grouped assets. + */ + withAmountsById: boolean; + /** The offset for the page. */ + offset: number; + /** The length limit for the page. */ + limit: number; + /** The direction of the page. */ + direction: SortDirection; +} export interface MerkleSumNode { /** The MS-SMT root hash for the branch node. */ @@ -148,6 +159,17 @@ export interface AssetKey { scriptKeyStr: string | undefined; } +export interface AssetLeafKeysRequest { + /** The ID of the asset to query for. */ + id: ID | undefined; + /** The offset for the page. */ + offset: number; + /** The length limit for the page. */ + limit: number; + /** The direction of the page. */ + direction: SortDirection; +} + export interface AssetLeafKeyResponse { /** The set of asset leaf keys for the given asset ID or group key. */ assetKeys: AssetKey[]; @@ -157,11 +179,11 @@ export interface AssetLeaf { /** The asset included in the leaf. */ asset: Asset | undefined; /** - * The asset issuance proof, which proves that the asset specified above - * was issued properly. This is always just an individual mint/transfer - * proof and never a proof file. + * The asset issuance or transfer proof, which proves that the asset + * specified above was issued or transferred properly. This is always just + * an individual mint/transfer proof and never a proof file. */ - issuanceProof: Uint8Array | string; + proof: Uint8Array | string; } export interface AssetLeafResponse { @@ -216,8 +238,6 @@ export interface InfoResponse { * servers when they are exposed under different hostnames/ports. */ runtimeId: string; - /** The number of assets known to this Universe server. */ - numAssets: string; } export interface SyncTarget { @@ -336,6 +356,7 @@ export interface AssetStatsAsset { assetType: AssetType; genesisHeight: number; genesisTimestamp: string; + anchorPoint: string; } export interface UniverseAssetStats { @@ -446,12 +467,14 @@ export interface Universe { * tapcli: `universe keys` * AssetLeafKeys queries for the set of Universe keys associated with a given * asset_id or group_key. Each key takes the form: (outpoint, script_key), - * where outpoint is an outpoint in the Bitcoin blockcahin that anchors a + * where outpoint is an outpoint in the Bitcoin blockchain that anchors a * valid Taproot Asset commitment, and script_key is the script_key of * the asset within the Taproot Asset commitment for the given asset_id or * group_key. */ - assetLeafKeys(request?: DeepPartial): Promise; + assetLeafKeys( + request?: DeepPartial + ): Promise; /** * tapcli: `universe leaves` * AssetLeaves queries for the set of asset leaves (the values in the Universe @@ -552,6 +575,7 @@ export interface Universe { request?: DeepPartial ): Promise; /** + * tapcli: `universe federation config info` * QueryFederationSyncConfig queries the universe federation sync configuration * settings. */ diff --git a/package.json b/package.json index 8318a9a..665d6d1 100644 --- a/package.json +++ b/package.json @@ -1,16 +1,16 @@ { "name": "@lightninglabs/lnc-core", - "version": "0.3.0-alpha", + "version": "0.3.1-alpha", "description": "Type definitions and utilities for Lightning Node Connect", "main": "./dist/index.js", "types": "./dist/index.d.ts", "config": { - "lnd_release_tag": "v0.17.0-beta", - "loop_release_tag": "v0.26.4-beta", + "lnd_release_tag": "v0.17.4-beta", + "loop_release_tag": "v0.27.0-beta", "pool_release_tag": "v0.6.4-beta", "faraday_release_tag": "v0.2.11-alpha", - "tapd_release_tag": "v0.3.0", - "lit_release_tag": "v0.12.0-alpha", + "tapd_release_tag": "v0.3.3", + "lit_release_tag": "v0.12.3-alpha", "protoc_version": "21.9" }, "scripts": { diff --git a/protos/lit/v0.12.0-alpha/firewall.proto b/protos/lit/v0.12.3-alpha/firewall.proto similarity index 100% rename from protos/lit/v0.12.0-alpha/firewall.proto rename to protos/lit/v0.12.3-alpha/firewall.proto diff --git a/protos/lit/v0.12.0-alpha/lit-autopilot.proto b/protos/lit/v0.12.3-alpha/lit-autopilot.proto similarity index 100% rename from protos/lit/v0.12.0-alpha/lit-autopilot.proto rename to protos/lit/v0.12.3-alpha/lit-autopilot.proto diff --git a/protos/lit/v0.12.0-alpha/lit-sessions.proto b/protos/lit/v0.12.3-alpha/lit-sessions.proto similarity index 100% rename from protos/lit/v0.12.0-alpha/lit-sessions.proto rename to protos/lit/v0.12.3-alpha/lit-sessions.proto diff --git a/protos/lit/v0.12.0-alpha/lit-status.proto b/protos/lit/v0.12.3-alpha/lit-status.proto similarity index 78% rename from protos/lit/v0.12.0-alpha/lit-status.proto rename to protos/lit/v0.12.3-alpha/lit-status.proto index c7ec558..7fb0d96 100644 --- a/protos/lit/v0.12.0-alpha/lit-status.proto +++ b/protos/lit/v0.12.3-alpha/lit-status.proto @@ -28,4 +28,9 @@ message SubServerStatus { // error describes an error that might have resulted in the sub-server not // starting up properly. string error = 3; + + // custom_status details a custom state that the sub-server has entered, + // which is unique to the sub-server, and which is not the standard + // disabled, running or errored state. + string custom_status = 4; } diff --git a/protos/lnd/v0.17.0-beta/autopilotrpc/autopilot.proto b/protos/lnd/v0.17.4-beta/autopilotrpc/autopilot.proto similarity index 100% rename from protos/lnd/v0.17.0-beta/autopilotrpc/autopilot.proto rename to protos/lnd/v0.17.4-beta/autopilotrpc/autopilot.proto diff --git a/protos/lnd/v0.17.0-beta/chainrpc/chainnotifier.proto b/protos/lnd/v0.17.4-beta/chainrpc/chainnotifier.proto similarity index 100% rename from protos/lnd/v0.17.0-beta/chainrpc/chainnotifier.proto rename to protos/lnd/v0.17.4-beta/chainrpc/chainnotifier.proto diff --git a/protos/lnd/v0.17.0-beta/invoicesrpc/invoices.proto b/protos/lnd/v0.17.4-beta/invoicesrpc/invoices.proto similarity index 100% rename from protos/lnd/v0.17.0-beta/invoicesrpc/invoices.proto rename to protos/lnd/v0.17.4-beta/invoicesrpc/invoices.proto diff --git a/protos/lnd/v0.17.0-beta/lightning.proto b/protos/lnd/v0.17.4-beta/lightning.proto similarity index 100% rename from protos/lnd/v0.17.0-beta/lightning.proto rename to protos/lnd/v0.17.4-beta/lightning.proto diff --git a/protos/lnd/v0.17.0-beta/routerrpc/router.proto b/protos/lnd/v0.17.4-beta/routerrpc/router.proto similarity index 100% rename from protos/lnd/v0.17.0-beta/routerrpc/router.proto rename to protos/lnd/v0.17.4-beta/routerrpc/router.proto diff --git a/protos/lnd/v0.17.0-beta/signrpc/signer.proto b/protos/lnd/v0.17.4-beta/signrpc/signer.proto similarity index 100% rename from protos/lnd/v0.17.0-beta/signrpc/signer.proto rename to protos/lnd/v0.17.4-beta/signrpc/signer.proto diff --git a/protos/lnd/v0.17.0-beta/walletrpc/walletkit.proto b/protos/lnd/v0.17.4-beta/walletrpc/walletkit.proto similarity index 99% rename from protos/lnd/v0.17.0-beta/walletrpc/walletkit.proto rename to protos/lnd/v0.17.4-beta/walletrpc/walletkit.proto index 0d3fd95..fe54232 100644 --- a/protos/lnd/v0.17.0-beta/walletrpc/walletkit.proto +++ b/protos/lnd/v0.17.4-beta/walletrpc/walletkit.proto @@ -1035,6 +1035,13 @@ message ListSweepsRequest { replaced-by-fee, so will not be included in this output. */ bool verbose = 1; + + /* + The start height to use when fetching sweeps. If not specified (0), the + result will start from the earliest sweep. If set to -1 the result will + only include unconfirmed sweeps (at the time of the call). + */ + int32 start_height = 2; } message ListSweepsResponse { diff --git a/protos/lnd/v0.17.0-beta/walletunlocker.proto b/protos/lnd/v0.17.4-beta/walletunlocker.proto similarity index 100% rename from protos/lnd/v0.17.0-beta/walletunlocker.proto rename to protos/lnd/v0.17.4-beta/walletunlocker.proto diff --git a/protos/lnd/v0.17.0-beta/watchtowerrpc/watchtower.proto b/protos/lnd/v0.17.4-beta/watchtowerrpc/watchtower.proto similarity index 100% rename from protos/lnd/v0.17.0-beta/watchtowerrpc/watchtower.proto rename to protos/lnd/v0.17.4-beta/watchtowerrpc/watchtower.proto diff --git a/protos/lnd/v0.17.0-beta/wtclientrpc/wtclient.proto b/protos/lnd/v0.17.4-beta/wtclientrpc/wtclient.proto similarity index 100% rename from protos/lnd/v0.17.0-beta/wtclientrpc/wtclient.proto rename to protos/lnd/v0.17.4-beta/wtclientrpc/wtclient.proto diff --git a/protos/loop/v0.26.4-beta/client.proto b/protos/loop/v0.27.0-beta/client.proto similarity index 91% rename from protos/loop/v0.26.4-beta/client.proto rename to protos/loop/v0.27.0-beta/client.proto index 7bf3c70..7343dd7 100644 --- a/protos/loop/v0.26.4-beta/client.proto +++ b/protos/loop/v0.27.0-beta/client.proto @@ -43,6 +43,11 @@ service SwapClient { */ rpc SwapInfo (SwapInfoRequest) returns (SwapStatus); + /* loop: `abandonswap` + AbandonSwap allows the client to abandon a swap. + */ + rpc AbandonSwap (AbandonSwapRequest) returns (AbandonSwapResponse); + /* loop: `terms` LoopOutTerms returns the terms that the server enforces for a loop out swap. */ @@ -104,6 +109,12 @@ service SwapClient { [EXPERIMENTAL]: endpoint is subject to change. */ rpc SuggestSwaps (SuggestSwapsRequest) returns (SuggestSwapsResponse); + + /* loop: `listreservations` + ListReservations returns a list of all reservations the server opened to us. + */ + rpc ListReservations (ListReservationsRequest) + returns (ListReservationsResponse); } message LoopOutRequest { @@ -224,6 +235,13 @@ message LoopOutRequest { The address type of the account specified in the account field. */ AddressType account_addr_type = 16; + + /* + A flag indicating whether the defined destination address does not belong to + the wallet. This is used to flag whether this loop out swap could have its + associated sweep batched. + */ + bool is_external_addr = 17; } /* @@ -524,9 +542,49 @@ enum FailureReason { because the amount extended by an external loop in htlc is insufficient. */ FAILURE_REASON_INCORRECT_AMOUNT = 6; + + /* + FAILURE_REASON_ABANDONED indicates that a swap permanently failed because + the client manually abandoned the swap. + */ + FAILURE_REASON_ABANDONED = 7; + + /* + FAILURE_REASON_INSUFFICIENT_CONFIRMED_BALANCE indicates that a swap + wasn't published due to insufficient confirmed balance. + */ + FAILURE_REASON_INSUFFICIENT_CONFIRMED_BALANCE = 8; } message ListSwapsRequest { + // Optional filter to only return swaps that match the filter. + ListSwapsFilter list_swap_filter = 1; +} + +message ListSwapsFilter { + enum SwapTypeFilter { + // ANY indicates that no filter is applied. + ANY = 0; + // LOOP_OUT indicates an loop out swap (off-chain to on-chain). + LOOP_OUT = 1; + + // LOOP_IN indicates a loop in swap (on-chain to off-chain). + LOOP_IN = 2; + } + // The type of the swap. + SwapTypeFilter swap_type = 1; + + // If set, only pending swaps are returned. + bool pending_only = 2; + + // If specified on creation, the outgoing channel set of the swap. + repeated uint64 outgoing_chan_set = 3; + + // Label of swap to filter for. + string label = 4; + + // If specified on creation, the last hop of the swap. + bytes loop_in_last_hop = 5; } message ListSwapsResponse { @@ -1180,3 +1238,59 @@ message SuggestSwapsResponse { */ repeated Disqualified disqualified = 2; } + +message AbandonSwapRequest { + /* + The swap identifier which currently is the hash that locks the HTLCs. When + using REST, this field must be encoded as URL safe base64. + */ + bytes id = 1; + + /* + A flag that tries to ensure that the client understands that they are + risking loss of funds by abandoning a swap. This could happen if an + abandoned swap would wait on a timeout sweep by the client. + */ + bool i_know_what_i_am_doing = 2; +} + +message AbandonSwapResponse { +} + +message ListReservationsRequest { +} + +message ListReservationsResponse { + /* + The list of all currently known reservations and their status. + */ + repeated ClientReservation reservations = 1; +} + +message ClientReservation { + /* + The reservation id that identifies this reservation. + */ + bytes reservation_id = 1; + + /* + The state the reservation is in. + */ + string state = 2; + /* + The amount that the reservation is for. + */ + uint64 amount = 3; + /* + The transaction id of the reservation. + */ + bytes tx_id = 4; + /* + The vout of the reservation. + */ + uint32 vout = 5; + /* + The expiry of the reservation. + */ + uint32 expiry = 6; +} \ No newline at end of file diff --git a/protos/loop/v0.26.4-beta/debug.proto b/protos/loop/v0.27.0-beta/debug.proto similarity index 100% rename from protos/loop/v0.26.4-beta/debug.proto rename to protos/loop/v0.27.0-beta/debug.proto diff --git a/protos/loop/v0.26.4-beta/swapserverrpc/common.proto b/protos/loop/v0.27.0-beta/swapserverrpc/common.proto similarity index 100% rename from protos/loop/v0.26.4-beta/swapserverrpc/common.proto rename to protos/loop/v0.27.0-beta/swapserverrpc/common.proto diff --git a/protos/loop/v0.26.4-beta/swapserverrpc/server.proto b/protos/loop/v0.27.0-beta/swapserverrpc/server.proto similarity index 95% rename from protos/loop/v0.26.4-beta/swapserverrpc/server.proto rename to protos/loop/v0.27.0-beta/swapserverrpc/server.proto index 898c248..63a50b4 100644 --- a/protos/loop/v0.26.4-beta/swapserverrpc/server.proto +++ b/protos/loop/v0.27.0-beta/swapserverrpc/server.proto @@ -1,12 +1,11 @@ syntax = "proto3"; -import "common.proto"; - // We can't change this to swapserverrpc, it would be a breaking change because // the package name is also contained in the HTTP URIs and old clients would // call the wrong endpoints. Luckily with the go_package option we can have // different golang and RPC package names to fix protobuf namespace conflicts. package looprpc; +import "common.proto"; option go_package = "github.com/lightninglabs/loop/swapserverrpc"; @@ -47,6 +46,10 @@ service SwapServer { rpc MuSig2SignSweep (MuSig2SignSweepReq) returns (MuSig2SignSweepRes); rpc PushKey (ServerPushKeyReq) returns (ServerPushKeyRes); + + // FetchL402 is a simple non-l402-allowlisted request that is required + // in order to force the creation of an l402. + rpc FetchL402 (FetchL402Request) returns (FetchL402Response); } /** @@ -511,7 +514,6 @@ message ServerProbeRequest { // The protocol version that the client adheres to. ProtocolVersion protocol_version = 1; - // The probe amount. uint64 amt = 2; // The target node for the probe. @@ -594,6 +596,23 @@ message MuSig2SignSweepReq { // The psbt of the sweep txn. bytes sweep_tx_psbt = 6; + + // The prevout information of the sweep txn. + repeated PrevoutInfo prevout_info = 7; +} + +message PrevoutInfo { + // The value of the txout. + uint64 value = 1; + + // The pk_script of the txout. + bytes pk_script = 2; + + // The txid of the txout. + bytes txid_bytes = 3; + + // The index of the txout. + uint32 output_index = 4; } message MuSig2SignSweepRes { @@ -617,3 +636,13 @@ message ServerPushKeyReq { message ServerPushKeyRes { } + +// FetchL402Request is an empty request sent from the client to the server to +// fetch the lnd l402. +message FetchL402Request { +} + +// FetchL402Response is an empty response sent from the server to the client to +// confirm the lnd l402. +message FetchL402Response { +} \ No newline at end of file diff --git a/protos/tapd/v0.3.0/assetwalletrpc/assetwallet.proto b/protos/tapd/v0.3.3/assetwalletrpc/assetwallet.proto similarity index 95% rename from protos/tapd/v0.3.0/assetwalletrpc/assetwallet.proto rename to protos/tapd/v0.3.3/assetwalletrpc/assetwallet.proto index 5c6cbc0..c73240d 100644 --- a/protos/tapd/v0.3.0/assetwalletrpc/assetwallet.proto +++ b/protos/tapd/v0.3.3/assetwalletrpc/assetwallet.proto @@ -49,7 +49,7 @@ service AssetWallet { */ rpc NextScriptKey (NextScriptKeyRequest) returns (NextScriptKeyResponse); - /* + /* tapcli: `proofs proveownership` ProveAssetOwnership creates an ownership proof embedded in an asset transition proof. That ownership proof is a signed virtual transaction spending the asset with a valid witness to prove the prover owns the keys @@ -58,7 +58,7 @@ service AssetWallet { rpc ProveAssetOwnership (ProveAssetOwnershipRequest) returns (ProveAssetOwnershipResponse); - /* + /* tapcli: `proofs verifyownership` VerifyAssetOwnership verifies the asset ownership proof embedded in the given transition proof of an asset and returns true if the proof is valid. */ @@ -125,7 +125,7 @@ message PrevId { /* The bitcoin anchor output on chain that contains the input asset. */ - OutPoint outpoint = 1; + taprpc.OutPoint outpoint = 1; /* The asset ID of the previous asset tree. @@ -139,18 +139,6 @@ message PrevId { bytes script_key = 3; } -message OutPoint { - /* - Raw bytes representing the transaction id. - */ - bytes txid = 1; - - /* - The index of the output on the transaction. - */ - uint32 output_index = 2; -} - message SignVirtualPsbtRequest { /* The PSBT of the virtual transaction that should be signed. The PSBT must @@ -200,6 +188,8 @@ message ProveAssetOwnershipRequest { bytes asset_id = 1; bytes script_key = 2; + + taprpc.OutPoint outpoint = 3; } message ProveAssetOwnershipResponse { @@ -216,7 +206,7 @@ message VerifyAssetOwnershipResponse { message RemoveUTXOLeaseRequest { // The outpoint of the UTXO to remove the lease for. - OutPoint outpoint = 1; + taprpc.OutPoint outpoint = 1; } message RemoveUTXOLeaseResponse { diff --git a/protos/tapd/v0.3.0/mintrpc/mint.proto b/protos/tapd/v0.3.3/mintrpc/mint.proto similarity index 70% rename from protos/tapd/v0.3.0/mintrpc/mint.proto rename to protos/tapd/v0.3.3/mintrpc/mint.proto index e93e995..d632e02 100644 --- a/protos/tapd/v0.3.0/mintrpc/mint.proto +++ b/protos/tapd/v0.3.3/mintrpc/mint.proto @@ -33,60 +33,100 @@ service Mint { rpc ListBatches (ListBatchRequest) returns (ListBatchResponse); } -message MintAsset { +message PendingAsset { + // The version of asset to mint. + taprpc.AssetVersion asset_version = 1; + // The type of the asset to be created. - taprpc.AssetType asset_type = 1; + taprpc.AssetType asset_type = 2; // The name, or "tag" of the asset. This will affect the final asset ID. - string name = 2; + string name = 3; /* A blob that resents metadata related to the asset. This will affect the final asset ID. */ - taprpc.AssetMeta asset_meta = 3; + taprpc.AssetMeta asset_meta = 4; /* The total amount of units of the new asset that should be created. If the AssetType is Collectible, then this field cannot be set. */ - uint64 amount = 4; + uint64 amount = 5; /* - The specific group key this asset should be minted with. + If true, then the asset will be created with a new group key, which allows + for future asset issuance. */ - bytes group_key = 5; + bool new_grouped_asset = 6; + + // The specific group key this asset should be minted with. + bytes group_key = 7; /* The name of the asset in the batch that will anchor a new asset group. This asset will be minted with the same group key as the anchor asset. */ - string group_anchor = 6; + string group_anchor = 8; +} + +message MintAsset { + // The version of asset to mint. + taprpc.AssetVersion asset_version = 1; + + // The type of the asset to be created. + taprpc.AssetType asset_type = 2; + + // The name, or "tag" of the asset. This will affect the final asset ID. + string name = 3; /* - The version of asset to mint. + A blob that resents metadata related to the asset. This will affect the + final asset ID. */ - taprpc.AssetVersion asset_version = 7; -} + taprpc.AssetMeta asset_meta = 4; -message MintAssetRequest { /* - The asset to be minted. + The total amount of units of the new asset that should be created. If the + AssetType is Collectible, then this field cannot be set. */ - MintAsset asset = 1; + uint64 amount = 5; /* If true, then the asset will be created with a group key, which allows for future asset issuance. */ - bool enable_emission = 2; + bool new_grouped_asset = 6; + + /* + If true, then a group key or group anchor can be set to mint this asset into + an existing asset group. + */ + bool grouped_asset = 7; + + // The specific group key this asset should be minted with. + bytes group_key = 8; + + /* + The name of the asset in the batch that will anchor a new asset group. + This asset will be minted with the same group key as the anchor asset. + */ + string group_anchor = 9; +} + +message MintAssetRequest { + /* + The asset to be minted. + */ + MintAsset asset = 1; /* If true, then the assets currently in the batch won't be returned in the response. This is mainly to avoid a lot of data being transmitted and possibly printed on the command line in the case of a very large batch. */ - bool short_response = 3; + bool short_response = 2; } message MintAssetResponse { @@ -102,16 +142,22 @@ message MintingBatch { */ bytes batch_key = 1; - // The assets that are part of the batch. - repeated MintAsset assets = 2; + /* + The transaction ID of the batch. Only populated if the batch has been + committed. + */ + string batch_txid = 2; // The state of the batch. BatchState state = 3; + + // The assets that are part of the batch. + repeated PendingAsset assets = 4; } enum BatchState { BATCH_STATE_UNKNOWN = 0; - BATCH_STATE_PEDNING = 1; + BATCH_STATE_PENDING = 1; BATCH_STATE_FROZEN = 2; BATCH_STATE_COMMITTED = 3; BATCH_STATE_BROADCAST = 4; diff --git a/protos/tapd/v0.3.0/taprootassets.proto b/protos/tapd/v0.3.3/taprootassets.proto similarity index 92% rename from protos/tapd/v0.3.0/taprootassets.proto rename to protos/tapd/v0.3.3/taprootassets.proto index 042d5dc..18ec031 100644 --- a/protos/tapd/v0.3.0/taprootassets.proto +++ b/protos/tapd/v0.3.3/taprootassets.proto @@ -117,6 +117,13 @@ service TaprootAssets { returns (stream SendAssetEvent); /* + SubscribeReceiveAssetEventNtfns registers a subscription to the event + notification stream which relates to the asset receive process. + */ + rpc SubscribeReceiveAssetEventNtfns (SubscribeReceiveAssetEventNtfnsRequest) + returns (stream ReceiveAssetEvent); + + /* tapcli: `assets meta` FetchAssetMeta allows a caller to fetch the reveal meta data for an asset either by the asset ID for that asset, or a meta hash. */ @@ -176,9 +183,6 @@ message AnchorInfo { // resides. bytes anchor_tx = 1; - // The txid of the above transaction. - string anchor_txid = 2; - // The block hash the contains the anchor transaction above. string anchor_block_hash = 3; @@ -221,14 +225,17 @@ message GenesisInfo { // The asset ID that uniquely identifies the asset. bytes asset_id = 4; + // The type of the asset. + AssetType asset_type = 5; + /* The index of the output that carries the unique Taproot Asset commitment in the genesis transaction. */ - uint32 output_index = 5; + uint32 output_index = 6; // The version of the Taproot Asset commitment that created this asset. - int32 version = 6; + int32 version = 7; } message AssetGroup { @@ -261,9 +268,6 @@ message GroupKeyReveal { message GenesisReveal { // The base genesis information in the genesis reveal. GenesisInfo genesis_base_reveal = 1; - - // The asset type, not included in the base genesis info. - AssetType asset_type = 2; } enum AssetVersion { @@ -283,9 +287,6 @@ message Asset { // The base genesis information of an asset. This information never changes. GenesisInfo asset_genesis = 2; - // The type of the asset. - AssetType asset_type = 3; - // The total amount of the asset stored in this Taproot Asset UTXO. uint64 amount = 4; @@ -440,9 +441,6 @@ message AssetBalance { // The base genesis information of an asset. This information never changes. GenesisInfo asset_genesis = 1; - // The type of the asset. - AssetType asset_type = 2; - // The balance of the asset owned by the target daemon. uint64 balance = 3; } @@ -850,6 +848,7 @@ message DecodeProofResponse { message ExportProofRequest { bytes asset_id = 1; bytes script_key = 2; + OutPoint outpoint = 3; // TODO(roasbeef): specify information to make new state transition in proof // file? @@ -956,9 +955,9 @@ message SendAssetEvent { // An event which indicates that a send state is about to be executed. ExecuteSendStateEvent execute_send_state_event = 1; - // An event which indicates that the proof send backoff wait period will - // start imminently. - ReceiverProofBackoffWaitEvent receiver_proof_backoff_wait_event = 2; + // An event which indicates that the proof transfer backoff wait period + // will start imminently. + ProofTransferBackoffWaitEvent proof_transfer_backoff_wait_event = 2; } } @@ -970,7 +969,21 @@ message ExecuteSendStateEvent { string send_state = 2; } -message ReceiverProofBackoffWaitEvent { +// ProofTransferType is the type of proof transfer attempt. The transfer is +// either a proof delivery to the transfer counterparty or receiving a proof +// from the transfer counterparty. Note that the transfer counterparty is +// usually the proof courier service. +enum ProofTransferType { + // This value indicates that the proof transfer attempt is a delivery to the + // transfer counterparty. + PROOF_TRANSFER_TYPE_SEND = 0; + + // This value indicates that the proof transfer attempt is a receive from + // the transfer counterparty. + PROOF_TRANSFER_TYPE_RECEIVE = 1; +} + +message ProofTransferBackoffWaitEvent { // Transfer attempt timestamp (microseconds). int64 timestamp = 1; @@ -981,6 +994,34 @@ message ReceiverProofBackoffWaitEvent { // course of the current backoff procedure to deliver the proof to the // receiver. int64 tries_counter = 3; + + // The type of proof transfer attempt. + ProofTransferType transfer_type = 4; +} + +message SubscribeReceiveAssetEventNtfnsRequest { +} + +message AssetReceiveCompleteEvent { + // Event creation timestamp. + int64 timestamp = 1; + + // The address that received the asset. + Addr address = 2; + + // The outpoint of the transaction that was used to receive the asset. + string outpoint = 3; +} + +message ReceiveAssetEvent { + oneof event { + // An event which indicates that the proof transfer backoff wait period + // will start imminently. + ProofTransferBackoffWaitEvent proof_transfer_backoff_wait_event = 1; + + // An event which indicates that an asset receive process has finished. + AssetReceiveCompleteEvent asset_receive_complete_event = 2; + } } message FetchAssetMetaRequest { @@ -1023,3 +1064,15 @@ message BurnAssetResponse { // The burn transition proof for the asset burn output. DecodedProof burn_proof = 2; } + +message OutPoint { + /* + Raw bytes representing the transaction id. + */ + bytes txid = 1; + + /* + The index of the output on the transaction. + */ + uint32 output_index = 2; +} diff --git a/protos/tapd/v0.3.0/universerpc/universe.proto b/protos/tapd/v0.3.3/universerpc/universe.proto similarity index 94% rename from protos/tapd/v0.3.0/universerpc/universe.proto rename to protos/tapd/v0.3.3/universerpc/universe.proto index 8272999..20db158 100644 --- a/protos/tapd/v0.3.0/universerpc/universe.proto +++ b/protos/tapd/v0.3.3/universerpc/universe.proto @@ -28,12 +28,12 @@ service Universe { /* tapcli: `universe keys` AssetLeafKeys queries for the set of Universe keys associated with a given asset_id or group_key. Each key takes the form: (outpoint, script_key), - where outpoint is an outpoint in the Bitcoin blockcahin that anchors a + where outpoint is an outpoint in the Bitcoin blockchain that anchors a valid Taproot Asset commitment, and script_key is the script_key of the asset within the Taproot Asset commitment for the given asset_id or group_key. */ - rpc AssetLeafKeys (ID) returns (AssetLeafKeyResponse); + rpc AssetLeafKeys (AssetLeafKeysRequest) returns (AssetLeafKeyResponse); /* tapcli: `universe leaves` AssetLeaves queries for the set of asset leaves (the values in the Universe @@ -134,7 +134,7 @@ service Universe { rpc SetFederationSyncConfig (SetFederationSyncConfigRequest) returns (SetFederationSyncConfigResponse); - /* + /* tapcli: `universe federation config info` QueryFederationSyncConfig queries the universe federation sync configuration settings. */ @@ -143,6 +143,19 @@ service Universe { } message AssetRootRequest { + // If true, then the response will include the amounts for each asset ID + // of grouped assets. + bool with_amounts_by_id = 1; + + // The offset for the page. + int32 offset = 2; + + // The length limit for the page. + int32 limit = 3; + + // The direction of the page. + SortDirection direction = 4; + // TODO(roasbeef): filter by asset ID, etc? } @@ -256,6 +269,20 @@ message AssetKey { } } +message AssetLeafKeysRequest { + // The ID of the asset to query for. + ID id = 1; + + // The offset for the page. + int32 offset = 2; + + // The length limit for the page. + int32 limit = 3; + + // The direction of the page. + SortDirection direction = 4; +} + message AssetLeafKeyResponse { // The set of asset leaf keys for the given asset ID or group key. repeated AssetKey asset_keys = 1; @@ -267,10 +294,10 @@ message AssetLeaf { // TODO(roasbeef): only needed for display? can get from proof below ^ - // The asset issuance proof, which proves that the asset specified above - // was issued properly. This is always just an individual mint/transfer - // proof and never a proof file. - bytes issuance_proof = 2; + // The asset issuance or transfer proof, which proves that the asset + // specified above was issued or transferred properly. This is always just + // an individual mint/transfer proof and never a proof file. + bytes proof = 2; } message AssetLeafResponse { @@ -328,9 +355,6 @@ message InfoResponse { // server, changes with each restart. Mainly used to identify identical // servers when they are exposed under different hostnames/ports. int64 runtime_id = 1; - - // The number of assets known to this Universe server. - uint64 num_assets = 2; } enum UniverseSyncMode { @@ -500,6 +524,8 @@ message AssetStatsAsset { int32 genesis_height = 6; int64 genesis_timestamp = 7; + + string anchor_point = 8; } message UniverseAssetStats {