Circle recently implemented USDC on the Stellar blockchain. To adhere to the requirements involved in the standard USDC specification, our engineering team added two new assets to the Stellar blockchain: USDC and USDCAllow.
We’ll get to explaining USDCAllow, but first, let’s focus on how new USDC are created on the blockchain: a process known as “minting”.
USDC was introduced by the Centre Consortium, an organization co-founded by Circle and Coinbase to establish an open standard for fiat on the internet and provide a governance framework and network for the global, mainstream adoption of asset-backed stablecoins. Centre was formed with the vision to build a set of protocols for fiat-denominated digital currencies that could work across wallets, currencies and platforms.
Circle is not in charge of USDC, the members of the Centre Consortium are in charge of USDC. Each member of the Centre Consortium is potentially capable of minting USDC.
When planning the addition of USDC to Stellar, we had several questions around risk mitigation and security:
How does Centre limit minting to only certain trusted members?
How does Centre add a new minter?
How does Centre get rid of a rogue minter?
How does Centre limit the amount of USDC that each minter can create?
How does Centre ensure the asset is fully backed by USD?
While Stellar does have native support for assets, only the individual account that creates an asset can create more of the asset. This didn’t work for us, as a key requirement for USDC is that multiple trusted entities are allowed to create new USDC.
We looked at the recommended distribution pattern, which involves creating a surplus of the asset which is later distributed as needed. Unfortunately, this also didn’t work for us because USDC is a full reserve stablecoin. For every 1 USDC that is created on the blockchain, we must hold $1 in US fiat reserves.
Distributed Exchange to the Rescue
As we researched Stellar, we experimented with the distributed exchange, a built-in trading platform on the Stellar protocol. We discovered that we could sell USDC from the USDC issuer account and the sale would actually increase the total supply of USDC. However, we didn’t want everyone to be able to buy USDC, because buying USDC from the issuer account increases the supply.
We realized we needed an asset that only certain accounts could hold, and that we needed to ensure only this specific asset could be traded for USDC. This asset was named USDCAllow.
The basic idea of USDCAllow is that only USDC minters are allowed to hold USDCAllow. It is restricted by default. On the flip side, USDC is unrestricted; we want anyone to be able to hold and transact in USDC. The minters can use their USDCAllow to buy USDC through the Stellar Distributed Exchange. This purchase of USDC will increase the supply, effectively minting new USDC into existence. This is the only way to mint USDC: buying it from the issuer on the distributed exchange.
When we initialized the USDC asset on the network, we opened the USDC <-> USDCAllow trade on the distributed exchange. The trade is a buy offer from the USDC issuer account, buying USDCAllow and selling USDC in return. We set the offer amount to the maximum allowable amount, about 922 billion USDC (once 922 billion USDC have been minted on Stellar, this trade will need to be re-created). We set a price of 1, meaning that USDCAllow can be traded for USDC at a rate of 1 USDC <-> 1 USDCAllow.
To decrease the asset supply (what’s known as “burning”), we simply need to send USDC back to the issuer account.
The basic mint flow is diagrammed below:
USDCAllow gives us a way to satisfy Centre’s requirements for adding USDC to a new chain:
Centre can restrict access to USDCAllow to only the specific minters. Only these accounts can then buy USDC and increase the supply.
Centre can also revoke access to USDCAllow, which removes an account’s ability to mint USDC, without interrupting the USDC asset at all.
Centre can distribute USDCAllow to increase the amount of USDC a minter is allowed to create. USDC are always traded at a price of 1:1 USDCAllow:USDC, so a minter can only mint as much USDC as they hold in USDCAllow.
Centre can ensure the total supply of USDC is accurately reflecting the total fiat reserves by requiring all minters to only trade USDCAllow for USDC when they have custody of the fiat reserves backing the USDC.
Each blockchain is unique and offers differing capabilities as well as challenges. By creating both USDC and USDCAllow and leveraging the Stellar Distributed Exchange, we can make USDC available on the Stellar blockchain while enabling the highest levels of security, transparency and interoperability for our customers.
If you’re interested in learning more, and helping us add USDC to more blockchains, we are hiring!
If you’re interested in building something awesome using USDC and the Stellar blockchain, sign up on our Developer Sandbox!