Docs

How it works

A Chinese ETF is an ERC-20 whose supply is a claim on a vault of Robinhood stock tokens, held at weights fixed when it was created. This page is the whole mechanism, in the order things happen.

Creating one

Anyone calls create on the factory with a name, a ticker, a list of stocks, their weights in basis points (which must total 10,000), a price guard and a creator fee. The factory deploys a fresh vault. Nothing about it can be changed afterwards: not the weights, not the fee, not the guard. There is no owner and no upgrade path.

The stocks must be on the factory's registry. The registry is kept by a curator and lists tokens by address, each with the Uniswap v4 pool it is bought in. Today it holds the only two China-listed companies Robinhood has issued on this chain, Alibaba and Futu. The BIDU, JD, PDD and NIO contracts you can find on the explorer are not Robinhood's, so they cannot be listed.

Minting with ETH

Send ETH to mint. Inside one transaction the vault splits it by weight and buys every stock from its pool, then issues shares. Before and after each swap it reads the pool's price; if any leg moved further than the ETF's guard, the whole mint reverts. A pool that runs dry mid-swap keeps only what it filled, and the ETH it could not take comes back to you.

A worked example, in the numbers the first ETF actually opened with.

  1. China Internet is 60% BABA, 40% FUTU, guard 3%.
  2. The opening mint sent 0.002 ETH. The vault spent 0.0012 ETH in the ETH/BABA 0.25% pool and 0.0008 ETH in the ETH/FUTU 5% pool.
  3. It received 0.0273 BABA and 0.0162 FUTU, and issued 1,000 shares per ETH: 2 shares. 0.3% of them (0.006) went to the creator, 1,000 wei were burned so the vault can never be emptied to zero, and 1.994 went to the minter.
  4. From now on a share is 1/supply of whatever the vault holds. The next mint gets shares in proportion to how much it grows the thinnest leg, so a sloppy fill can never dilute anyone already in.

USDG works too. mintWithUSDG swaps it for ETH in the deep ETH/USDG pool first, inside the same lock, and then does exactly the above.

Why the mints are small

The ETH/BABA pool holds under one ETH at its current price and the ETH/FUTU pool about a quarter of one. A mint of a few hundredths of an ETH already moves those prices by a few percent, which is where the guard stops it. The app shows the largest mint each ETF accepts right now, worked out from the pools the same way the contract does. That number is small because the market is small, not because the vault is.

Creating in kind

If you already hold the stocks, mintInKind takes them in the vault's current ratio and issues shares without touching a pool. Ask for N shares and it pulls reserve × N / supply of each stock, rounded up. No guard applies and there is no limit. The one rule is that the vault must already be open: the first position is bought through the pools so that the ratio is priced by the market rather than by whoever shows up first.

Redeeming

redeem burns shares and sends you your slice of every stock in the vault. Nothing is sold, so it needs no liquidity and no counterparty and cannot be paused. It works in the middle of a crash exactly as it does on a quiet day.

The fee

The creator's fee is taken out of the shares being issued on each mint, never out of the vault, so holders are untouched by it. The factory caps it at 1%. There is no fee on redemption and no protocol fee at all.

What is not protected

Contracts

ChainRobinhood Chain, id 4663
CETF token0x0e9fcdae7f14d5f2d115fdfbe7132fe42aac27e9
Factory0x563b59b9a2eba6ec4dab659df93846d769b25998
First ETF, CNNET0x8084b01A8aDA8ADda4696A5e14f6e315eA6ADD29
BABA0xad25Ac6C84D497db898fa1E8387bf6Af3532a1c4 · ETH pool 0.25%
FUTU0xeB30663bDFf0622Ef4e4E5cBb4E975F19f33f51D · ETH pool 5%
Uniswap v40x8366a39CC670B4001A1121B8F6A443A643e40951
Share anchor1,000 shares per ETH on the opening mint, minimum 0.001 ETH
Guard range1% to 10% per leg, chosen by the creator