API Reference
Complete reference documentation for all PerpCity SDK functions and types.
Installation
pnpm add @strobelabs/perpcity-sdkCore 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 addressgetPerpData(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 contextparams: CreatePerpParams:startingPrice: number- Initial mark pricebeacon: Address- Oracle beacon addressfees?: Address- Optional fees module addressmarginRatios?: Address- Optional margin ratios modulelockupPeriod?: Address- Optional lockup period modulesqrtPriceImpactLimit?: 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 contextperpId: Hex- Perp market IDparams: OpenTakerPositionParams:isLong: boolean- true for long, false for shortmargin: number- Margin in USDCleverage: number- Leverage multiplierunspecifiedAmountLimit: 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 contextperpId: Hex- Perp market IDparams: OpenMakerPositionParams:margin: number- Margin in USDCpriceLower: number- Lower price boundpriceUpper: number- Upper price boundliquidity: bigint- Liquidity amountmaxAmt0In: number- Max token0 inputmaxAmt1In: 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 contextperpId: Hex- Perp market IDpositionId: bigint- Position IDparams: ClosePositionParams:minAmt0Out: number- Minimum token0 outputminAmt1Out: number- Minimum token1 outputmaxAmt1In: number- Maximum token1 input
Returns: Promise<ClosePositionResult>
position: OpenPosition | null- Null if fully closed, OpenPosition if partially closedtxHash: 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
}