Transfer Restricted Assets¶
With this type of asset, transfers are restricted based upon Blockstream AMP investor and category records. We refer to these types of asset as ‘Transfer Restricted’ as being able to receive the asset is restricted by an investor’s membership of categories.
Although we refer to ‘investor’ records, the users you choose to record within Blockstream AMP can represent any type of registered user, depending on your use case.
In all cases the receiving destination must always be a valid Manged Assets account or one of the issuer’s own Liquid treasury addresses. Issuers are also able to manage a list of locked UTXOs, which prevents spends from a list of issuer-defined outputs.
Blockstream AMP 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, Blockstream AMP 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 Blockstream AMP. 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 Issuer Tracked assets, but as that asset type does not restrict transfers to registered users, the following are only really applicable to Transfer Restricted assets.
An Asset is issued by the Blockstream AMP 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/registerted users 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 Blockstream AMP API provides distribution data (receiving address/amount) to a Blockstream AMP 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 Blockstream AMP so the distribution can be tracked.
An Investor can only send the asset to other Blockstream AMP enabled wallets. Before the Blockstream Green server co-signs a transaction, it checks with Blockstream AMP 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 Blockstream AMP 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 Blockstream AMP.
Being the only one holding the wallet keys controlling the asset’s reissuance token, only the issuer can perform Reissuances. The Blockstream AMP API provides reissuance data (amount) to a Blockstream AMP Python client that runs against the issuer’s Elements node and actions the reissuance request. The Python script sends data back to Blockstream AMP 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 Blockstream AMP Python script to burn the required amount. The Python script sends data back to Blockstream AMP so that changes to the circulating supply are recorded by Blockstream AMP.
A single Blockstream AMP Python Script will perform all of the script tasks above.
Blockstream AMP allows for restricting asset transfers by creating the potential owner within Blockstream AMP as an investor record and registering a Blockstream Green Managed Assets Account ID (GAID) against it.
In order to receive an asset over the Liquid network, the investor must first create a Managed Assets account within their Blockstream Green wallet. Wallet registration allows Blockstream AMP 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 Blockstream AMP, but cannot receive transfers of assets until their wallet is registered. The wallet generates a unique address each time it receives assets.
Blockstream AMP 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 Blockstream AMP. Advanced custom restriction rules can be applied using Blockstream AMP’s 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 Blockstream AMP.
To allow distribution to begin, the asset must first be registered with Blockstream Green as an Authorized Asset. This is done using the Blockstream AMP 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 Managed Assets 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 Managed Assets Account ID (GAID) recorded against them in order for this to succeed.
Blockstream AMP uses the wallet registered against each investor to obtain receiving addresses from the Blockstream Green server.
Blockstream AMP returns JSON formatted distribution data to the issuer. A Python client provided to Blockstream AMP 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 Blockstream AMP 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 Blockstream AMP 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 Blockstream AMP 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.