Supported migration paths
Upgrade an SCA wallet
If your wallet is on
circle_4337_v1, complete the
prerequisites before upgrading.- Developer-controlled:
POST /developer/transactions/walletUpgrade - User-controlled:
POST /user/transactions/walletUpgrade, then follow the standard challenge approval flow. Identify the wallet with eitherwalletIdorwalletAddressplusblockchain.
COMPLETE, the wallet’s SCA version updates in the responses from
GET /wallets/{id} and GET /wallets. Your wallet remains usable during the
upgrade transaction.
Prerequisites for circle_4337_v1
circle_4337_v1 wallets require these prerequisites before the upgrade endpoint
succeeds.
1
Lazy-deploy the wallet
circle_4337_v1 wallets must be deployed onchain before an upgrade can
run. To trigger deployment, initiate any outbound transaction (transfer
or contract execution) from the wallet. See
account types for background on SCA lazy
deployment.2
Fund the owner address on testnet
On testnet, fund the wallet’s owner address with native token before the
upgrade transaction runs. On mainnet, Response:The first entry in
circle_4337_v1 wallets already
received an airdrop that covers the upgrade fee, so you can skip this
step.Fetch the owner address using
POST /contracts/query:Response body
outputValues is the owner address. Send it enough
native token to cover roughly 300,000 gas. Approximate costs:- ETH-SEPOLIA: 300,000 gas × 30 Gwei ≈
0.009 ETH - MATIC-AMOY: 300,000 gas × 150 Gwei ≈
0.045 POL
Contract versions
Use the factory and implementation addresses to verify onchain deployments. Addresses are the same on mainnet and testnet.Because MSCA wallets are proxy contracts, block explorers display the wallet
address’s contract name as
ERC1967Proxy rather than UpgradeableMSCA.How upgrades work
SCA and MSCA wallets use the ERC-1967 proxy pattern. The proxy contract at your wallet address delegates calls to a separate implementation contract that holds the actual logic. An upgrade points the proxy at a new implementation address, which is why the wallet address stays the same. The upgrade endpoint executes one of these functions on the proxy:upgradeTo(address)upgradeToAndCall(address,bytes)