Perp
PerpsManager contract interface for trading, position management, and account operations
Deposit
Description
Deposits collateral tokens into the specified account. The caller must have approved the PerpsManager contract to spend the tokens.
function deposit(address to, address token, uint256 amount) external;Example
// Approve tokens first
IERC20(usdc).approve(perpsManager, amount);
// Deposit USDC
perpsManager.deposit(account, usdc, amount);Withdraw
Description
Withdraws collateral tokens from the caller's account to the specified address. The withdrawable amount is limited by the account's free margin balance.
function withdraw(address to, address token, uint256 amount) external;Parameters
to: The address to withdraw tokens totoken: The address of the collateral token to withdrawamount: The amount of tokens to withdraw (in token's native decimals)
Example
// Get the withdrawable amount
uint256 withdrawableAmount = perpsManager.getWithdrawableAmount(account, usdc);
// Withdraw USDC to the recipient
perpsManager.withdraw(recipient, usdc, withdrawableAmount);Place Order
Description
Places a trading order (market or limit) in the specified market. The order data is encoded in a packed binary format for gas efficiency.
function placeOrder(bytes calldata placeOrderData) external returns (uint256 orderId);Parameters
placeOrderData: Encoded order data (47 bytes) containing:marketId(uint64, 8 bytes): The market IDsize(uint128, 16 bytes): The order size (in 18 decimals)price(uint128, 16 bytes): The limit price (0 for market orders) (in 18 decimals)flags(uint8, 1 byte): Packed flags:- bit 0: side (0 = Buy, 1 = Sell)
- bit 1: postOnly
- bit 2: reduceOnly
- bits 3-4: stpMode (0 = ExpireMaker, 1 = ExpireTaker, 2 = ExpireBoth, 3 = None)
orderType(uint8, 1 byte): OrderType enum (0 = Market, 1 = Limit)timeInForce(uint8, 1 byte): TimeInForce enum (0 = GoodTillCancelled, 1 = GoodTillTime, 2 = FillOrKill, 3 = ImmediateOrCancel)expiry(uint32, 4 bytes): Expiry timestamp (for GoodTillTime orders) (0 for other order types)
Example
// Encode place order data
uint64 marketId = 1; // BTC
uint128 size = 1e18; // 1 BTC
uint128 price = 100_000e18; // $100,000
uint8 side = 0; // Buy
uint8 postOnly = 0; // False
uint8 reduceOnly = 0; // False
uint8 stpMode = 0; // ExpireMaker
uint8 flags = (side << 0) | (postOnly << 1) | (reduceOnly << 2) | (stpMode << 3);
bytes memory placeOrderData = abi.encodePacked(marketId, size, price, flags, OrderType.Limit, TimeInForce.GoodTillCancelled, 0);
uint256 orderId = perpsManager.placeOrder(placeOrderData);Place Order With Permit
Description
Places an order with EIP-712 typed data signature, allowing gasless approvals for trading. The signer must be registered
in the RISExAuthorization contract.
function placeOrderWithPermit(
bytes calldata placeOrderData,
InputTypes.PermitParams calldata permit
) external returns (uint256 orderId);Parameters
placeOrderData: Encoded order data (same asplaceOrder)permit: Permit parameters:account: The account addresssigner: The signer addressdeadline: Signature expiry timestampsignature: EIP-712 signaturenonce: The unique nonce for the signature to prevent replay attacks
Example
// Encode place order data
uint64 marketId = 1; // BTC
uint128 size = 1e18; // 1 BTC
uint128 price = 100_000e18; // $100,000
uint8 side = 0; // Buy
uint8 postOnly = 0; // False
uint8 reduceOnly = 0; // False
uint8 stpMode = 0; // ExpireMaker
uint8 flags = (side << 0) | (postOnly << 1) | (reduceOnly << 2) | (stpMode << 3);
bytes memory placeOrderData = abi.encodePacked(marketId, size, price, flags, OrderType.Limit, TimeInForce.GoodTillCancelled, 0);
// Prepare permit parameters
uint256 nonce = 123;
uint256 deadline = block.timestamp + 1 hours;
bytes32 verifySignatureHash = keccak256(
abi.encode(
VERIFY_SIGNATURE_TYPEHASH, // "VerifySignature(address account,address target,bytes32 hash,uint256 nonce,uint256 deadline)"
account,
address(perpsManager),
keccak256(placeOrderData),
nonce,
deadline
)
);
bytes memory permitSignature = _signTypedDataHash(signerPrivateKey, verifySignatureHash);
InputTypes.PermitParams memory permit = InputTypes.PermitParams({
account: account,
signer: signer,
deadline: deadline,
signature: permitSignature,
nonce: nonce
});
uint256 orderId = perpsManager.placeOrderWithPermit(placeOrderData, permit);Cancel Order
Description
Cancels an open limit order in the specified market.
function cancelOrder(bytes32 cancelOrderData) external;Parameters
cancelOrderData: Encoded cancel order data (32 bytes) containing:marketId(uint64, 8 bytes): The market IDorderId(uint192, 24 bytes): The order ID to cancel
Example
bytes32 cancelOrderData = bytes32(abi.encodePacked(
uint64(marketId),
uint192(orderId)
));
perpsManager.cancelOrder(cancelOrderData);Cancel Order With Permit
Description
Cancels an order with EIP-712 typed data signature. The signer must be registered in the RISExAuthorization contract.
function cancelOrderWithPermit(
bytes32 cancelOrderData,
InputTypes.PermitParams calldata permit
) external;Parameters
cancelOrderData: Encoded cancel order data (same ascancelOrder)permit: Permit parameters (same asplaceOrderWithPermit)
Example
// Encode cancel order data
bytes32 cancelOrderData = bytes32(abi.encodePacked(
uint64(marketId),
uint192(orderId)
));
// Prepare permit parameters
uint256 nonce = 456;
uint256 deadline = block.timestamp + 1 hours;
bytes32 verifySignatureHash = keccak256(
abi.encode(
VERIFY_SIGNATURE_TYPEHASH, // "VerifySignature(address account,address target,bytes32 hash,uint256 nonce,uint256 deadline)"
account,
address(perpsManager),
keccak256(cancelOrderData),
nonce,
deadline
)
);
bytes memory permitSignature = _signTypedDataHash(signerPrivateKey, verifySignatureHash);
InputTypes.PermitParams memory permit = InputTypes.PermitParams({
account: account,
signer: signer,
deadline: deadline,
signature: permitSignature,
nonce: nonce
});
perpsManager.cancelOrderWithPermit(cancelOrderData, permit);Update Margin Mode
Description
Updates the margin mode (Cross or Isolated) for an account in a specific market.
function updateMarginMode(InputTypes.UpdateMarginModeParams calldata params) external;Parameters
params: UpdateMarginModeParams struct:marketId: The market IDmarginMode: The new margin mode (0 = Cross, 1 = Isolated)
Example
InputTypes.UpdateMarginModeParams memory params = InputTypes.UpdateMarginModeParams({
marketId: marketId,
marginMode: Market.MarginMode.Isolated
});
perpsManager.updateMarginMode(params);Update Margin Mode With Permit
Description
Updates margin mode with EIP-712 typed data signature. The signer must be registered in the RISExAuthorization
contract.
function updateMarginModeWithPermit(
InputTypes.UpdateMarginModeParams calldata params,
InputTypes.PermitParams calldata permit
) external;Parameters
params: UpdateMarginModeParams structpermit: Permit parameters
Example
// Encode update margin mode params
uint64 marketId = 1; // BTC
uint8 marginMode = 1; // Isolated
InputTypes.UpdateMarginModeParams memory params = InputTypes.UpdateMarginModeParams({
marketId: marketId,
marginMode: Market.MarginMode(marginMode)
});
// Prepare permit parameters
uint256 nonce = 456;
uint256 deadline = block.timestamp + 1 hours;
bytes32 verifySignatureHash = keccak256(
abi.encode(
VERIFY_SIGNATURE_TYPEHASH, // "VerifySignature(address account,address target,bytes32 hash,uint256 nonce,uint256 deadline)"
account,
address(perpsManager),
keccak256(abi.encode(params)),
nonce,
deadline
)
);
bytes memory permitSignature = _signTypedDataHash(signerPrivateKey, verifySignatureHash);
InputTypes.PermitParams memory permit = InputTypes.PermitParams({
account: account,
signer: signer,
deadline: deadline,
signature: permitSignature,
nonce: nonce
});
perpsManager.updateMarginModeWithPermit(params, permit);Update Leverage
Description
Updates the leverage for an account in a specific market. Leverage determines the maximum position size relative to margin.
function updateLeverage(InputTypes.UpdateLeverageParams calldata params) external;Parameters
params: UpdateLeverageParams struct:marketId: The market IDleverage: The new leverage (as a multiplier, e.g., 10 for 10x)
Example
InputTypes.UpdateLeverageParams memory params = InputTypes.UpdateLeverageParams({
marketId: marketId,
leverage: 20 // 20x leverage
});
perpsManager.updateLeverage(params);Update Leverage With Permit
Description
Updates leverage with EIP-712 typed data signature. The signer must be registered in the RISExAuthorization contract.
function updateLeverageWithPermit(
InputTypes.UpdateLeverageParams calldata params,
InputTypes.PermitParams calldata permit
) external;Parameters
params: UpdateLeverageParams structpermit: Permit parameters
Example
// Encode update leverage params
uint64 marketId = 1; // BTC
uint128 leverage = 10e18; // 10x leverage
InputTypes.UpdateLeverageParams memory params = InputTypes.UpdateLeverageParams({
marketId: marketId,
leverage: leverage
});
// Prepare permit parameters
uint256 nonce = 456;
uint256 deadline = block.timestamp + 1 hours;
bytes32 verifySignatureHash = keccak256(
abi.encode(
VERIFY_SIGNATURE_TYPEHASH, // "VerifySignature(address account,address target,bytes32 hash,uint256 nonce,uint256 deadline)"
account,
address(perpsManager),
keccak256(abi.encode(params)),
nonce,
deadline
)
);
bytes memory permitSignature = _signTypedDataHash(signerPrivateKey, verifySignatureHash);
InputTypes.PermitParams memory permit = InputTypes.PermitParams({
account: account,
signer: signer,
deadline: deadline,
signature: permitSignature,
nonce: nonce
});
perpsManager.updateLeverageWithPermit(params, permit);Update Isolated Position Margin Balance
Description
Adds or removes margin from an isolated position. Positive amount adds margin, negative amount removes margin.
function updateIsolatedPositionMarginBalance(
InputTypes.UpdateIsolatedPositionMarginBalanceParams calldata params
) external;Parameters
params: UpdateIsolatedPositionMarginBalanceParams struct:marketId: The market IDamount: The delta amount to add (if positive) or remove (if negative), in USDC with 18 decimals
Example
// Add 100 USDC to isolated position
InputTypes.UpdateIsolatedPositionMarginBalanceParams memory params = InputTypes.UpdateIsolatedPositionMarginBalanceParams({
marketId: marketId,
amount: 100e18 // Positive to add
});
perpsManager.updateIsolatedPositionMarginBalance(params);
// Remove 50 USDC from isolated position
params.amount = -50e18; // Negative to remove
perpsManager.updateIsolatedPositionMarginBalance(params);Update Isolated Position Margin Balance With Permit
Description
Updates isolated position margin balance with EIP-712 typed data signature. The signer must be registered in the
RISExAuthorization contract.
function updateIsolatedPositionMarginBalanceWithPermit(
InputTypes.UpdateIsolatedPositionMarginBalanceParams calldata params,
InputTypes.PermitParams calldata permit
) external;Parameters
params: UpdateIsolatedPositionMarginBalanceParams structpermit: Permit parameters
Example
// Encode update isolated position margin balance params
uint64 marketId = 1; // BTC
int256 amount = 1000e18; // 1000 USDC
InputTypes.UpdateIsolatedPositionMarginBalanceParams memory params = InputTypes.UpdateIsolatedPositionMarginBalanceParams({
marketId: marketId,
amount: amount
});
// Prepare permit parameters
uint256 nonce = 456;
uint256 deadline = block.timestamp + 1 hours;
bytes32 verifySignatureHash = keccak256(
abi.encode(
VERIFY_SIGNATURE_TYPEHASH, // "VerifySignature(address account,address target,bytes32 hash,uint256 nonce,uint256 deadline)"
account,
address(perpsManager),
keccak256(abi.encode(params)),
nonce,
deadline
)
);
bytes memory permitSignature = _signTypedDataHash(signerPrivateKey, verifySignatureHash);
InputTypes.PermitParams memory permit = InputTypes.PermitParams({
account: account,
signer: signer,
deadline: deadline,
signature: permitSignature,
nonce: nonce
});
perpsManager.updateIsolatedPositionMarginBalanceWithPermit(params, permit);View Functions
Get Balance
Description
Returns the collateral balance for a specific token for an account.
function getBalance(address account, address token) external view returns (int256);Parameters
account: The account addresstoken: The token address
Returns
int256: The balance (can be negative in edge cases)
Example
int256 balance = perpsManager.getBalance(account, usdc);Get Position
Description
Returns the position for an account in a market.
function getPosition(uint256 marketId, address account) external view returns (Market.Position memory);Parameters
marketId: The market IDaccount: The account address
Returns
Market.Position: The position struct containing:size: Position size (positive for long, negative for short)quoteAmount: Quote amountmarginMode: Current margin modeside: Position side (Buy = long, Sell = short)isolatedUsdcBalance: Isolated margin balance (if isolated mode)lastFundingPayment: Last funding paymentleverage: Current leverage
Example
Market.Position memory position = perpsManager.getPosition(marketId, account);Get Leverage
Description
Returns the leverage for an account in a market.
function getLeverage(uint256 marketId, address account) external view returns (uint256);Parameters
marketId: The market IDaccount: The account address
Returns
uint256: The leverage multiplier
Example
uint256 leverage = perpsManager.getLeverage(marketId, account);Get Market Config
Description
Returns the configuration for a market.
function getMarketConfig(uint256 marketId) external view returns (Market.Config memory);Parameters
marketId: The market ID
Returns
Market.Config: The market configuration containing:name: Market namequote: Quote token addressstepSize: Minimum order size stepstepPrice: Minimum price stepmaintenanceMarginFactor: Maintenance margin factormaxLeverage: Maximum allowed leverageminOrderSize: Minimum order sizeunlocked: Whether the market is unlocked
Example
Market.Config memory config = perpsManager.getMarketConfig(marketId);Get Best Price
Description
Returns the best bid or ask price in a market.
function getBestPrice(uint256 marketId, OrderSide side) external view returns (uint256);Parameters
marketId: The market IDside: OrderSide (Buy for bid, Sell for ask)
Returns
uint256: The best price, or 0 if no orders exist
Example
uint256 bestBid = perpsManager.getBestPrice(marketId, OrderSide.Buy);
uint256 bestAsk = perpsManager.getBestPrice(marketId, OrderSide.Sell);Get Order
Description
Returns an order by market ID and order ID.
function getOrder(uint256 marketId, uint256 orderId) external view returns (Order memory);Parameters
marketId: The market IDorderId: The order ID
Returns
Order: The order struct
Example
Order memory order = perpsManager.getOrder(marketId, orderId);Get Open Orders
Description
Returns a paginated list of open order IDs for an account in a market.
function getOpenOrders(
uint256 marketId,
address account,
uint256 startIndex,
uint256 limit
) external view returns (uint256[] memory);Parameters
marketId: The market IDaccount: The account addressstartIndex: The starting index (0-based)limit: Maximum number of orders to return
Returns
uint256[]: Array of order IDs
Example
uint256[] memory orderIds = perpsManager.getOpenOrders(marketId, account, 0, 10);Get Withdrawable Amount
Description
Returns the maximum withdrawable amount for a specific token for an account, considering margin requirements.
function getWithdrawableAmount(address account, address token) external view returns (uint256);Parameters
account: The account addresstoken: The token address
Returns
uint256: The withdrawable amount (in token's native decimals)
Example
uint256 withdrawable = perpsManager.getWithdrawableAmount(account, usdc);Get Account Equity
Description
Returns the total account equity in USDC, including all positions and collateral.
function getAccountEquity(address account) external view returns (int256);Parameters
account: The account address
Returns
int256: The account equity (can be negative if underwater)
Example
int256 equity = perpsManager.getAccountEquity(account);Get Cross Margin Balance
Description
Returns the cross margin balance for an account.
function getCrossMarginBalance(address account) external view returns (int256);Parameters
account: The account address
Returns
int256: The cross margin balance
Example
int256 crossMargin = perpsManager.getCrossMarginBalance(account);Get Free Cross Margin Balance
Description
Returns the free (available for withdrawal) cross margin balance for an account.
function getFreeCrossMarginBalance(address account) external view returns (uint256);Parameters
account: The account address
Returns
uint256: The free cross margin balance
Example
uint256 freeMargin = perpsManager.getFreeCrossMarginBalance(account);