Create Pool New Designs
Part of the redesign project. Here are the designs for Creating a new pool: https://www.figma.com/design/ng7qdNcSCXSDA6ZUdWIs6u/Pool-Overview%2F-Pool-Detail?node-id=3492-508&node-type=canvas&t=SzkFDzqaCS5Gz1Fa-0
Main Changes
Instead of a single long page, we will break down the pool creation into 4 sections:
- Pool structure
- Pool Details
- Pool Setup
When in progress, it should be filled with the yellow (FFC012)
When all information has been completed and have moved to the next item, it should change to green
In Pool Structure: It will not be possible to choose which chain to deploy to. Therefore exclude from MVP
In Pool details, under Service Providers. The user can select the type of Service provider. If one does not exist, you can give the option to create a new one.
NB: If this is too much work, please exclude this. We can add later in a feature.
Part of Pool Setup,
We will be adding the "Investor Onboarding Section", which is currently not in the pool creation flow.
Here will give the options that are presented if the user were to edit the Pool configuration. It will now be in the initial pool creation flow.
@kattylucy added some more details
Section 1: Pool Structure
- Users should be able to see
Revolving poolandStatic pooloptions but Revolving pool should be auto-selected. User should not be able to select Static pool yet. - Below are the definitions to be added for the tool tips within tranche structure
Single tranche:
This pool will only have one investment class where all investors share the same level of risk and return.Two tranches:This pool will have two classes. Senior tranche which has priority in receiving returns. And Junior tranche which is the last to receive returns (after Senior tranche obligations are met) but receives higher yield as compensation for the higher risk.Three tranches.This pool will have three classes. Senior tranche is the safest tranche with priority in repayment. Mezzanine tranche has intermediate risk and receives payment after Senior tranche obligations are met. Junior tranche which only receives returns after both Senior and Mezzanine tranches are paid. - Please do not include
Tokenization modelsection for now - Within Asset setup, the user should only be able to select USDC, but still make the other two currencies (USDT and DAI) visible with coming soon.
- If the user selects Single tranche, then only Tranche 1 should show up. If they select two or three, then Tranche 2 and Tranche 3 should auto populate.
- Within Tranches, we will now provide additional options for APY. Target, 7 day, 30 day, 90 day, Year to date and Since inception. Whichever option is selected for Tranche 1, those have been auto-selected for Tranche 2 and 3. These yields will also need to be calculated and will be visible on the Landing and Overview pages. In the Overview box in the Overview page, we will highlight what type of APY was selected.
Section 2: Pool details
- Landing page description is currently max 100 characters. Does that ensure the description does not run into 3 lines on a laptop view? Otherwise we can trim it to 90 characters.
- Service providers are not mandatory, but if the user selects a service provider they HAVE to provide the
Name of provider
Section 3: Pool setup
- Security requirement is new. When the user selects
Singlewe only show one box for wallet address. When multi-sig is selected, we show two boxes and the CTA to Add another. Configuration change thresholdwith 1 out of X managers, where X is the number of wallets the user has added in the above section. That should be auto calculated.- For Pool delegates, the functionality is the same but we are more explicitly calling out originate/invest in pool so there shouldn't be additional tech work.
- Same for Fee setup, no changes there but we will auto fix Protocol fees on the top
- For investor onboarding, below are the definitions for the tool tips
Centrifuge onboarding:
Investors will go through the Centrifuge onboarding provider, Shuftipro, before they can invest in your pool.External:You can select the provider you want to KYC/onboard your investors.None:You can directly whitelist the addresses that can invest in the pool. - Note the option to upload subscription documents and tax documents checkbox should only show up if Centrifuge onboarding is selected. Not for the other two.
Top Progress section
- Whichever page the user is on, that bubble will be highlighted in yellow
- When all mandatory information has been completed and the user moves to a different section, the bubble should change to green. If all the mandatory information has not been completed, and the user moves to a different section, the bubble remains grey. The Create pool CTA should be grayed/disabled until all mandatory information across the 3 sections has been filled.
After clicking Create pool
- User should see a notification with two CTAs Close: the notification remains open until the user clicks this See proposal: direct them to the relevant https://gov.centrifuge.io/ page where the proposal is created
@kattylucy as discussed here's an overview of most of the data and where it should be sent, hope I didn't miss too much!
Create pool data
Get new pool ID by calling: centrifuge.pools.getAvailablePoolId(), you will need this later on
Create proxies must be called before anything else, the result will be 2 pure proxies (AO proxy = asset originator proxy, admin proxy). The AO proxy will be used to give the admin proxy permissions. The admin proxy will be passed into poolRegistry.register. Probs easiest to leave all that logic
Step 1
- pool metadata:
poolStructure(revolving)
- pool metadata: primary and secondary assets classes
- poolRegistry.register: asset denomination (equivalent to Currency in old form), currency data needs to be fetched using
ormlAssetRegistry.metadata
- pool metadata:
{
tokenName: string
symbolName: string
interestRate: number | ''
minRiskBuffer: number | ''
minInvestment: number | ''
targetAPY?: string | '' // possibly change this to { apy: {[type]: value} } ?
}
- poolRegistry.register:
{
trancheType: 'Residual' | { NonResidual: {.interestRatePerSecond: string, minRiskBuffer: string } }
metadata: {
tokenName: string,
tokenSymbol: string,
},
}[]
where junior tranche trancheType = residual
Step 2
All values belong in pool metadata. Keep in mind that all files (pdf, svg, jpeg) need to be pinned to IPFS first, their hash will then be the value in the pool metadata
Step 3
Multisig
if single, hide threshold section since it's not applicable without a multisig:
- pool metadata: n/a
if multisig:
- pool metadata:
adminMultisig?: {
signers: string[];
threshold: number;
}
- useWallet hook
addMultisig
substrate.addMultisig(
signers: string[];
threshold: number;
)
Asset originators
- pool metadata: n/a
- chain see here: https://github.com/centrifuge/apps/blob/main/centrifuge-app/src/pages/IssuerPool/Access/AssetOriginators.tsx#L223
@onnovisser can you please clarify what's can and can't be done before pool creation regarding AOs?
Fees
First fee is fixed. Rest of fees can be entered freely.
If primary asset class is "Public Credit", the Fee in % of NAV is 0.4% If primary asset class is "Private Credit", the Fee in % of NAV is 0.075%
- pool metadata:
poolFees: { id: number; name: string; feePosition: 'Top of waterfall'; category?: string; feeType: FeeTypes }[]
- poolRegistry.register()
[
'Top',
{
destination: fee.destination,
editor: fee?.account ? { account: fee.account } : 'Root',
feeType: { [fee.feeType]: { limit: { [fee.limit]: fee?.amount } } },
},
][]
Onboarding
if centrifuge onboarding is selected: show one upload button per tranche and show tax requirements checkbox
- pool metadata:
onboarding?: {
tranches: { [trancheId: string]: { agreement: FileType | undefined; openForOnboarding: boolean } }
taxInfoRequired?: boolean
}
cent.pools.updatePoolRolesInvestorAdmin permission needs to be granted toREACT_APP_MEMBERLIST_ADMIN_PURE_PROXY, that will be the account that will whitelist investors in the onboarding API
check OnboardingSettings.tsx for implementation.
if external is selected: show a text input where a link can be entered for external onboarding
onboarding?: {
externalOnboardingUrl?: string
}
if other: show nothing on the right hand side and don't submit any pool metadata for onboarding, means onboarding is currently manual or closed
the key podReadAccess can be removed completely from the onboarding type.
To have AO delegates (The hot wallets that can originate assets and borrow) be set during pool creation, you'd need to add the delegates to the AO proxy in the batch that sets the admin proxy as a delegate of the AO proxy:
api.tx.proxy.proxy(
aoProxy,
undefined,
api.tx.utility.batchAll([
api.tx.proxy.addProxy(adminProxy, 'Any', 0),
// NEW
// For each AO delegate
api.tx.proxy.addProxy(aoDelegate, 'Borrow', 0),
api.tx.proxy.addProxy(aoDelegate, 'Invest', 0),
api.tx.proxy.addProxy(aoDelegate, 'Transfer', 0),
api.tx.proxy.addProxy(aoDelegate, 'PodOperation', 0),
// END
api.tx.proxy.removeProxy(address, 'Any', 0),
])
)
In the follow-up transaction after pool creation, the permissions of the AO would need to be set (Borrower, LoanAdmin).
@kattylucy spoke with @mustermeiszer re Pool managers
We will keep the UI as it is today. You can either pick Single wallet address, where we can auto populate the wallet address of the user creating the pool. But with the ability to edit the address. No CTA to add another.
To add multiple pools, they have to select Multi-sig. But they can still select 1 out of X many wallet addresses in their config threshold.
APY timelines are dictated by the Junior tranche. So when it is changed from 90-day to say 7-day, that needs to automatically change for the remaining tranches. Currently it stays at 90-day for Senior, even if Junior is changed to 7 day
Fixed interest rate should be % not USDC
Pool structure #1 is already green. It should be Yellow when you're on that page. When you move to the next page, it should be Grey if all the mandatory fields were not filled and Green if they were. So even if the mandatory fields are not filled, the user should be able to move across the 3 pages but not able to create pool unless they are. Seems to be fine for #2 and #3 steps.
Pool analysis, not service
These warnings for min characters only shows up when trying to move to the next page. Can we add these in the titles. For example Landing page description (50-100 characters).
If a Service provider type has been selected, they need to add the name. So we need a warning underneath the text box if it has been left blank like This field is required. Same if Other is selected. We will need the warning for Description and Name of provider
But the user should also be able to leave the Type for Service provider blank. Right now if they select one field, they can't go back to blank option.
Same with the Ratings. If they add a ratings agency, they have to add the rating value and upload either URL or PDF. We also need to add the option to delete if a 2nd rating is added.
For multi-sig, we should show 2 wallet address text bars, with Add another CTA (similar to Figma).
The config settings for multi-sig seems off. It should count the number of wallet addresses (seems to be counting 3, when there are only 2 text boxes) and let the user pick how many they want for threshold. Not have "1" in the title when 2 has been selected from the dropdown.
Pool delegates title and description is missing above this. Add another CTA also seems off, should be more to the right aligned with the text bar (as in Figma).
Can we do Please select for the Category and Fee type, instead of pre-selecting Trading and Direct charge
so Service provider type is not mandatory? @sonam-jo
"But the user should also be able to leave the Type for Service provider blank. Right now if they select one field, they can't go back to blank option"
That's right. They don't have to pick a service provider at all and leave it all blank. Or if they pick one provider, then adding the name is mandatory. Once I selected fund admin, I wasn't able to go back to blank.
I just fixed the bug with non-being able to create a pool. Under the hood we are converting address to substrate @0x4Graham
const transformedValue = isEvmAddress(value)
? evmToSubstrateAddress(value, chainId ?? 0)
: value
But do you see the error message saying invalid address? @kattylucy
Jay's feedback:
- Wwhen you hit next you stay on the bottom of the page rather than pop back up.
- Currency if USDC should show USDC not Native USDC since Native is an internal tool that issuer shouldnt need to work about
- Pool details:
Landing page description- no star to indicate required but shows red text if empty
- Pool manager Requires you to enter one, If I am creating the pool, aren't I a pool mgmr by default? Should i add my own wallet? I think it should be about adding additional pool managers. If I am launching a pool for the issuer I would add them but if I am the issuer I would just leave it blank if I dont have others to add at this time
Additional one to add:
Pool delegate: Shouldn't be required to proceed with launching the pool, we can se the pool delegate later
cc @kattylucy
-
When you click on Next, the page doesn't go up to the top of the next page so need to scroll up each time.
-
Can we make the default option for the APY to be
Targetinstead of90 day
Category of Fees still needs to be Please select, not Trading
Secondary asset should have * next to it as it is a mandatory field
When I left these values blank, I was able to move to the next section without any warnings. The page also turned Green. The error message should come up as soon as I move to the next field. Page should not become Green on top if there are fields missing.
I was signed in as Charlie but some other wallet address was auto-populated instead. It should be address of the connected wallet. Also when I manually change the wallet address, click on Multi-sig and go back to Single, the wallet address changes back to the 0x one instead of the one I pasted.
Can we change the font of "Require investors to upload..." to be the same as the rest of the box? Its bigger right now.
When the pool is created, it still shows "30-day APY" when I had selected "Target" during the pool creation flow. Also R should be capital for Revolving pool structure.
Some final feedback from Jay..
Rename pool type on Step 1 to Pool Structure:
In Step 2, under Reporting, the pdf upload should be called Rating report PDF