With this type of asset, transfers are restricted based upon Liquid Securities investor and category records. We refer to these types of asset as ‘Investor-Restricted’ as being able to receive the asset is restricted by an investor’s membership of categories. Note that in all cases the receiving destination must always be a valid Liquid Securities Account or one of the issuer’s own Liquid treasury addresses. Issuers are also able to manage a UTXO ‘blacklist’ which prevents spends from a list of issuer-defined outputs.
Liquid Securities will also let an issuer define an API endpoint for each asset that will handle the authorization of transfer requests. When an ‘issuer authorization endpoint’ has been specified against an asset, Liquid Securities passes Blockstream Green transfer requests to the issuer for approval. The result from that is then returned to the Blockstream Green server, bypassing any category-based restrictions that might be defined within Liquid Securities. This feature provides extensibility to the transfer rules outlined below and allows the issuer to implement their own transfer policy. The process below outlines the default behaviour of category-based transfer restrictions and assumes no use of the issuer authorization endpoint.
Some of the concepts outlined below have API endpoints that are also used when managing Tracked Assets, but as they do not relate to investors in that case, the following are only really applicable to Investor-Restricted assets.
An Asset is issued by the Liquid Securities Server based upon an assets/issue API request by the Issuer. The Asset, and any associated Reissuance Tokens, are issued directly to the address provided by the Issuer. The initial issuance amounts can only be moved by the issuer’s Elements Core wallet.
Distributions of the asset to Investors can only be performed by the issuer’s Elements Core wallet and require that the asset has been registered with the Blockstream Green server as an authorized asset. The Liquid Securities API provides distribution data (receiving address/amount) to a Liquid Securities Python client that runs against the issuer’s Elements node and actions the distributions by broadcasting Liquid network transactions signed by the issuer’s Elements wallet. The Python script sends data back to Liquid Securities so the distribution can be tracked.
An Investor can only send the asset to other Liquid Securities enabled wallets. Before the Blockstream Green server co-signs a transaction, it checks with Liquid Securities to ensure the receiving Investor is authorized to receive the asset. This authorization is done by checking that the Investor meets the requirements of the asset, as defined by the issuer, and that it is a valid Liquid Securities Account address. If authorization is successful, the Blockstream Green server co-signs the transaction and it is broadcast on the Liquid network. The change in ownership is noted by Liquid Securities.
Being the only one holding the wallet keys controlling the asset’s reissuance token, only the issuer can perform Reissuances. The Liquid Securities API provides reissuance data (amount) to a Liquid Securities Python client that runs against the issuer’s Elements node and actions the reissuance request. The Python script sends data back to Liquid Securities so the distribution can be tracked. Once an asset has been reissued it can be distributed to investors through the process of assignment and distribution as above.
The process of redeeming a token begins with the Investor sending an amount of the token to the issuer by using one of the provided treasury addresses. The issuer then uses the Liquid Securities Python script to burn the required amount. The Python script sends data back to Liquid Securities so that changes to the circulating supply are recorded by Liquid Securities.
A single Liquid Securities Python Script will perform all of the script tasks above.
Liquid Securities allows for restricting asset transfers by creating the potential owner within Liquid Securities as an investor record and registering a Blockstream Green Liquid Securities Account ID (GAID) against it.
In order to receive an asset over the Liquid network, the investor must first create a Liquid Securities Account within their Blockstream Green wallet. Wallet registration allows Liquid Securities to enforce transfer restrictions as well as to track transfers per wallet. Investors that do not have wallets set up can still be added to Liquid Securities, but cannot receive transfers of assets until their wallet is registered. The wallet generates a unique address each time it receives assets.
Liquid Securities is able to restrict the transfer of assets between sender and receiver using user-defined Categories.
Investors can be assigned to one or more categories. Each asset defines which categories are required in order for an investor to receive an asset. Categories can be used to classify investors in various ways, such as by jurisdiction, accreditation status, or any other arbitrary classification that can be used to satisfy the requirements of the asset.
Categories enforce built-in transfer restrictions automatically within Liquid Securities. Advanced custom restriction rules can be applied using Liquid Securities’ transfer override function.
Example: A category of ‘US Institutional Investors’ is created and assigned to an asset. That asset can be said to have an asset requirement that only investors who are categorized as ‘US Institutional Investors’ are eligible to receive it.
Assignment is the act of pre-allocating amounts of an asset to investors for future distribution on the Liquid network. Issuers are free to modify an assignment as many times as necessary before it is marked for distribution. Assignment does not require that investors have a wallet registered but, without it, any subsequent distribution cannot begin. Assignment does not change Liquid wallet balances and is only recorded within Liquid Securities.
To allow distribution to begin, the asset must first be registered with Blockstream Green as an Authorized Asset. This is done using the Liquid Securities API.
When some, or all, of the asset has been assigned to investors, the issuer is then able to start a distribution.
Distribution is the process of transferring assigned amounts of an asset to the wallets of investors using transactions on the Liquid network. Asset amounts that have been assigned to investors can only be distributed if the investor has registered a Blockstream Green Liquid Securities Account ID (GAID).
Amounts of the asset are assigned to investors that meet the asset category requirements.
The assignments are marked as ready for distribution. Investor records must have a Blockstream Green Liquid Securities Account ID (GAID) recorded against them in order for this to succeed.
Liquid Securities uses the wallet registered against each investor to obtain receiving addresses from the Blockstream Green server.
Liquid Securities returns JSON formatted distribution data to the issuer. A Python client provided to Liquid Securities issuers uses this data to create and broadcast the distribution transaction. The transaction sends the assigned amounts to the wallets of the investors.
Once the transaction is confirmed, the script sends the transaction details back to Liquid Securities so that asset ownership and the remaining treasury balance can be updated. As Liquid uses Confidential Transactions by default, the ownership of assets is only known when certain information, such as blinding factors, are provided along with the transaction data.
Distributions do not have to be performed for all assignments at once. It is possible to assign an asset and then distribute it to a subset of assigned investors. It should be noted that, due to the maximum size of a Liquid network transaction, the greatest number of assignments that can be distributed in one ‘batch’ by Liquid Securities is currently 100.
The treasury balance is the amount held by the treasury wallet and includes the amount initially issued, plus the sum of any reissuances, minus any assignments and distributions.
Treasury balance: (amount initially issued) + (sum of amounts reissued) - (amounts assigned to investors but not yet distributed) - (amounts already distributed)
Amount in circulation: (amount initially issued) + (sum of amounts reissued)
Treasury balance example:
An amount of 100 of an asset is initially issued.
Two reissuances of 25 are carried out.
The amount in circulation is 150.
The treasury balance stands at 150.
Ten investors are then each assigned an amount of 2.
The treasury balance within Liquid Securities stands at 130. The treasury node’s wallet would show a balance of 150 as the assignment does not affect Liquid Network wallet balances.
The assignments are then distributed.
The treasury balance and the treasury node’s wallet both show a balance of 130. Each investor’s wallet shows a balance of 2.
The amount in circulation is still 150.