Docs
SDK

API Reference

Complete reference documentation for all PerpCity SDK functions and types.

Installation

pnpm add @strobelabs/perpcity-sdk

Core Class

PerpCityContext

The main context class for all SDK operations.

import { PerpCityContext } from '@strobelabs/perpcity-sdk'

const context = new PerpCityContext({
  walletClient, // viem WalletClient
  rpcUrl: process.env.RPC_URL!,
  deployments: {
    perpManager: '0x...',
    usdc: '0x...',
    // Optional module addresses
    feesModule: '0x...',
    marginRatiosModule: '0x...',
    lockupPeriodModule: '0x...',
    sqrtPriceImpactLimitModule: '0x...'
  }
})

Methods

getPerpConfig(perpId: Hex): Promise<PerpConfig>

Fetches and caches perp configuration including module addresses.

const config = await context.getPerpConfig('0x...')
console.log(config.fees) // Fees module address
console.log(config.marginRatios) // Margin ratios module address

getPerpData(perpId: Hex): Promise<PerpData>

Fetches comprehensive perp data from contracts.

const perpData = await context.getPerpData('0x...')
console.log(perpData.mark) // Current mark price
console.log(perpData.beacon) // Oracle address
console.log(perpData.tickSpacing)
console.log(perpData.bounds)
console.log(perpData.fees)

getUserData(userAddress: Hex, positions: Position[]): Promise<UserData>

Fetches user data with live details for all positions.

const userData = await context.getUserData('0x...', [
  { perpId: '0x...', positionId: 1n, isLong: true, isMaker: false },
  { perpId: '0x...', positionId: 2n, isLong: false, isMaker: false }
])

console.log(userData.usdcBalance)
console.log(userData.openPositions)

getOpenPositionData(perpId: Hex, positionId: bigint, isLong: boolean, isMaker: boolean): Promise<OpenPositionData>

Fetches live details for a single position.

const positionData = await context.getOpenPositionData(
  '0x...', // perpId
  123n,    // positionId
  true,    // isLong
  false    // isMaker
)

console.log(positionData.liveDetails.pnl)
console.log(positionData.liveDetails.fundingPayment)
console.log(positionData.liveDetails.isLiquidatable)

deployments(): PerpCityDeployments

Returns deployment addresses.

const deployments = context.deployments()
console.log(deployments.perpManager)
console.log(deployments.usdc)

Perp Manager Functions

createPerp

Creates a new perpetual market.

import { createPerp } from '@strobelabs/perpcity-sdk'

const perpId = await createPerp(context, {
  startingPrice: 3000,
  beacon: '0x...', // Oracle address
  // Optional module overrides
  fees: '0x...',
  marginRatios: '0x...',
  lockupPeriod: '0x...',
  sqrtPriceImpactLimit: '0x...'
})

Parameters:

  • context: PerpCityContext - SDK context
  • params: CreatePerpParams:
    • startingPrice: number - Initial mark price
    • beacon: Address - Oracle beacon address
    • fees?: Address - Optional fees module address
    • marginRatios?: Address - Optional margin ratios module
    • lockupPeriod?: Address - Optional lockup period module
    • sqrtPriceImpactLimit?: Address - Optional price impact limit module

Returns: Promise<Hex> - The new perp ID

openTakerPosition

Opens a taker (long/short) position.

import { openTakerPosition } from '@strobelabs/perpcity-sdk'

const position = await openTakerPosition(context, perpId, {
  isLong: true,
  margin: 1000,    // $1000 USDC
  leverage: 5,     // 5x leverage
  unspecifiedAmountLimit: 0
})

Parameters:

  • context: PerpCityContext - SDK context
  • perpId: Hex - Perp market ID
  • params: OpenTakerPositionParams:
    • isLong: boolean - true for long, false for short
    • margin: number - Margin in USDC
    • leverage: number - Leverage multiplier
    • unspecifiedAmountLimit: number - Slippage limit

Returns: Promise<OpenPosition> - Position object with ID and details

openMakerPosition

Opens a maker (liquidity provider) position.

import { openMakerPosition } from '@strobelabs/perpcity-sdk'

const position = await openMakerPosition(context, perpId, {
  margin: 10000,
  priceLower: 2900,
  priceUpper: 3100,
  liquidity: 1000000n,
  maxAmt0In: 1000000,
  maxAmt1In: 1000000
})

Parameters:

  • context: PerpCityContext - SDK context
  • perpId: Hex - Perp market ID
  • params: OpenMakerPositionParams:
    • margin: number - Margin in USDC
    • priceLower: number - Lower price bound
    • priceUpper: number - Upper price bound
    • liquidity: bigint - Liquidity amount
    • maxAmt0In: number - Max token0 input
    • maxAmt1In: number - Max token1 input

Returns: Promise<OpenPosition> - Position object with ID and details


Position Functions

closePosition

Closes an open position.

import { closePosition } from '@strobelabs/perpcity-sdk'

const result = await closePosition(context, perpId, positionId, {
  minAmt0Out: 0,
  minAmt1Out: 0,
  maxAmt1In: 1000000
})

