- It creates a unified experience across chains and reduces the number of wallet addresses users need to manage.
- It provides a recovery path if users accidentally deposit tokens to an address on an unsupported chain. For user-controlled wallets, this happens automatically when you pass the user JWT token during wallet creation.
- Create wallets across multiple EVM chains using a shared
walletSetIdandrefId. - Derive wallets and add them on-demand for supported chains that users opt into.
- Recover assets from unsupported EVM chains by signing and broadcasting transactions.
- Understand how address indexes work to maintain consistency.
- Follow best practices to manage wallet set limits effectively.
Batch create wallets across supported chains
For chains you support by default, use thePOST /wallets
API to create wallets in batches.
Include the following in your request:
walletSetIdto group wallets that will share an address index.- An array of
blockchainsrepresenting the chains to support. - An array of
refIdsto associate each wallet back to a user ID in your system.
refId, all EVM wallets sharing that refId in
that API call will have the same address. You can retrieve these wallets using
the
GET /wallets
API.
Derive wallets on demand for supported chains
For EVM chains that users can opt into, or in cases where assets are deposited to a chain not enabled by default, use thePOST /wallets/{id}/blockchains/{blockchain}
API to derive a wallet.
Provide the following in this request:
- Provide the existing
walletIdandrefIdfor the user. - Specify the new EVM chain to create the wallet on.
Recover tokens on unsupported EVM chains
For unsupported EVM chains:- Create a wallet with
blockchain: EVM. - Use the Sign transaction API to move the assets out.
Note: For unsupported EVM chains, you are responsible for broadcasting the
signed transaction to the chain yourself.
Understand how wallet addresses are derived
Wallet addresses are derived based on the index in thewalletSet. A single
index (for example, 0x3) maps to the same address on all EVM chains.
Wallet creation behavior
- If you call POST /wallets for a single chain with no existing wallets, it
starts at index
0x1and increments. - If you call POST /wallets across multiple chains, it uses the latest available index and assigns the same address across chains.
- If you call POST /wallets again for an individual chain, it increments only on that chain.
- If you call POST /wallets for a new chain (no existing wallets), it starts
at
0x1. - Use
POST /wallets/{id}/blockchains/{blockchain}to derive wallets and fill address gaps across chains.
Address index example
The example below illustrates how address indexes work across chains.| EVM Chain | 0x1 | 0x2 | 0x3 | 0x4 | 0x5 |
|---|---|---|---|---|---|
| Ethereum | 1 | 2 | 3 | 7 | |
| Polygon | 3 | 4 | 7 | ||
| Arbitrum | 5 | 6 | 7 |
- Step 1–2: Creating wallets on Ethereum only results in
0x1, then0x2. - Step 3: Creating wallets on Ethereum + Polygon at once results in both
getting
0x3. - Step 4: Creating a new wallet only on Polygon now returns
0x4. - Step 5–6: Creating wallets on Arbitrum (new chain) starts at
0x1, then0x2. - Step 7: Creating wallets across Ethereum, Polygon, and Arbitrum takes the
latest index and creates them at
0x5.
POST /wallets/{id}/blockchains/{blockchain}.
Do not assign a unique
walletSetId per user.You’re limited to 1,000 wallet sets total, with up to 10 million wallets
per wallet set. For details, see
Wallet Sets.Summary
Using Circle’s wallet APIs, you can create and manage wallets that share the same address across multiple EVM chains. This unified approach improves the user experience and enables safe asset recovery, even on unsupported chains. By leveragingwalletSetId, refId, and the appropriate API endpoints, you can
batch-create wallets, add support for new chains on demand, and maintain
consistent wallet derivation logic across your application.