Linked Pools are an extension of functionality for on-chain pools beyond the existing asset-financing logic. This feature will allow so-called “linked” pools to be funded directly by another pool where the system was previously limited to fund only assets.
The main objective for this is to extend the capabilities of Centrifuge Chain, making the protocol more flexible, suitable for a wider range of use cases and allowing the protocol to automatically manage how liquidity is distributed among linked pools. This RFC is deliberately not concerned with proposing use cases or business ideas and rather only deals with the technical aspects.
The goal of this feature is to extend the existing pools logic and not to implement a new type of pool. While the latter would be easier to accomplish, it would drastically increase maintenance work and increase the attack surface of the codebase. Relying on the existing pools logic allows us to make use of well-reviewed and well-audited code that takes care of capital flows inside of the pool.
Linked Pools are an extension for how a pool can be used. Currently, each pool acts as an individual reserve. Each pool on Centrifuge allows stablecoins to be deposited into the reserve of a pool, and these stablecoin reserves can be taken from the pool and the same amount of tokens must be returned later in time plus an additional possible interest payment.
We propose a
pallet-pool-links for which there is an extension of the existing functionality that a pool can also act as a reserve for other pools. A linked pool can be used as an individual reserve as well as a reserve for other pools. When the reserve of a linked pool (most frequently a stablecoin, such as USDC) is used by another pool, it receives Tranche Tokens (TTs) in return which are held in the linked pool account.
A pool with linking capabilities, a linked pool, is at its core a normal pool. This architecture allows additional flexibility for linked pools that are able to fund both assets directly as well as other pools. The process of how a pool can be registered as a linked pool is to be determined.
Once the pool is registered in
pallet-pool-links, stablecoin reserves in the pool can be used to fund other pools. The
pallet-investments hereby ensures that the pool must be listed like a normal investor for each pool it wants to invest into. This means that in order to invest into another pool, a pool must go through the other pool’s onboarding process, including KYC and signing subscription agreements.
The graphic above shows that the
pallet-pool-links is just another pallet on Centrifuge Chain that interacts with the
pallet-pool-system. Furthermore, it interacts with the pallet-investments in order to fund other pools with the stablecoins in its reserve.
As a pool with linking capabilities is just another pool at its core, the
pallet-pool-system still facilitates interest received (if applicable) on the investments. This feature also contains a way of valuing the extended portfolio of pools with linking capabilities. This is needed as the total value of a pool now (possibly) not only consists of the valuation of the individual assets it has funded, but also of the value of the assets being held by other pools, represented by the Tranche Tokens (TTs) it holds.
The pool’s portfolio is calculated by the sum of the values of all assets (if any) plus the value of the linked pools as determined by the on-chain valuation logic for assets. The value of the linked pools is calculated by the
pallet-pool-system on-chain valuation method that is also used when epochs are closed and investments and redemptions are fulfilled.
The following graphic visualizes the flow of stablecoin funds of a pool with linking capabilities. The first flow shows the flow of TTs when funds are being invested into a pool. The flow branches when they reach
Pool A. The pool either funds assets or funds other pools with it. Pools can be restricted to only fund assets, only fund other pools or fund both. In any case, the decision of what is funded at which time needs to be decided by an account with the right on-chain permissions.
Redemptions or distributions can either be satisfied by the given reserve the linked pool has, wait for repayments of actively financed assets or redeem some TTs of other pools it is holding.
The graphic below shows the flow in this case.
In both cases, the fulfillment of investments and redemptions depend on the execution of the epoch of a pool. Subsequently, this means that redeeming or processing a distribution from a pool with links to other pools might take more time as the epoch of linked pools needs to fulfill the orders made by the
pallet-pool-links. At the same time, it might take more time for a pool with links to other pools to generate interest as the investments made by the
pallet-pool-links need to be fulfilled by the epoch of the linked pools.
The following sub-chapters roughly sketch the modules that are part of the implementation of this feature. They describe the public API of the
pallet-pool-links and explain the calculation approach for each pools’ valuation.
The pallet itself exposes the additional functionality for deploying the funds of a pool’s stablecoin reserve. Compared to the existing
pallet-loans that allows funds to be borrowed directly from the pool against an asset, the
pallet-pool-links provides functionality for another pool to use the reserves of a linked pool, and the linked pool retains tranche tokens in exchange. The actual redemption action is triggered by an account with the right permissions on-chain. This is similar to how the chain controls which accounts are allowed to borrow against an asset.
An extrinsic that adds another existing pool to the possible pools that can be invested into. This extrinsic will not be callable by anybody and will be restricted. Which accounts are allowed to trigger this call is controlled by on-chain permissions and the configuration details for a given pool.
An extrinsic that removes a previously linked pool. This extrinsic will not be callable by anybody and will be restricted. Which accounts are allowed to trigger this call is controlled by on-chain permissions and the configuration details for a given pool.
An extrinsic that allows to define how the funds in the pool should be distributed among the pools that have previously been linked via
fn link_pool. This extrinsic will not be callable by anybody and will be restricted. Which accounts are allowed to trigger this call is controlled by on-chain permissions and the configuration details for a given pool.
An extrinsic that does invest/redeem according to the defined target positions. This extrinsic will not be callable by anybody and will be restricted. Which accounts are allowed to trigger this call is controlled by on-chain permissions and the configuration details for a given pool.
With this linked pool feature, as detailed above, the portfolio of a pool can now contain both assets and tranche tokens (TTs).
As the value of the linked pool can only indirectly be determined by the value of the pools it has invested in, the valuation logic must account for this fact.
Whether this valuation needs to be its own pallet is to be determined depending on the need for storage. Otherwise, it will be a simple struct wiring together the valuation of the assets in the pool and the assets from the other pools linked to it.
The given proposal will
- extend the versatility of the Centrifuge protocol
Responsible for implementing this feature would be k/f.
Adaptability is part of the Centrifuge mission. It is beneficial for Centrifuge to develop new functionalities to meet potential future market needs.
Edit note: This RFC is an updated version of RFC 5453 with clearer language. 5453 has been closed in favor of this rfc.
UPDATE 14th August 20:24 CET
This proposal has been submitted to the proposal repository on GitHub as CP59 so it is now final and the OpenSquare snapshot has been created.
The OpenSquare snapshot will be open from 14th August 20:30 CET - 21st August 20:30 CET (7 days)
Link to proposal on GitHub: https://github.com/centrifuge/cps/blob/main/cps/CP59.md
Vote here: CP59: Linked Pools