Stablecoins greatest problem.

zkchakra, 10th June 2024

Stablecoin market

Stablecoin market is unique in the entire crypto landscape. Tens of different entities are emitting essentially the same asset, digital dollar, all varying by names, peg maintenance mechanisms, programmability, permissioning, and other features like yield or confidentiality.

Depending on users' and protocols' preferences, they use different versions of the on-chain USD, considering their needs, risk tolerance and regulations.

Dollar finally becomes decentralised, and there's a competition between emittents. This is obviously great for crypto, right? Well, seems like this might not be the case.

The UX problem

A lot of people say that stablecoins are the best real-world use case in all of crypto, and actually the one feature that will help us onboard the next billion users. I tend to think that we're actually doing quite the opposite - stablecoins are making the onboarding experience harder.

I like to compare current state of stablecoins to the following, real-world scenario. Imagine that there's no monopoly in emitting USD today. Every licensed, commercial bank in the USA is allowed to issue their own version of the dollar. The only requirement is that they have to maintain peg.

Banks introduce different terms of use and rules of redeeming. They change the look of the bills, offer different yield strategies. Finally, they go to merchants, brokers and providers of financial services, offering their versions of the dollar.

As a result, every shop, restaurant, service provider, bank, etc, all use different versions of the dollar. Theoretically, it's exactly the same asset, right? In practice, you can't buy groceries if you don't have the right bill.

This is pretty dystopian scenario, right? But for some reason, we accept it in crypto and act like this is future of finance.

Simple flows, like depositing into DeFi, or finalizing a purchase, now become a real pain, involving swaps, slippages, failed transactions, and are subject to additional fees. Do you still think that this will help us onboard people to the new financial system?

Fragmentation and interoperability

The biggest problem of the stablecoin market is fragmentation and lack of interoperability. This is a problem that isn't really known in any of the real world currencies, thanks to the legacy, fully centralised solutions, and monopoly in emitting currencies. A dollar in Goldman Sachs is the same as a dollar in J.P Morgan, but this is not the case for blockchains.

Our dollars are not interoperable. Liquidity has to be deposited into the pool in a particular stablecoin, and won't accept other 'USDs'. Positions are denominated in a particular stablecoin. Payments have to be finalized using a particular stablecoin, and won't settle otherwise.

The receiver perspective is fully understandable, as all stablecoins serve different purpose. As a merchant or DeFi protocol I would too only accept those stablecoins that match my needs and risk profile. Some companies want to instantly off-ramp to the banking system, so they choose USDC. Some protocols have to minimize risk on a daily basis, so they won't accept high-risk, algorithmic stablecoins.

Protocols, however, cannot dictate rules for users. For the stablecoin market to be truly decentralised, and simultaneously provide quality UX, we need to build with the interoperability in mind.

The centralisation risk

The fragmentation will work in a favor of further centralisation of the stablecoin market. Because of the major market share held by providers of centralised stablecoins, they are able to serve wider purposes, therefore they are supported by wider range of blockchain products. This, however, puts operators of smaller, decentralised solutions at risk of being pushed off the market, and leads to users being forced to use a particular stablecoin product.

The solution

At the moment, it's not possible to make already existing stablecoins interoperable. In most cases, this would be insanely complex, mostly off-chain and permissioned process, often involving re-minting. Existing stablecoins are rooted too deep in our ecosystem to easily implement interoperability features for each stablecoin separately.

The solution that is possible today is development of interoperability layer supporting all existing stablecoins out of the box, and offering issuance new ones. By building pools of deep liquidity for stablecoins, providing infrastructure for composable interactions, and user-friendly front-ends, we can bring interoperability and quality UX to the table, with zero requirements for already existing solutions.

This way, we can preserve decentralised stablecoins with no drawbacks on UX or composability.

Proposal for oneUSD - Thought experiment

As a solution to the interoperability issue, I am proposing oneUSD, the first out-of-the-box composable stablecoin, deployed on the Solana network. The idea behind oneUSD is not to create a new stablecoin, but rather to create an interoperability layer for all other USD stablecoins.

oneUSD is essentially a token that, in a transaction, should be able to act as any other existing stablecoin. By holding X oneUSD-s, a user should be able to execute any amount of transactions involving any other existing stablecoin (USDC, USDT, UXD, USDH, DAI, etc), as long as their total value is less or equal X oneUSD.

This should be achieved by creation of deep stablecoin liquidity, offering zero-slippage and low-fee swaps. The liquidity pool should hold liquid USD in the form of other stablecoins. The total supply and value of the oneUSD should equal the supply and value of all underlying stablecoins.

Users can mint oneUSD by depositing any stablecoin into the pool, and can redeem oneUSD anytime, to any of the underlying stablecoins. Deposits and redeems should be effectively free, and preferably gasless.

oneUSD should be a SPL-Token deployed in the Token Extensions standard on the Solana network. The token should implement two extensions - transfer hook, and permanent delegate. The token extensions are a necessary component, allowing instant swaps at the moment of transaction execution.

The oneUSD should only be transferable to the protocol-owned oneUSD pool, only using the redeem() function.

oneUSD redeem flow starts with implementation of callback instruction. Callback instruction is essentially an instruction received from any dApp front-end, serialized into byte format, and passed as an argument to the oneUSD transfer function.

Before passing callback instruction to the function, the instruction must be simulated, and any balance changes must be also passed to the transfer function. Depending on the balance changes, the transfer hook extension will perform necessary swaps using the deep liquidity pool.

After performing the swaps, transfer hook will perform a cross program invocation, executing the callback instruction, finalizing the flow. This way, oneUSD will be redeemed into any requested stablecoin at the moment of transaction execution, and not as an additional step.

Let's take an example. Let Bob hold 1000 oneUSD-s. Bob uses Coinbase, which only accepts USDC deposits. Simultaneously, Bob uses MarginFi, which only accepts UXD deposits. Finally, he wants to pay his friend Alice for pizza, but she's new to crypto, and only knows how to use USDT.

With oneUSD, Bob will be able to perform these 3 transactions, without performing any additional swaps by hand. As Bob executes them, oneUSD will automatically detect requested token balance changes, perform swaps, and execute transactions, simplifying entire transaction flow to minimum.