Parameters:

  • context: PerpCityContext - SDK context
  • perpId: Hex - Perp market ID
  • positionId: bigint - Position ID
  • params: ClosePositionParams:
    • minAmt0Out: number - Minimum token0 output
    • minAmt1Out: number - Minimum token1 output
    • maxAmt1In: number - Maximum token1 input

Returns: Promise<ClosePositionResult>

  • position: OpenPosition | null - Null if fully closed, OpenPosition if partially closed
  • txHash: Hex - Transaction hash

getPositionPnl

Extracts PnL from position data.

import { getPositionPnl } from '@strobelabs/perpcity-sdk'

const pnl = getPositionPnl(positionData)
console.log(`PnL: $${pnl}`)

Parameters:

  • positionData: OpenPositionData - Position data object

Returns: number - PnL in USDC

getPositionFundingPayment

Extracts funding payment from position data.

import { getPositionFundingPayment } from '@strobelabs/perpcity-sdk'

const funding = getPositionFundingPayment(positionData)

Parameters:

  • positionData: OpenPositionData - Position data object

Returns: number - Funding payment in USDC

getPositionEffectiveMargin

Extracts effective margin from position data.

import { getPositionEffectiveMargin } from '@strobelabs/perpcity-sdk'

const margin = getPositionEffectiveMargin(positionData)

Parameters:

  • positionData: OpenPositionData - Position data object

Returns: number - Effective margin in USDC

getPositionIsLiquidatable

Checks if position is liquidatable.

import { getPositionIsLiquidatable } from '@strobelabs/perpcity-sdk'

const canLiquidate = getPositionIsLiquidatable(positionData)
if (canLiquidate) {
  console.warn('Position at risk!')
}

Parameters:

  • positionData: OpenPositionData - Position data object

Returns: boolean - true if liquidatable


Perp Data Functions

Pure functions for extracting data from PerpData objects.

getPerpMark

import { getPerpMark } from '@strobelabs/perpcity-sdk'

const mark = getPerpMark(perpData)

Returns: number - Current mark price

getPerpBeacon

import { getPerpBeacon } from '@strobelabs/perpcity-sdk'

const beacon = getPerpBeacon(perpData)

Returns: Address - Oracle beacon address

getPerpTickSpacing

import { getPerpTickSpacing } from '@strobelabs/perpcity-sdk'

const spacing = getPerpTickSpacing(perpData)

Returns: number - Tick spacing

getPerpBounds

import { getPerpBounds } from '@strobelabs/perpcity-sdk'

const bounds = getPerpBounds(perpData)
console.log(bounds.minMargin)
console.log(bounds.minTakerLeverage)
console.log(bounds.maxTakerLeverage)

Returns: Bounds - Margin and leverage bounds

getPerpFees

import { getPerpFees } from '@strobelabs/perpcity-sdk'

const fees = getPerpFees(perpData)
console.log(fees.creatorFee)
console.log(fees.insuranceFee)
console.log(fees.lpFee)
console.log(fees.liquidationFee)

Returns: Fees - Fee structure


User Functions

Pure functions for extracting data from UserData objects.

getUserUsdcBalance

import { getUserUsdcBalance } from '@strobelabs/perpcity-sdk'

const balance = getUserUsdcBalance(userData)

Returns: number - USDC balance

getUserOpenPositions

import { getUserOpenPositions } from '@strobelabs/perpcity-sdk'

const positions = getUserOpenPositions(userData)

Returns: OpenPositionData[] - Array of open positions

getUserWalletAddress

import { getUserWalletAddress } from '@strobelabs/perpcity-sdk'

const address = getUserWalletAddress(userData)

Returns: Hex - User's wallet address


Types

PerpData

type PerpData = {
  id: Hex
  mark: number
  beacon: Address
  tickSpacing: number
  bounds: Bounds
  fees: Fees
}

Bounds

type Bounds = {
  minMargin: number
  minTakerLeverage: number
  maxTakerLeverage: number
  liquidationTakerRatio: number
}

Fees

type Fees = {
  creatorFee: number
  insuranceFee: number
  lpFee: number
  liquidationFee: number
}

UserData

type UserData = {
  walletAddress: Hex
  usdcBalance: number
  openPositions: OpenPositionData[]
}

OpenPositionData

type OpenPositionData = {
  perpId: Hex
  positionId: bigint
  isLong?: boolean    // Optional - populated when fetched
  isMaker?: boolean   // Optional - populated when fetched
  liveDetails: LiveDetails
}

LiveDetails

type LiveDetails = {
  pnl: number
  fundingPayment: number
  effectiveMargin: number
  isLiquidatable: boolean
}

PerpConfig

type PerpConfig = {
  key: {
    currency0: Address
    currency1: Address
    fee: number
    tickSpacing: number
    hooks: Address
  }
  creator: Address
  vault: Address
  beacon: Address
  fees: Address
  marginRatios: Address
  lockupPeriod: Address
  sqrtPriceImpactLimit: Address
}

Next Steps