Account

Update margin mode

Changed on

Switch between cross and isolated margin mode for a market. Gas sponsored by API service.

Permit: Client signs an EIP-712 VerifyWitness permit; the server recovers the signer off-chain and matches it to permit_params.signer (server holds no keys).

Prerequisites:

  1. GET /v1/auth/eip712-domain — EIP-712 domain (name, version, chainId, verifyingContract = Authorization contract)
  2. GET /v1/nonce-state/{account} — nonce_anchor and current_bitmap_index (pass it as permit_params.nonce_bitmap_index; if 208 the anchor is full — use nonce_anchor+1 with bitmap index 0)
  3. GET /v1/system/config — router address (RISExUniversalRouter), used as the target field below

Action hash: (marginMode: 0 = Cross, 1 = Isolated)

actionHash = keccak256(abi.encode(
  keccak256("RISE_PERPS_UPDATE_MARGIN_MODE_V1"),  // bytes32 action selector
  uint16(marketId),
  uint8(marginMode)))

Permit digest (EIP-712):

VerifyWitness(address account,address target,bytes32 hash,uint48 nonceAnchor,uint8 nonceBitmap,uint32 deadline)

Sign as standard EIP-712 typed data (e.g. ethers signTypedData) with hash = actionHash, target = RISExUniversalRouter address (NOT the account, NOT the domain verifyingContract), nonceBitmap = permit_params.nonce_bitmap_index.

Signature: 64-byte EIP-2098 compact (r + yParityAndS) or 65-byte (r+s+v, auto-converted).

post/v1/account/margin-mode

Request

Request body

market_idstring uint64
margin_modeinteger

Example request

{
  "permit_params": {
    "account": "0x742d35Cc6634C0532925a3b844Bc454e4438f44e",
    "signer": "0x1234567890123456789012345678901234567890",
    "nonce_anchor": "0"
  }
}

Response

A successful response.

transaction_hashstring
block_numberstring uint64

Changes