Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Create Pool New Designs #2529

Open
0x4Graham opened this issue Nov 6, 2024 · 14 comments
Open

Create Pool New Designs #2529

0x4Graham opened this issue Nov 6, 2024 · 14 comments
Assignees

Comments

@0x4Graham
Copy link

0x4Graham commented Nov 6, 2024

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)
Image

When all information has been completed and have moved to the next item, it should change to green

Image

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.
Image

@sonam-jo
Copy link

sonam-jo commented Nov 11, 2024

@kattylucy added some more details

Section 1: Pool Structure

  • Users should be able to see Revolving pool and Static pool options 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 model section 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.

Image

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 Single we only show one box for wallet address. When multi-sig is selected, we show two boxes and the CTA to Add another.
  • Configuration change threshold with 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.

Image

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

@sophialittlejohn
Copy link
Collaborator

sophialittlejohn commented Nov 26, 2024

@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

Image

  • pool metadata: poolStructure (revolving)

Image

  • 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

Image

  • 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

Image

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

Image

@onnovisser can you please clarify what's can and can't be done before pool creation regarding AOs?

Fees

Image

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

Image

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.updatePoolRoles InvestorAdmin permission needs to be granted to REACT_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.

@onnovisser
Copy link
Collaborator

onnovisser commented Nov 29, 2024

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).

@sonam-jo
Copy link

sonam-jo commented Dec 6, 2024

@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.

@sonam-jo
Copy link

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

Image

Fixed interest rate should be % not USDC

Image

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.

Image

Pool analysis, not service

Image

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).

Image

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

Image

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.

Image

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.

Image

For multi-sig, we should show 2 wallet address text bars, with Add another CTA (similar to Figma).

Image

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.

Image

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).

Image

Can we do Please select for the Category and Fee type, instead of pre-selecting Trading and Direct charge

Image

@kattylucy
Copy link
Collaborator

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"

@sonam-jo
Copy link

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.

@0x4Graham
Copy link
Author

Image Even though I've filled everything out, I can't create the pool. Image We're not allowing the Ethereum address as well for pool managers and asset originators. Need to make sure we inherit that from the previous functionality @kattylucy

@kattylucy
Copy link
Collaborator

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

@0x4Graham
Copy link
Author

But do you see the error message saying invalid address? @kattylucy

@0x4Graham
Copy link
Author

Jay's feedback:

  1. Wwhen you hit next you stay on the bottom of the page rather than pop back up.
  2. Currency if USDC should show USDC not Native USDC since Native is an internal tool that issuer shouldnt need to work aboutImage
  3. Pool details:
    Landing page description- no star to indicate required but shows red text if empty
    Image
  4. 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

@0x4Graham
Copy link
Author

0x4Graham commented Dec 12, 2024

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

@sonam-jo
Copy link

  • 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 Target instead of 90 day

Image

Category of Fees still needs to be Please select, not Trading

Image

@sonam-jo
Copy link

sonam-jo commented Jan 7, 2025

Secondary asset should have * next to it as it is a mandatory field
Image

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.
Image
Image

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.
Image

Can we change the font of "Require investors to upload..." to be the same as the rest of the box? Its bigger right now.
Image

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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

5 participants