Smart Contract Account (SCA) and Modular Smart Contract Account (MSCA) wallets use a contract proxy pattern, a common design pattern that allows Circle to upgrade the contract’s logic without changing the address of the contract. With a proxy pattern, the proxy contract delegates calls to an implementation contract. The proxy contract can be configured to use a new implementation contract, which is commonly referred to as an upgrade. Circle uses the ERC-1967 proxy pattern, which is well-established in the crypto industry. The proxy pattern gives Circle the ability to provide bug fixes and product improvements to SCAs and MSCAs over time. However, you are in full control of your wallets, even when Circle performs a contract upgrade. When Circle makes a new version of a contract available, you must manually initiate an upgrade using the API.Documentation Index
Fetch the complete documentation index at: https://developers.circle.com/llms.txt
Use this file to discover all available pages before exploring further.
Note: Because modular wallets are proxy contracts, users’ wallet addresses
in block explorers are shown as
ERC1967Proxy instead of UpgradeableMSCA.Modular wallets only have a single version of the wallet contract available.
When an upgrade is available this page provides instructions on the appropriate
API calls to make to upgrade your wallets.Smart Contract Account wallets
You can upgrade both developer-controlled and user-controlled SCA wallets to newer SCA versions using the Wallet Upgrade API.- To upgrade a developer-controlled wallet, use
POST /developer/transactions/walletUpgrade. - To upgrade a user-controlled wallet, use
POST /user/transactions/walletUpgradeand follow the standard challenge approval flow.
Supported migration paths
| Source SCA Version | Destination SCA Version | Contract Function Used for Upgrade |
|---|---|---|
| circle_4337_v1 | circle_6900_singleowner_v2 | upgradeToAndCall(address,bytes) |
| circle_6900_singleowner_v1 | circle_6900_singleowner_v2 | upgradeTo(address) |
💡 Tip: Use the
scaCore query parameter in the GET /wallets endpoint
to fetch SCA wallets eligible for an upgrade.COMPLETE
state, the SCA version of the wallet is updated in the responses of the
GET /wallets/{id} or GET /wallets endpoints.
Special handling for circle_4337_v1 wallets
Due to onchain specific requirements, circle_4337_v1 wallets must be lazy
deployed before they can be upgraded. To trigger deployment, initiate an
outbound transfer or contract execution from the SCA wallet you want to
upgrade. See the account types page for more details
on SCA lazy deployment.
If you need to upgrade a circle_4337_v1 wallet on a testnet, send native
token funds to the wallet’s owner address. You can retrieve the owner
address using the
POST /contracts/query
endpoint.
Response Body
outputValues array contains the owner address,
which must receive the native token funds. Circle recommends sending enough
tokens to cover ~300,000 gas. Estimated costs:
- ETH-SEPOLIA: 300,000 gas * 30 Gwei (replace with current gas price) =
0.009 ETH - MATIC-AMOY: 300,000 gas * 150 Gwei (replace with current gas price) =
0.045 POL
Note: You can skip the native token funding step for mainnet
circle_4337_v1 wallets, as they have already received airdropped native
tokens to cover upgrade transaction fees. These wallets can be upgraded
immediately after lazy deployment.How the upgrade works
The wallet upgrade contract execution updates the logic contract address of the ERC-1967 proxy (the SCA wallet) by calling either:upgradeTo(addresss)upgradeToAndCall(addresss,bytes)
Contract versions
Use the factory and implementation addresses below to verify onchain deployments. Factory and implementation addresses are the same on mainnet and testnet.| Type | Version | Description | Factory address | Implementation address |
|---|---|---|---|---|
| SCA | circle_6900_singleowner_v3 | Compliant with ERC-6900 v0.7 and ERC-4337 v0.6. Supports a single owner address and batch multiple userOps in one transaction. | 0xf61023061ed45fa9eAC4D2670649cE1FD37ce536 | 0xD206aC7fEf53d83ED4563E770b28Dba90D0D9eC8 |
| MSCA | circle_6900_v1 | Compliant with ERC-6900 v0.7 and ERC-4337 v0.7. Supports any ownership type (single owner, multiple owners, passkeys, multisig) and batch multiple userOps in one transaction. | 0x0000000DF7E6c9Dc387cAFc5eCBfa6c3a6179AdD | 0xA70F1296869DA9D7CB69578123F21888E6dB2B62 |