Skip to main content

Upgrade the vault

Idempotent. No wallet signature and no 2FA code. The upgrade moves no money and cancels no orders, and it cannot be undone.
From activation on, deposits (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

Omit 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.
After a crash, call the create again: with a move open it returns that move (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), else 409 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 available USDC 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.