Upgrade the vault
depositERC20, relay, on-ramp) go to the
generation-2 vault. Read vaultAddress from GET /api/me/vault before
each deposit.
Move USDC from the generation-1 vault
Moves free USDC into the generation-2 vault without leaving the platform: no deposit-limit usage, no bonus or referral trigger, no deposit or withdrawal notification, no 2FA code. One move can be open per wallet.1
Create the move
amount to move all free USDC (usdcMove.freeUsdc in
GET /api/me/vault; null for a key without portfolio:read). 201 is a new move; 200 returns your open
move, which may be for another amount or already signed. The answer
carries transfer.signRequest, a WithdrawERC20 typed-data request
on the generation-1 vault:to is the platform relayer, amount is in 6-decimal units.
signRequest is null once the move is signed.JIT exposure warning (
warnings): If moving funds leaves collateral-exempt (JIT) market-maker quotes unfunded on the generation-1 vault, both POST …/transfer and POST …/signature include warnings: [{ code: 'jit_quotes_unfunded_after_move', vaultAddress, unfundedNotional }]. The move is not blocked, but warned so market makers can adjust resting quotes.2
Check and sign it
Check that
verifyingContract is your generation-1 vault, token is
usdc from GET /api/platform/contracts, and amount matches the
move. Sign with your wallet and send the signature:202. Sending the same signature again returns the same answer.3
Follow it
Poll
GET /api/me/vault/upgrade/transfer/{id}, or watch
vault_move_updated on user_activity, until deposit_confirmed,
refunded, failed or needs_ops.200), never a second one. If its signRequest is null, do
not sign again; poll it.
Statuses
Limits and timing
- Sign before
signRequest.message.deadline(1 hour after creation by default), else409 vault_move_expired; create a new move. - Each leg waits for a finalized block, so a move takes about two finality windows plus a few seconds. The deposit leg is retried up to 3 times before the refund.
- Only
availableUSDC moves. USDC locked by open orders or pending operations stays (409 insufficient_free_balance). Cancel the generation-1 orders you no longer want first. - While the move is open, the amount is locked on the generation-1 vault.
- Keep enough USDC on the generation-1 vault for the legacy quotes you keep.