import {z} from 'zod' export type GetApiV1PortfolioActivitiesArgs = {limit?: number | undefined, cursor?: string | undefined, marketSlug?: string | undefined, types?: (Array<'ACTIVITY_TYPE_TRADE' | 'ACTIVITY_TYPE_POSITION_RESOLUTION' | 'ACTIVITY_TYPE_ACCOUNT_DEPOSIT' | 'ACTIVITY_TYPE_ACCOUNT_ADVANCED_DEPOSIT' | 'ACTIVITY_TYPE_ACCOUNT_WITHDRAWAL' | 'ACTIVITY_TYPE_REFERRAL_BONUS' | 'ACTIVITY_TYPE_TRANSFER' | 'ACTIVITY_TYPE_TAKER_FEE_REBATE' | 'ACTIVITY_TYPE_LIQUIDITY_PROGRAM'>) | undefined, sortOrder?: ('SORT_ORDER_DESCENDING' | 'SORT_ORDER_ASCENDING') | undefined}; export type GetApiV1PortfolioActivitiesOptions = {baseUrl?: string | undefined, XPMAccessKey?: string | undefined, XPMTimestamp?: string | undefined, XPMSignature?: string | undefined, fetch?: typeof fetch | undefined}; export const activityType = z.enum(["ACTIVITY_TYPE_TRADE", "ACTIVITY_TYPE_POSITION_RESOLUTION", "ACTIVITY_TYPE_ACCOUNT_DEPOSIT", "ACTIVITY_TYPE_ACCOUNT_ADVANCED_DEPOSIT", "ACTIVITY_TYPE_ACCOUNT_WITHDRAWAL", "ACTIVITY_TYPE_REFERRAL_BONUS", "ACTIVITY_TYPE_TRANSFER", "ACTIVITY_TYPE_TAKER_FEE_REBATE", "ACTIVITY_TYPE_LIQUIDITY_PROGRAM"]); export const orderType = z.enum(["ORDER_TYPE_MARKET_TO_LIMIT", "ORDER_TYPE_LIMIT", "ORDER_TYPE_STOP", "ORDER_TYPE_STOP_LIMIT"]); export const side = z.enum(["SIDE_BUY", "SIDE_SELL"]); export const timeInForce = z.enum(["TIME_IN_FORCE_DAY", "TIME_IN_FORCE_GOOD_TILL_CANCEL", "TIME_IN_FORCE_IMMEDIATE_OR_CANCEL", "TIME_IN_FORCE_GOOD_TILL_TIME", "TIME_IN_FORCE_FILL_OR_KILL"]); export const orderState = z.enum(["ORDER_STATE_PARTIALLY_FILLED", "ORDER_STATE_FILLED", "ORDER_STATE_CANCELED", "ORDER_STATE_REPLACED", "ORDER_STATE_REJECTED", "ORDER_STATE_EXPIRED", "ORDER_STATE_PENDING_NEW", "ORDER_STATE_PENDING_REPLACE", "ORDER_STATE_PENDING_CANCEL", "ORDER_STATE_PENDING_RISK"]); export const selfMatchPreventionInstruction = z.enum(["SELF_MATCH_PREVENTION_INSTRUCTION_REJECT_AGGRESSOR", "SELF_MATCH_PREVENTION_INSTRUCTION_CANCEL_RESTING", "SELF_MATCH_PREVENTION_INSTRUCTION_REMOVE_BOTH"]); export const orderCapacity = z.enum(["ORDER_CAPACITY_AGENCY", "ORDER_CAPACITY_PRINCIPAL", "ORDER_CAPACITY_PROPRIETARY", "ORDER_CAPACITY_INDIVIDUAL", "ORDER_CAPACITY_RISKLESS_PRINCIPAL", "ORDER_CAPACITY_AGENT_FOR_OTHER_MEMBER"]); export const manualOrderIndicator = z.enum(["MANUAL_ORDER_INDICATOR_MANUAL", "MANUAL_ORDER_INDICATOR_AUTOMATED"]); export const order = z.object({id: z.string().optional(), type: orderType.optional(), side: side.optional(), orderQty: z.string().optional(), symbol: z.string().optional(), clordId: z.string().optional(), timeInForce: timeInForce.optional(), account: z.string().optional(), cumQty: z.string().optional(), avgPx: z.string().optional(), leavesQty: z.string().optional(), state: orderState.optional(), participant: z.string().optional(), price: z.string().optional(), insertTime: z.string().optional(), stopPrice: z.string().optional(), minQty: z.string().optional(), createTime: z.string().optional(), allOrNone: z.boolean().optional(), crossId: z.string().optional(), hostCrossId: z.string().optional(), submittingParticipant: z.string().optional(), clientAccountId: z.string().optional(), clientParticipantId: z.string().optional(), parentOrderId: z.string().optional(), commissionsBasisPoints: z.string().optional(), participateDontInitiate: z.boolean().optional(), cashOrderQty: z.string().optional(), strictLimit: z.boolean().optional(), goodTillTime: z.string().optional(), bestLimit: z.boolean().optional(), immediatelyExecutableLimit: z.boolean().optional(), lastTradeId: z.string().optional(), commissionNotionalTotalCollected: z.string().optional(), selfMatchPreventionInstruction: selfMatchPreventionInstruction.optional(), orderCapacity: orderCapacity.optional(), ignorePriceValidityChecks: z.boolean().optional(), lastTransactTime: z.string().optional(), makerCommissionsBasisPoints: z.string().optional(), manualOrderIndicator: manualOrderIndicator.optional(), fractionalQuantityScale: z.string().optional(), priceToQuantityFilled: z.record(z.string(), z.string()).optional()}); export const executionType = z.enum(["EXECUTION_TYPE_PARTIAL_FILL", "EXECUTION_TYPE_FILL", "EXECUTION_TYPE_CANCELED", "EXECUTION_TYPE_REPLACE", "EXECUTION_TYPE_REJECTED", "EXECUTION_TYPE_EXPIRED", "EXECUTION_TYPE_DONE_FOR_DAY"]); export const ordRejectReason = z.enum(["ORD_REJECT_REASON_UNKNOWN_SYMBOL", "ORD_REJECT_REASON_EXCHANGE_CLOSED", "ORD_REJECT_REASON_INCORRECT_QUANTITY", "ORD_REJECT_REASON_INVALID_PRICE_INCREMENT", "ORD_REJECT_REASON_INCORRECT_ORDER_TYPE", "ORD_REJECT_REASON_PRICE_OUT_OF_BOUNDS", "ORD_REJECT_REASON_NO_LIQUIDITY"]); export const legPrice = z.object({symbol: z.string().optional(), anchor: z.boolean().optional(), px: z.string().optional(), qty: z.string().optional(), side: z.string().optional(), referencePx: z.string().optional()}); export const unsolicitedCxlReason = z.enum(["UNSOLICITED_CXL_REASON_CONNECTION_LOSS", "UNSOLICITED_CXL_REASON_LOGOUT", "UNSOLICITED_CXL_REASON_EXCHANGE_OPTION", "UNSOLICITED_CXL_REASON_OTHER"]); export const date = z.object({year: z.number().int().optional(), month: z.number().int().optional(), day: z.number().int().optional()}); export const execution = z.object({id: z.string().optional(), order: order.optional(), lastShares: z.string().optional(), lastPx: z.string().optional(), type: executionType.optional(), text: z.string().optional(), orderRejectReason: ordRejectReason.optional(), transactTime: z.string().optional(), legPrices: z.array(legPrice).optional(), tradeId: z.string().optional(), aggressor: z.boolean().optional(), commissionNotionalCollected: z.string().optional(), unsolicitedCancelReason: unsolicitedCxlReason.optional(), traceId: z.string().optional(), commissionSpreadPx: z.string().optional(), transactTradeDate: date.optional()}); export const tradeType = z.enum(["TRADE_TYPE_REGULAR", "TRADE_TYPE_REQUEST_FOR_QUOTE", "TRADE_TYPE_BLOCK", "TRADE_TYPE_CROSS"]); export const tradeState = z.enum(["TRADE_STATE_NEW", "TRADE_STATE_CLEARED", "TRADE_STATE_BUSTED", "TRADE_STATE_INFLIGHT", "TRADE_STATE_PENDING_RISK", "TRADE_STATE_PENDING_CLEARED", "TRADE_STATE_REJECTED", "TRADE_STATE_CLEARING_ACKNOWLEDGED", "TRADE_STATE_RETRY_REQUEST"]); export const trade = z.object({id: z.string().optional(), aggressor: execution.optional(), passive: execution.optional(), tradeType: tradeType.optional(), state: tradeState.optional(), reportingCounterparty: side.optional(), text: z.string().optional(), tradeLinkId: z.string().optional(), metadata: z.record(z.string(), z.string()).optional()}); export const amount = z.object({value: z.string(), currency: z.string()}); export const marketMetadata = z.object({slug: z.string().optional(), icon: z.string().optional(), title: z.string().optional(), outcome: z.string().optional(), eventSlug: z.string().optional()}); export const userPosition = z.object({netPosition: z.string().optional(), qtyBought: z.string().optional(), qtySold: z.string().optional(), cost: amount.optional(), realized: amount.optional(), bodPosition: z.string().optional(), expired: z.boolean().optional(), updateTime: z.string().optional(), marketMetadata: marketMetadata.optional(), cashValue: amount.optional(), qtyAvailable: z.string().nullable().optional(), netPositionDecimal: z.string().optional(), qtyBoughtDecimal: z.string().optional(), qtySoldDecimal: z.string().optional(), bodPositionDecimal: z.string().optional(), qtyAvailableDecimal: z.string().nullable().optional()}); export const positionResolution = z.object({marketSlug: z.string().optional(), beforePosition: userPosition.optional(), afterPosition: userPosition.optional(), updateTime: z.string().optional(), tradeId: z.string().optional(), side: z.enum(["POSITION_RESOLUTION_SIDE_LONG", "POSITION_RESOLUTION_SIDE_SHORT", "POSITION_RESOLUTION_SIDE_NEUTRAL"]).optional()}); export const accountBalanceChange = z.object({transactionId: z.string().optional(), status: z.enum(["ACCOUNT_BALANCE_CHANGE_STATUS_PENDING", "ACCOUNT_BALANCE_CHANGE_STATUS_COMPLETED", "ACCOUNT_BALANCE_CHANGE_STATUS_PARTIALLY_REFUNDED", "ACCOUNT_BALANCE_CHANGE_STATUS_REJECTED"]).optional(), amount: amount.optional(), updateTime: z.string().optional(), createTime: z.string().optional()}); export const activity = z.object({type: activityType.optional(), trade: trade.optional(), positionResolution: positionResolution.optional(), accountBalanceChange: accountBalanceChange.optional()}); export const getActivitiesResponse = z.object({activities: z.array(activity).optional(), nextCursor: z.string().optional(), eof: z.boolean().optional()}); export const validateResponse = async ( schema: { readonly '~standard': { readonly validate: (value: unknown) => ({ readonly value: Output; readonly issues?: undefined } | { readonly issues: ReadonlyArray<{ readonly message: string; readonly path?: ReadonlyArray | undefined }> }) | Promise<{ readonly value: Output; readonly issues?: undefined } | { readonly issues: ReadonlyArray<{ readonly message: string; readonly path?: ReadonlyArray | undefined }> }> } }, value: unknown ): Promise => { const result = await schema['~standard'].validate(value) if (result.issues !== undefined) { const detail = result.issues .map(({ message, path }) => path?.length ? `${path.map((segment) => String(typeof segment === 'object' ? segment.key : segment)).join('.')}: ${message}` : message ) .join('; ') throw new Error(`Response does not match the schema: ${detail}`, { cause: { issues: result.issues } }) } return result.value }; /** * Get Activities * * GET /v1/portfolio/activities */ export const getApiV1PortfolioActivities = async (args: GetApiV1PortfolioActivitiesArgs, options?: GetApiV1PortfolioActivitiesOptions) => { const {baseUrl = "https://api.polymarket.us", fetch: fetchFn = fetch, XPMAccessKey, XPMTimestamp, XPMSignature} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('accept', "application/json") if (args.limit != null) query.append("limit", String(args.limit)) if (args.cursor != null) query.append("cursor", String(args.cursor)) if (args.marketSlug != null) query.append("marketSlug", String(args.marketSlug)) for (const item of args.types ?? []) query.append("types", String(item)) if (args.sortOrder != null) query.append("sortOrder", String(args.sortOrder)) if (XPMAccessKey !== undefined) headers.set("X-PM-Access-Key", XPMAccessKey) if (XPMTimestamp !== undefined) headers.set("X-PM-Timestamp", XPMTimestamp) if (XPMSignature !== undefined) headers.set("X-PM-Signature", XPMSignature) const url = `${baseUrl.replace(/\/+$/, '')}/v1/portfolio/activities${query.size > 0 ? `?${query}` : ''}` const res = await fetchFn(url, {method: "GET", headers}) if (!res.ok) throw new Error(`Request failed with status ${res.status}`, {cause: {status: res.status, body: await res.text()}}) return validateResponse(getActivitiesResponse, await res.json()) };