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.
- China Internet is 60% BABA, 40% FUTU, guard 3%.
- 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.
- 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.
- 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
- The stocks themselves are Robinhood's tokens. Dividends and splits on those arrive as a change in the token's multiplier, not in its balance, and pass straight through to whoever redeems.
- Pool prices are what they are. The guard stops a mint filling badly; it does not make a thin market deep.
- The contracts are new and unaudited. The tests run against a fork of mainnet through the real pools, and the first mint was done for real, but that is the extent of it.
Contracts
| Chain | Robinhood Chain, id 4663 |
| CETF token | 0x0e9fcdae7f14d5f2d115fdfbe7132fe42aac27e9 |
| Factory | 0x563b59b9a2eba6ec4dab659df93846d769b25998 |
| First ETF, CNNET | 0x8084b01A8aDA8ADda4696A5e14f6e315eA6ADD29 |
| BABA | 0xad25Ac6C84D497db898fa1E8387bf6Af3532a1c4 · ETH pool 0.25% |
| FUTU | 0xeB30663bDFf0622Ef4e4E5cBb4E975F19f33f51D · ETH pool 5% |
| Uniswap v4 | 0x8366a39CC670B4001A1121B8F6A443A643e40951 |
| Share anchor | 1,000 shares per ETH on the opening mint, minimum 0.001 ETH |
| Guard range | 1% to 10% per leg, chosen by the creator |
Chinese ETF