Replies: 9 comments 2 replies
|
Really interesting initiative — this addresses a real gap. A few things that came to mind from the institutional side. Legal Title. When assets pool inside a vault, the question of where legal title sits becomes non-trivial. Different jurisdictions treat this differently, and the answer affects everything from insolvency treatment to regulatory reporting. Something to think about as the standard matures. Beneficial Ownership. FATF Recommendations 16 and 24 create obligations around identifying beneficial owners of financial arrangements. How that interacts with vault share tokens — particularly if they circulate on secondary markets — is an open question that will come up in institutional due diligence. The Register. Regulated funds maintain a register of holders via a transfer agent. The relationship between on-chain vault state and that register is undefined. There's a design space here that's worth exploring. NAV. For regulated funds, NAV carries legal weight — it's not just a price feed. The governance of who controls the oracle and under what methodology will matter. Pending Redemptions. With async vaults, the status of a share token during a pending redemption request creates some ambiguity around claims and transferability. Ownership Through Composability. The hook architecture is powerful. The question is whether ownership integrity can be maintained as vault shares move through downstream protocols — lending, collateral, derivatives. None of these are blockers — the extension model gives room to address them. But they're areas where the institutional world will have strong views, and probably worth a deeper conversation. Happy to explore any of these further with anyone interested. |
|
The proposal looks solid overall. Here there are a few feedback from a vault integrator point of view:
|
|
@stevewhyman-fulminata thanks for the comments! These are very helpful as we're architecting the Asynchronous vaults, which will be primarily used for RWAs.
This is an interesting point worth discussing. Would it suffice to store this information offchain? I imagine most, if not all, regulated issuers will need to maintain KYC/KYB records and associate them to a wallet address. With that information, they could index deposit events and shares held by the wallet to build an offchain registry. This could be reconstructed and verified by anyone.
When a User requests to redeem their shares for tokens, the shares are escrowed by the Vault. So they are unable to transfer the shares after making such a request unless they cancelled the requested claim. Let me know if that doesn't make it more clear.
I suspect it will break ownership integrity. Hooks will be used for synchronous vaults only and thus are unlikely to be used for regulated RWAs (note this is an assumption and we welcome feedback to disprove this). |
|
@alessandromaci appreciate the feedback!
After discussion with the working group, we've decided referrals won't be a priority. Primarily for the reason that it's very contextual to the product and could be built on top of the Vaults. There are many offchain providers that have referral implementations that meet needs for many of the initial use cases. Implementing some of these referral methods onchain would be very difficult and increase the complexity of an already complex program. Some of the RWA design partners have indicated that referrals are preferred offchain as they may be private deals not available to all depositors.
This likely doesn't need to be a separate extension, but please correct me if I'm mistaken. Rather, the client constructing the transaction can include swap & deposit instructions in the same transaction. Or in the case the deposit needs to know the exact amount received, build a custom program that wraps both to get an accurate delta from the swap. Ultimately, swapping should sit outside of the Vault since it's not a core feature. |
|
Great initiative, over the past couple at of months @solanabr Superteam Brazil we converged on the same reasoning and built out a full implementation suite we're calling the Solana Vault Standard (SVS). What we have today:
The repo is at https://github.com/solanabr/solana-vault-standard. Happy to align on interface standardization as our implementations could serve as reference or starting points for whatever standard comes out of this discussion. |
|
Our implementation at @SuperteamBR isn’t really focused on defining a single, generalized standard. But after reviewing both approaches, a few points stood out that are worth bringing into this discussion. Design tradeoffs to consider:
I believe It’s also worth asking whether async/NAV-based vaults (ERC-7540 style) should live in the same standard or be split into a separate SRFC. The request/fulfill/claim lifecycle, operator delegation, and oracle pricing are fundamentally different from atomic deposit/redeem flows. Happy to share more details from our implementation if useful. |
|
Have there been any considerations to alternatives on Even though CPIs can be expensive for read purposes, I would still recommend adding instructions that mimic the The implementation not directly dealing with mint and token account creation is actually a great step in decreasing program maintenance. But this should come with libraries and UIs that aid in vault creation. |
|
The scope of the proposal has been shifted to an async vault. Therefore, we have edited the original document to take into account that. |
|
🚀 The reference implementation for the vaults program is now open source - go check it out: github.com/exo-tech-xyz/vault and use it to build cool stuff. |
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Summary
We aim to create a standard factory program that handles many of the same use cases as ERC 4626 and 7540. This is an important primitive that would make it easier and safer for others to develop on top of. By handling the subscription/redemption process within a standard implementation, we can promote more lindiness of critical Solana infrastructure, while still allowing innovation on top.
Background
RWA issuers build custom smart contracts and infrastructure to support their tokenization efforts on Solana. Every product is slightly different, but the high level requirements are all very similar. Tokens need KYC checks, products should have role based access control, and investors should be able to subscribe and redeem from the RWA. This led us to discussing what it would take to build core primitives for these components to make it easier and more secure to deploy on Solana.
Vaults are just one piece of the puzzle. [sRFC 37](https://forum.solana.com/t/srfc-37-efficient-block-allow-list-token-standard/4036), the Token Access Control List (ACL), standardizes a pattern for handling KYC of a Token without compromising composability (i.e. an improvement to Transfer Hooks). These initiatives together enable KYC’d tokens with subscription/redemption capabilities without the need to deploy custom smart contracts.
Institutions and enterprises that want to manage tokenized funds and other assets require functionality akin to vaults. Vaults handle deposits and redemptions into managed strategies, such as depositing stablecoins to receive shares in a fund. As it stands today, Solana has no standardization for vaults and every team has been left to develop their own implementation. This leads to more integration work for clients, more engineering work for those developing the product, and ultimately leads to less secure Solana programs as the surface area for vulnerabilities increases. This is why we are presenting this standardized vault program proposal.
After several working group sessions and incorporating feedback from the community, we've reached a clear consensus that asynchronous vaults provide significantly more value for immediate use cases (especially RWA, funds, and strategies involving off-chain or delayed settlement) compared to purely atomic ones. As a result, we've decided to prioritize building the Async Vault program first. The intention is for this to serve as a high-quality reference implementation rather than a canonical one-size-fits-all program. This approach allows us to ship faster and gather real usage feedback sooner than later.
Key Changes from the Original Proposal
Core Async Vault Architecture Highlights
AsyncVaultaccount with new fields likepending_vault(shared escrow for unclaimed deposits/redemptions),nav,async_inflows/async_outflowsflags,total_asset_balance(virtual balance accounting for authority withdrawals), and TLV-based extensions.Requestaccounts trackingRequestType(Deposit/Redeem),RequestState(Pending/Claimable/Rejected),amount,price(NAV snapshot when Vault Authority approves),owner, etc.CreateAsyncVault/InitializeExtension/InitializeAsyncVault(finalizes config and locks further extensions).RequestDeposit/RequestRedeem(assets move to apending_vault) and wait for Vault Authority to approveApproveRequest/RejectRequest(authority-only; rejects return assets/shares to user).Claim(called by user to finalize; mints shares for deposits or transfers assets for redemptions; supports partial claims).CancelRequest,WithdrawAssets(authority can pull assets for off-chain use),UpdateNav, authority transfer flow, etc.This design supports many of the requirements for RWA issuers and other vault strategies.
Legacy Proposal (This was the original proposal which has been deprecated)
A new program that takes inspiration from [ERC4626](https://eips.ethereum.org/EIPS/eip-4626) and other vault standards as well as the lessons from Token2022, with the intent to be highly customizable by supporting the most common use cases available as extensions.
The creation of a Vault does not create a new Mint for the share token, but rather accepts a pre-configured mint as the share token. This decouples the Vault program from future Mint configuration combinations significantly reducing complexity during Vault creation as well as reducing the likelihood of required program upgrades with new Token Extensions in the future.
As a corollary, the program will not initialize token accounts nor enforce ATAs. The user/admin must initialize in an instruction prior to interacting with the vault program. This promotes maximum flexibility for those that want to use non ATAs.
The base functionality is the Atomic Vault. The logic and features are then configurable using extensions such as the following non-exhaustive list:
Vault authority can configure percentage or fixed fees to be collected when a deposit is made.
Vault authority can configure percentage or fixed fees to be collected when a withdraw is made.
It extends the deposit functionality allowing to interface the Vault Program with a custom hook program that provides custom logic with downstream protocols. For example, a vault that would like to deposit tokens atomically into a borrow/lend protocol. See the hook interface below for more.
It extends the withdraw functionality allowing to interface the Vault Program with a custom hook program that provides custom logic with downstream protocols. For example, a vault that would like to withdraw previously deposited tokens atomically from a borrow/lend protocol. See the hook interface below for more.
Limits the total amount a user can have deposited into a vault. Important for vaults that must adhere to strict regulatory requirements.
Composability
One of our goals with this program is to make it very easy to compose smart contracts so that it allows for greater granularity for the interested parties. A caveat regarding stack limit, this proposal is built for the network when the CPI call stack limit is greater than 4. We acknowledge that the nested hook pattern would very quickly reach the current CPI depth limit.
Specification
Note that this specification is only for the purpose of this discussion and is not final. It does not take into account optimizations that would be present in a production version of the program.
Accounts
Instructions (Base case for atomic vault)
Create Vault:
Initialize [EXTENSION]:
Initialize Vault:
Deposit:
Mint:
Withdraw:
Redeem:
Price Mechanism
Note: this price mechanism is for Atomic vaults only. The initial price is set during vault creation and cannot be updated.
If the share supply is 0 then this is how price is calculated:
Otherwise:
Deposit & Withdraw Custom Logic
A very common use case is adding custom logic after a deposit or withdraw instruction has been executed and the user's tokens have been transferred. This is necessary for integration with downstream protocols. In order to handle this use case we have decided to follow the ExtraAccountMeta and a “Hook” program pattern.
Hook Program Interface
Only the Vault Standard Program is able to interface with the hook program. When interfacing with downstream protocols the hook program will relay the vault as the user of that vault. For instance: When depositing in Protocol X, the vault authority will be the “user” who is depositing into it.
NAV Calculation:
NAV calculation logic and thus Update Authority is up to the developer of the Hook program.
One way to implement it would be:
The hook program will read downstream protocol values, perform calculations, and return NAV in the
get_navinstruction.get_navis a readonly instruction that is permissionless. The Vault program will use the returned NAV to calculate the amount of assets based on the given amount of shares or vice versa.All reactions