@dimes-dot-fi/sdk 1.2.0 → 1.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{aliases-DzVxkXtK.d.cts → aliases-BGqwpyE-.d.cts} +39 -1
- package/dist/{aliases-DzVxkXtK.d.ts → aliases-BGqwpyE-.d.ts} +39 -1
- package/dist/{chunk-YUCGNELT.mjs → chunk-4MO3HKMS.mjs} +7 -1
- package/dist/chunk-4MO3HKMS.mjs.map +1 -0
- package/dist/{chunk-S65RABUT.mjs → chunk-BVILILIV.mjs} +13 -1
- package/dist/chunk-BVILILIV.mjs.map +1 -0
- package/dist/{chunk-JWAPH4GD.cjs → chunk-COSLZ5TM.cjs} +36 -11
- package/dist/chunk-COSLZ5TM.cjs.map +1 -0
- package/dist/{chunk-UUE4HG2H.cjs → chunk-DYPABUKC.cjs} +13 -1
- package/dist/chunk-DYPABUKC.cjs.map +1 -0
- package/dist/{chunk-EI5V5Z6G.mjs → chunk-SGA6OZEU.mjs} +33 -8
- package/dist/chunk-SGA6OZEU.mjs.map +1 -0
- package/dist/{chunk-ZK56XS4X.cjs → chunk-UHQZSMUD.cjs} +8 -2
- package/dist/chunk-UHQZSMUD.cjs.map +1 -0
- package/dist/contract/index.cjs +206 -14
- package/dist/contract/index.cjs.map +1 -1
- package/dist/contract/index.d.cts +155 -4
- package/dist/contract/index.d.ts +155 -4
- package/dist/contract/index.mjs +193 -1
- package/dist/contract/index.mjs.map +1 -1
- package/dist/{dimes-client-D88pW-Lm.d.ts → dimes-client-C2hT6mZ8.d.cts} +10 -2
- package/dist/{dimes-client-Bs6eTIvn.d.cts → dimes-client-DFAKtIeI.d.ts} +10 -2
- package/dist/{dimes-error-DxIoHQzj.d.cts → dimes-error-BW0wd1ib.d.cts} +1 -1
- package/dist/{dimes-error-BHVY6vDv.d.ts → dimes-error-IBJ5eff6.d.ts} +1 -1
- package/dist/index.cjs +12 -7
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +7 -7
- package/dist/index.d.ts +7 -7
- package/dist/index.mjs +8 -3
- package/dist/index.mjs.map +1 -1
- package/dist/{quote-Cy7ie8yT.d.ts → quote-BVMZb0T8.d.ts} +2 -2
- package/dist/{quote-CZqCqt8R.d.cts → quote-BcVJ0U0l.d.cts} +2 -2
- package/dist/react/index.cjs +4 -4
- package/dist/react/index.d.cts +3 -3
- package/dist/react/index.d.ts +3 -3
- package/dist/react/index.mjs +2 -2
- package/dist/{types-BcUKsoEs.d.ts → types-BwPF-kCK.d.cts} +20 -2
- package/dist/{types--ysRe5Os.d.cts → types-C7nWOxO-.d.ts} +20 -2
- package/dist/ws/index.cjs +114 -4
- package/dist/ws/index.cjs.map +1 -1
- package/dist/ws/index.d.cts +36 -9
- package/dist/ws/index.d.ts +36 -9
- package/dist/ws/index.mjs +111 -1
- package/dist/ws/index.mjs.map +1 -1
- package/package.json +1 -1
- package/dist/chunk-EI5V5Z6G.mjs.map +0 -1
- package/dist/chunk-JWAPH4GD.cjs.map +0 -1
- package/dist/chunk-S65RABUT.mjs.map +0 -1
- package/dist/chunk-UUE4HG2H.cjs.map +0 -1
- package/dist/chunk-YUCGNELT.mjs.map +0 -1
- package/dist/chunk-ZK56XS4X.cjs.map +0 -1
package/dist/index.mjs
CHANGED
|
@@ -4,17 +4,17 @@ import {
|
|
|
4
4
|
hintAdjustment,
|
|
5
5
|
marketMovedCodes,
|
|
6
6
|
quoteErrorHint
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-SGA6OZEU.mjs";
|
|
8
8
|
import {
|
|
9
9
|
DimesApiError,
|
|
10
10
|
DimesContractError,
|
|
11
11
|
DimesError,
|
|
12
12
|
formatErrorMessage,
|
|
13
13
|
resolveFriendlyMessage
|
|
14
|
-
} from "./chunk-
|
|
14
|
+
} from "./chunk-BVILILIV.mjs";
|
|
15
15
|
import {
|
|
16
16
|
positionEventTypes
|
|
17
|
-
} from "./chunk-
|
|
17
|
+
} from "./chunk-4MO3HKMS.mjs";
|
|
18
18
|
|
|
19
19
|
// src/client/dimes-client.ts
|
|
20
20
|
import { decamelizeKeys } from "humps";
|
|
@@ -170,6 +170,11 @@ var DimesClient = class {
|
|
|
170
170
|
const query = params ? buildQueryFromEntries(Object.entries(params)) : "";
|
|
171
171
|
return this.http.requestList(`/v1/prediction-markets/positions${query}`);
|
|
172
172
|
}
|
|
173
|
+
async getPositionTransactions(positionId) {
|
|
174
|
+
return this.http.request(
|
|
175
|
+
`/v1/prediction-markets/positions/${encodeURIComponent(positionId)}/transactions`
|
|
176
|
+
);
|
|
177
|
+
}
|
|
173
178
|
async cancelPosition(positionId) {
|
|
174
179
|
await this.http.request(`/v1/prediction-markets/positions/${encodeURIComponent(positionId)}/cancel`, {
|
|
175
180
|
method: "POST"
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/client/dimes-client.ts","../src/client/http.ts","../src/client/auth.ts","../src/types/aliases.ts","../src/utils/eligibility.ts","../src/utils/leverage.ts","../src/utils/fees.ts"],"sourcesContent":["import { decamelizeKeys } from \"humps\";\nimport type { ContractInfo, CreateOfferParams, Market, Offer, Position, Paginated, CustomerLimit } from \"../types\";\nimport type { AuthProvider } from \"./auth\";\nimport { HttpClient } from \"./http\";\n\nexport interface DimesClientOptions {\n baseUrl?: string;\n auth: AuthProvider;\n fetch?: typeof globalThis.fetch;\n maxRetries?: number;\n maxRetryDelayMs?: number;\n}\n\nexport interface GetMarketsParams {\n cursor?: string;\n limit?: number;\n category?: string;\n status?: string;\n provider?: \"polymarket\" | \"kalshi\";\n}\n\nexport interface GetPositionsParams {\n cursor?: string;\n limit?: number;\n status?: \"open\" | \"closed\";\n}\n\nfunction buildQueryFromEntries(entries: [string, unknown][]): string {\n const filtered = entries.filter(([, v]) => v !== undefined && v !== null);\n if (filtered.length === 0) {\n return \"\";\n }\n\n const search = new URLSearchParams();\n for (const [key, value] of filtered) {\n search.set(\n key.replace(/[A-Z]/g, (c) => `_${c.toLowerCase()}`),\n String(value),\n );\n }\n\n return `?${search.toString()}`;\n}\n\nexport class DimesClient {\n private readonly http: HttpClient;\n\n constructor(options: DimesClientOptions) {\n this.http = new HttpClient({\n baseUrl: options.baseUrl ?? \"https://api.dimes.fi\",\n auth: options.auth,\n fetch: options.fetch,\n maxRetries: options.maxRetries,\n maxRetryDelayMs: options.maxRetryDelayMs,\n });\n }\n\n public async getMarkets(params?: GetMarketsParams): Promise<Paginated<Market>> {\n const query = params ? buildQueryFromEntries(Object.entries(params)) : \"\";\n return this.http.request<Paginated<Market>>(`/v1/prediction-markets/markets${query}`);\n }\n\n public async getMarket(ticker: string): Promise<Market> {\n return this.http.request<Market>(`/v1/prediction-markets/markets/${encodeURIComponent(ticker)}`);\n }\n\n public async createDraftQuote(params: CreateOfferParams): Promise<Offer> {\n return this.http.request<Offer>(\"/v1/prediction-markets/draft-quotes\", {\n method: \"POST\",\n body: JSON.stringify(decamelizeKeys(params)),\n });\n }\n\n public async promoteDraftQuote(draftId: string): Promise<Offer> {\n return this.http.request<Offer>(`/v1/prediction-markets/promoted-quotes/${encodeURIComponent(draftId)}`, {\n method: \"POST\",\n });\n }\n\n public async createQuote(params: CreateOfferParams): Promise<Offer> {\n return this.http.request<Offer>(\"/v1/prediction-markets/quotes\", {\n method: \"POST\",\n body: JSON.stringify(decamelizeKeys(params)),\n });\n }\n\n public async getPositions(params?: GetPositionsParams): Promise<Position[]> {\n const query = params ? buildQueryFromEntries(Object.entries(params)) : \"\";\n return this.http.requestList<Position>(`/v1/prediction-markets/positions${query}`);\n }\n\n public async cancelPosition(positionId: string): Promise<void> {\n await this.http.request<unknown>(`/v1/prediction-markets/positions/${encodeURIComponent(positionId)}/cancel`, {\n method: \"POST\",\n });\n }\n\n public async getContractInfo(): Promise<ContractInfo> {\n return this.http.request<ContractInfo>(\"/v1/prediction-markets/contract-info\");\n }\n\n public async getLimits(): Promise<CustomerLimit> {\n return this.http.request<CustomerLimit>(\"/v1/prediction-markets/limits\");\n }\n}\n","import { camelizeKeys, type Camelized } from \"humps\";\nimport { DimesApiError } from \"../errors/dimes-error\";\nimport type { AuthProvider } from \"./auth\";\n\nexport type { Camelized };\n\ninterface ApiErrorBody {\n error?: {\n type?: string;\n code?: string;\n message: string;\n params?: Record<string, unknown>;\n };\n}\n\nconst HTTP_UNAUTHORIZED = 401;\nconst HTTP_TOO_MANY_REQUESTS = 429;\nconst DEFAULT_MAX_RETRIES = 3;\nconst DEFAULT_MAX_RETRY_DELAY_MS = 60_000;\nconst DEFAULT_RETRY_DELAY_MS = 1000;\nconst BACKOFF_FACTOR = 2;\nconst MS_PER_SECOND = 1000;\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nfunction parseRetryAfterMs(header: string | null, attempt: number): number {\n const fallbackMs = DEFAULT_RETRY_DELAY_MS * BACKOFF_FACTOR ** attempt;\n if (!header) {\n return fallbackMs;\n }\n\n const seconds = Number(header);\n if (!Number.isNaN(seconds) && seconds >= 0) {\n return seconds * MS_PER_SECOND;\n }\n\n const dateMs = Date.parse(header);\n if (!Number.isNaN(dateMs)) {\n return Math.max(0, dateMs - Date.now());\n }\n\n return fallbackMs;\n}\n\n// eslint-disable-next-line complexity\nasync function throwFromResponse(response: Response): Promise<never> {\n const rawBody = await response.text();\n let parsed: ApiErrorBody | null;\n try {\n parsed = rawBody ? (JSON.parse(rawBody) as ApiErrorBody) : null;\n } catch {\n parsed = null;\n }\n\n const code = parsed?.error?.code ?? \"unknown_error\";\n const type = parsed?.error?.type ?? null;\n const message = parsed?.error?.message ?? `API error ${response.status}`;\n const rawParams = parsed?.error?.params;\n const params = rawParams ? (camelizeKeys(rawParams) as Record<string, unknown>) : null;\n\n throw new DimesApiError({ status: response.status, code, type, message, params });\n}\n\nexport interface HttpClientOptions {\n baseUrl: string;\n auth: AuthProvider;\n fetch?: typeof globalThis.fetch;\n maxRetries?: number;\n maxRetryDelayMs?: number;\n}\n\nexport class HttpClient {\n private readonly baseUrl: string;\n\n private readonly auth: AuthProvider;\n\n private readonly fetchFn: typeof globalThis.fetch;\n\n private readonly maxRetries: number;\n\n private readonly maxRetryDelayMs: number;\n\n constructor(options: HttpClientOptions) {\n this.baseUrl = options.baseUrl;\n this.auth = options.auth;\n this.fetchFn = options.fetch ?? globalThis.fetch.bind(globalThis);\n this.maxRetries = options.maxRetries ?? DEFAULT_MAX_RETRIES;\n this.maxRetryDelayMs = options.maxRetryDelayMs ?? DEFAULT_MAX_RETRY_DELAY_MS;\n }\n\n public async request<T>(path: string, options?: RequestInit): Promise<T> {\n const authHeaders = await this.auth.getHeaders();\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n ...authHeaders,\n ...(options?.headers as Record<string, string> | undefined),\n };\n\n let response = await this.fetchFn(`${this.baseUrl}${path}`, {\n ...options,\n headers,\n });\n\n if (response.status === HTTP_UNAUTHORIZED && this.auth.refresh) {\n await this.auth.refresh();\n const retryHeaders = await this.auth.getHeaders();\n response = await this.fetchFn(`${this.baseUrl}${path}`, {\n ...options,\n headers: { ...headers, ...retryHeaders },\n });\n }\n\n for (let attempt = 0; response.status === HTTP_TOO_MANY_REQUESTS && attempt < this.maxRetries; attempt++) {\n const delayMs = parseRetryAfterMs(response.headers.get(\"retry-after\"), attempt);\n if (delayMs > this.maxRetryDelayMs) {\n break;\n }\n await sleep(delayMs);\n const freshAuth = await this.auth.getHeaders();\n response = await this.fetchFn(`${this.baseUrl}${path}`, {\n ...options,\n headers: { ...headers, ...freshAuth },\n });\n }\n\n if (!response.ok) {\n await throwFromResponse(response);\n }\n\n return camelizeKeys(await response.json()) as T;\n }\n\n public async requestList<T>(path: string, options?: RequestInit): Promise<T[]> {\n const result = await this.request<{ data: T[] }>(path, options);\n return result.data;\n }\n}\n","import { DimesError } from \"../errors/dimes-error\";\n\nexport interface AuthProvider {\n getHeaders(): Promise<Record<string, string>>;\n refresh?(): Promise<void>;\n}\n\ninterface TokenResponse {\n token: string;\n expires_at: string;\n}\n\nexport interface ApiKeyAuthOptions {\n apiKey: string;\n walletAddress: string;\n baseUrl?: string;\n fetch?: typeof globalThis.fetch;\n}\n\nexport class ApiKeyAuth implements AuthProvider {\n private jwt: string | null = null;\n\n private expiresAt = 0;\n\n private refreshPromise: Promise<void> | null = null;\n\n private readonly apiKey: string;\n\n private readonly walletAddress: string;\n\n private readonly baseUrl: string;\n\n private readonly fetchFn: typeof globalThis.fetch;\n\n constructor(options: ApiKeyAuthOptions) {\n this.apiKey = options.apiKey;\n this.walletAddress = options.walletAddress;\n this.baseUrl = options.baseUrl ?? \"https://api.dimes.fi\";\n this.fetchFn = options.fetch ?? globalThis.fetch.bind(globalThis);\n }\n\n public async getHeaders(): Promise<Record<string, string>> {\n const TOKEN_EXPIRY_BUFFER_MS = 30_000;\n if (!this.jwt || Date.now() >= this.expiresAt - TOKEN_EXPIRY_BUFFER_MS) {\n await this.refresh();\n }\n return { Authorization: `Bearer ${this.jwt}` };\n }\n\n public async refresh(): Promise<void> {\n if (this.refreshPromise) {\n await this.refreshPromise;\n return;\n }\n\n this.refreshPromise = this.fetchToken();\n try {\n await this.refreshPromise;\n } finally {\n this.refreshPromise = null;\n }\n }\n\n private async fetchToken(): Promise<void> {\n const response = await this.fetchFn(`${this.baseUrl}/v1/prediction-markets/tokens`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${this.apiKey}`,\n },\n body: JSON.stringify({ wallet_address: this.walletAddress }),\n });\n\n if (!response.ok) {\n const text = await response.text();\n throw new DimesError(\"auth_token_failed\", `Failed to obtain auth token (${response.status}): ${text}`);\n }\n\n const data = (await response.json()) as TokenResponse;\n this.jwt = data.token;\n this.expiresAt = new Date(data.expires_at).getTime();\n }\n}\n\nexport interface JwtAuthOptions {\n tokenUrl: string;\n fetch?: typeof globalThis.fetch;\n}\n\nexport class JwtAuth implements AuthProvider {\n private readonly fetchFn: typeof globalThis.fetch;\n\n private readonly tokenUrl: string;\n\n private jwt: string | null = null;\n\n private expiresAt = 0;\n\n private refreshPromise: Promise<void> | null = null;\n\n constructor(options: JwtAuthOptions) {\n this.tokenUrl = options.tokenUrl;\n this.fetchFn = options.fetch ?? globalThis.fetch.bind(globalThis);\n }\n\n public async getHeaders(): Promise<Record<string, string>> {\n const TOKEN_EXPIRY_BUFFER_MS = 30_000;\n if (!this.jwt || Date.now() >= this.expiresAt - TOKEN_EXPIRY_BUFFER_MS) {\n await this.refresh();\n }\n return { Authorization: `Bearer ${this.jwt}` };\n }\n\n public async refresh(): Promise<void> {\n if (this.refreshPromise) {\n await this.refreshPromise;\n return;\n }\n\n this.refreshPromise = this.fetchToken();\n try {\n await this.refreshPromise;\n } finally {\n this.refreshPromise = null;\n }\n }\n\n private async fetchToken(): Promise<void> {\n const response = await this.fetchFn(this.tokenUrl);\n\n if (!response.ok) {\n const text = await response.text();\n throw new DimesError(\n \"auth_token_failed\",\n `Failed to fetch token from ${this.tokenUrl} (${response.status}): ${text}`,\n );\n }\n\n const data = (await response.json()) as TokenResponse;\n this.jwt = data.token;\n this.expiresAt = new Date(data.expires_at).getTime();\n }\n}\n","import type { CamelizeKeys } from \"./camelize\";\nimport type { components } from \"./generated\";\n\ntype Raw = components[\"schemas\"];\n\nexport type Market = CamelizeKeys<Raw[\"CustomerMarket\"]>;\n\nexport type MarketLeverage = CamelizeKeys<Raw[\"CustomerLeverage\"]>;\n\nexport type MarketMaxLeveragePerNotional = CamelizeKeys<Raw[\"CustomerMaxMarketLeveragePerNotional\"]>;\n\nexport type MarketSidedMaxLeveragePerNotional = CamelizeKeys<Raw[\"CustomerSidedMaxMarketLeveragePerNotional\"]>;\n\nexport type MarketSidedEligibility = CamelizeKeys<Raw[\"CustomerSidedEligibility\"]>;\n\nexport type MarketFees = CamelizeKeys<Raw[\"CustomerFees\"]>;\n\nexport type MarketPrices = CamelizeKeys<Raw[\"CustomerMarketPrices\"]>;\n\nexport type OriginationTier = CamelizeKeys<Raw[\"CustomerOriginationTier\"]>;\n\nexport type Offer = CamelizeKeys<Raw[\"CustomerOffer\"]>;\n\nexport type OpenPosition = CamelizeKeys<Raw[\"CustomerOpenPosition\"]>;\n\nexport type ClosedPosition = CamelizeKeys<Raw[\"CustomerClosedPosition\"]>;\n\nexport type Position = OpenPosition | ClosedPosition;\n\nexport type PositionEntry = CamelizeKeys<Raw[\"CustomerPositionEntry\"]>;\n\nexport type PositionCurrent = CamelizeKeys<Raw[\"CustomerPositionCurrent\"]>;\n\nexport type PositionRisk = CamelizeKeys<Raw[\"CustomerPositionRisk\"]>;\n\nexport type PositionOpenFees = CamelizeKeys<Raw[\"CustomerPositionOpenFees\"]>;\n\nexport type PositionClosedFees = CamelizeKeys<Raw[\"CustomerPositionClosedFees\"]>;\n\nexport type PositionResult = CamelizeKeys<Raw[\"CustomerPositionResult\"]>;\n\nexport type PositionTiming = CamelizeKeys<Raw[\"CustomerPositionTiming\"]>;\n\nexport type PositionFailure = CamelizeKeys<Raw[\"CustomerPositionFailure\"]>;\n\nexport type PositionUnwind = CamelizeKeys<Raw[\"CustomerPositionUnwind\"]>;\n\nexport type PositionUnwindList = CamelizeKeys<Raw[\"CustomerPositionUnwindList\"]>;\n\nexport type ContractInfo = CamelizeKeys<Raw[\"CustomerContractInfo\"]>;\n\nexport type CustomerLimit = CamelizeKeys<Raw[\"CustomerLimit\"]>;\n\nexport type CreateTokenResult = CamelizeKeys<Raw[\"CreateTokenResult\"]>;\n\nexport interface CreateOfferParams {\n marketTicker: string;\n effectiveSide: \"yes\" | \"no\";\n leverageBps: number;\n notionalAmountUsdPips: string;\n slippageBps: number;\n pmProvider?: \"polymarket\" | \"kalshi\";\n}\n\nexport function isOpenPosition(p: Position): p is OpenPosition {\n return \"current\" in p;\n}\n\nexport function isClosedPosition(p: Position): p is ClosedPosition {\n return \"result\" in p;\n}\n\nexport function leverageMaxBps(lev: MarketLeverage, side: \"yes\" | \"no\"): number {\n const perSide = side === \"yes\" ? lev.maxYesBps : lev.maxNoBps;\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n return perSide ?? lev.maxBps ?? lev.minBps;\n}\n","import type { Market } from \"../types/aliases\";\n\nexport type Side = \"yes\" | \"no\";\n\nexport interface SideEligibility {\n open: boolean;\n reasonCode: string | null;\n}\n\nexport interface SidedEligibility {\n yes: SideEligibility;\n no: SideEligibility;\n}\n\nexport function getSidedEligibility(market: Market): SidedEligibility {\n const sided = market.sidedEligibility;\n return {\n yes: {\n open: sided.yes.acceptingNewPositions,\n reasonCode: sided.yes.rejectionReasonCode ?? null,\n },\n no: {\n open: sided.no.acceptingNewPositions,\n reasonCode: sided.no.rejectionReasonCode ?? null,\n },\n };\n}\n\nexport function defaultSide(eligibility: SidedEligibility): Side | null {\n if (eligibility.yes.open && eligibility.no.open) {\n return \"yes\";\n }\n if (eligibility.yes.open) {\n return \"yes\";\n }\n if (eligibility.no.open) {\n return \"no\";\n }\n return null;\n}\n\nexport function isFullyOpen(eligibility: SidedEligibility): boolean {\n return eligibility.yes.open && eligibility.no.open;\n}\n\nexport function isFullyClosed(eligibility: SidedEligibility): boolean {\n return !eligibility.yes.open && !eligibility.no.open;\n}\n\nexport function rejectionReasonText(code: string | null | undefined): string {\n if (!code) {\n return \"Not eligible for new positions\";\n }\n const stripped = code\n .replace(/^quote_/i, \"\")\n .replaceAll(\"_\", \" \")\n .toLowerCase();\n return stripped.charAt(0).toUpperCase() + stripped.slice(1);\n}\n\nexport function rejectionReasonShort(code: string | null | undefined): string {\n if (!code) {\n return \"unavailable\";\n }\n const stripped = code\n .replace(/^quote_/i, \"\")\n .replace(/_exceeded$/i, \"\")\n .replace(/_too_(low|high)$/i, \"\")\n .replaceAll(\"_\", \" \")\n .toLowerCase();\n return stripped;\n}\n","import { type Market, type MarketMaxLeveragePerNotional, leverageMaxBps } from \"../types/aliases\";\nimport type { Side } from \"./eligibility\";\n\nconst USD_100 = 100;\nconst USD_500 = 500;\nconst USD_1K = 1_000;\nconst USD_10K = 10_000;\nconst BPS_PER_UNIT = 10_000;\n\nconst ANCHORS_USD = [USD_100, USD_500, USD_1K, USD_10K] as const;\n\ntype Anchor = readonly [usd: number, bps: number];\n\nfunction anchorsForSide(market: Market, side: Side): readonly Anchor[] {\n const sided = market.leverage.maxMarketLeveragePerNotional;\n const per: MarketMaxLeveragePerNotional = side === \"yes\" ? sided.yes : sided.no;\n return [\n [ANCHORS_USD[0], per.at100UsdBps],\n [ANCHORS_USD[1], per.at500UsdBps],\n [ANCHORS_USD[2], per.at1000UsdBps],\n [ANCHORS_USD[3], per.at10000UsdBps],\n ];\n}\n\nfunction snapDownToStep(bps: number, stepBps: number, minBps: number): number {\n if (stepBps <= 0) {\n return Math.max(minBps, bps);\n }\n const k = Math.floor((bps - minBps) / stepBps);\n return Math.max(minBps, minBps + Math.max(0, k) * stepBps);\n}\n\nfunction interpolateRawBps(anchors: readonly Anchor[], notionalUsd: number): number {\n const first = anchors[0];\n const last = anchors[anchors.length - 1];\n if (!first || !last) {\n return 0;\n }\n if (notionalUsd <= first[0]) {\n return first[1];\n }\n if (notionalUsd >= last[0]) {\n return last[1];\n }\n for (let i = 1; i < anchors.length; i++) {\n const hi = anchors[i];\n const lo = anchors[i - 1];\n if (!hi || !lo) {\n continue;\n }\n if (notionalUsd <= hi[0]) {\n const t = (notionalUsd - lo[0]) / (hi[0] - lo[0]);\n return lo[1] + (hi[1] - lo[1]) * t;\n }\n }\n return last[1];\n}\n\n/**\n * Maximum leverage in basis points the API will allow at a given notional, per side.\n * Piecewise-linear interpolation across the four anchor points ($100/$500/$1k/$10k).\n * Below $100 uses the $100 cap; above $10k uses the $10k cap. Result is clamped to\n * the absolute side max and rounded down to `stepBps`.\n */\nexport function maxLeverageBpsAtNotional(market: Market, side: Side, notionalUsd: number): number {\n const sideAbsMax = leverageMaxBps(market.leverage, side);\n if (!Number.isFinite(notionalUsd) || notionalUsd <= 0) {\n return sideAbsMax;\n }\n const anchors = anchorsForSide(market, side);\n const raw = interpolateRawBps(anchors, notionalUsd);\n const clamped = Math.min(sideAbsMax, raw);\n return snapDownToStep(clamped, market.leverage.stepBps, market.leverage.minBps);\n}\n\n/**\n * Largest leverage (bps) the user can pick for a given collateral such that the\n * resulting notional still satisfies the per-notional cap.\n *\n * Walks down from the absolute side max in `stepBps` increments and returns the\n * first leverage `lev` where `lev <= maxLeverageBpsAtNotional(collateral * lev / 1)`.\n */\nexport function maxViableLeverageBpsForCollateral(market: Market, side: Side, collateralUsd: number): number {\n const sideAbsMax = leverageMaxBps(market.leverage, side);\n if (!Number.isFinite(collateralUsd) || collateralUsd <= 0) {\n return sideAbsMax;\n }\n\n const step = Math.max(market.leverage.stepBps, 1);\n const minBps = market.leverage.minBps;\n const maxSteps = Math.max(0, Math.floor((sideAbsMax - minBps) / step));\n\n for (let i = maxSteps; i >= 0; i--) {\n const lev = minBps + i * step;\n const notionalUsd = collateralUsd * (lev / BPS_PER_UNIT);\n if (lev <= maxLeverageBpsAtNotional(market, side, notionalUsd)) {\n return lev;\n }\n }\n return minBps;\n}\n","import type { Position, PositionEntry } from \"../types/aliases\";\n\nexport interface OriginationFeeBreakdown {\n totalBps: number;\n totalUsd: number;\n protocolBps: number;\n protocolUsd: number;\n partnerBps: number;\n partnerUsd: number;\n}\n\nfunction getEntry(position: Position): PositionEntry {\n return position.entry;\n}\n\nexport function getOriginationFeeBreakdown(position: Position): OriginationFeeBreakdown {\n const entry = getEntry(position);\n const totalBps = entry.originationFeeBps;\n const totalUsd = Number(entry.originationFeeUsd) || 0;\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n const protocolBps = entry.protocolOriginationFeeBps ?? totalBps;\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n const partnerBps = entry.partnerOriginationFeeBps ?? 0;\n\n const share = totalBps > 0 ? protocolBps / totalBps : 1;\n const protocolUsd = totalUsd * share;\n const partnerUsd = totalUsd - protocolUsd;\n\n return {\n totalBps,\n totalUsd,\n protocolBps,\n protocolUsd,\n partnerBps,\n partnerUsd,\n };\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/client/dimes-client.ts","../src/client/http.ts","../src/client/auth.ts","../src/types/aliases.ts","../src/utils/eligibility.ts","../src/utils/leverage.ts","../src/utils/fees.ts"],"sourcesContent":["import { decamelizeKeys } from \"humps\";\nimport type {\n ContractInfo,\n CreateOfferParams,\n CustomerLimit,\n Market,\n Offer,\n Paginated,\n Position,\n PositionTransactions,\n} from \"../types\";\nimport type { AuthProvider } from \"./auth\";\nimport { HttpClient } from \"./http\";\n\nexport interface DimesClientOptions {\n baseUrl?: string;\n auth: AuthProvider;\n fetch?: typeof globalThis.fetch;\n maxRetries?: number;\n maxRetryDelayMs?: number;\n}\n\nexport interface GetMarketsParams {\n cursor?: string;\n limit?: number;\n category?: string;\n status?: string;\n provider?: \"polymarket\" | \"kalshi\";\n}\n\nexport interface GetPositionsParams {\n cursor?: string;\n limit?: number;\n status?: \"open\" | \"closed\";\n}\n\nfunction buildQueryFromEntries(entries: [string, unknown][]): string {\n const filtered = entries.filter(([, v]) => v !== undefined && v !== null);\n if (filtered.length === 0) {\n return \"\";\n }\n\n const search = new URLSearchParams();\n for (const [key, value] of filtered) {\n search.set(\n key.replace(/[A-Z]/g, (c) => `_${c.toLowerCase()}`),\n String(value),\n );\n }\n\n return `?${search.toString()}`;\n}\n\nexport class DimesClient {\n private readonly http: HttpClient;\n\n constructor(options: DimesClientOptions) {\n this.http = new HttpClient({\n baseUrl: options.baseUrl ?? \"https://api.dimes.fi\",\n auth: options.auth,\n fetch: options.fetch,\n maxRetries: options.maxRetries,\n maxRetryDelayMs: options.maxRetryDelayMs,\n });\n }\n\n public async getMarkets(params?: GetMarketsParams): Promise<Paginated<Market>> {\n const query = params ? buildQueryFromEntries(Object.entries(params)) : \"\";\n return this.http.request<Paginated<Market>>(`/v1/prediction-markets/markets${query}`);\n }\n\n public async getMarket(ticker: string): Promise<Market> {\n return this.http.request<Market>(`/v1/prediction-markets/markets/${encodeURIComponent(ticker)}`);\n }\n\n public async createDraftQuote(params: CreateOfferParams): Promise<Offer> {\n return this.http.request<Offer>(\"/v1/prediction-markets/draft-quotes\", {\n method: \"POST\",\n body: JSON.stringify(decamelizeKeys(params)),\n });\n }\n\n public async promoteDraftQuote(draftId: string): Promise<Offer> {\n return this.http.request<Offer>(`/v1/prediction-markets/promoted-quotes/${encodeURIComponent(draftId)}`, {\n method: \"POST\",\n });\n }\n\n public async createQuote(params: CreateOfferParams): Promise<Offer> {\n return this.http.request<Offer>(\"/v1/prediction-markets/quotes\", {\n method: \"POST\",\n body: JSON.stringify(decamelizeKeys(params)),\n });\n }\n\n public async getPositions(params?: GetPositionsParams): Promise<Position[]> {\n const query = params ? buildQueryFromEntries(Object.entries(params)) : \"\";\n return this.http.requestList<Position>(`/v1/prediction-markets/positions${query}`);\n }\n\n public async getPositionTransactions(positionId: string): Promise<PositionTransactions> {\n return this.http.request<PositionTransactions>(\n `/v1/prediction-markets/positions/${encodeURIComponent(positionId)}/transactions`,\n );\n }\n\n public async cancelPosition(positionId: string): Promise<void> {\n await this.http.request<unknown>(`/v1/prediction-markets/positions/${encodeURIComponent(positionId)}/cancel`, {\n method: \"POST\",\n });\n }\n\n public async getContractInfo(): Promise<ContractInfo> {\n return this.http.request<ContractInfo>(\"/v1/prediction-markets/contract-info\");\n }\n\n public async getLimits(): Promise<CustomerLimit> {\n return this.http.request<CustomerLimit>(\"/v1/prediction-markets/limits\");\n }\n}\n","import { camelizeKeys, type Camelized } from \"humps\";\nimport { DimesApiError } from \"../errors/dimes-error\";\nimport type { AuthProvider } from \"./auth\";\n\nexport type { Camelized };\n\ninterface ApiErrorBody {\n error?: {\n type?: string;\n code?: string;\n message: string;\n params?: Record<string, unknown>;\n };\n}\n\nconst HTTP_UNAUTHORIZED = 401;\nconst HTTP_TOO_MANY_REQUESTS = 429;\nconst DEFAULT_MAX_RETRIES = 3;\nconst DEFAULT_MAX_RETRY_DELAY_MS = 60_000;\nconst DEFAULT_RETRY_DELAY_MS = 1000;\nconst BACKOFF_FACTOR = 2;\nconst MS_PER_SECOND = 1000;\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nfunction parseRetryAfterMs(header: string | null, attempt: number): number {\n const fallbackMs = DEFAULT_RETRY_DELAY_MS * BACKOFF_FACTOR ** attempt;\n if (!header) {\n return fallbackMs;\n }\n\n const seconds = Number(header);\n if (!Number.isNaN(seconds) && seconds >= 0) {\n return seconds * MS_PER_SECOND;\n }\n\n const dateMs = Date.parse(header);\n if (!Number.isNaN(dateMs)) {\n return Math.max(0, dateMs - Date.now());\n }\n\n return fallbackMs;\n}\n\n// eslint-disable-next-line complexity\nasync function throwFromResponse(response: Response): Promise<never> {\n const rawBody = await response.text();\n let parsed: ApiErrorBody | null;\n try {\n parsed = rawBody ? (JSON.parse(rawBody) as ApiErrorBody) : null;\n } catch {\n parsed = null;\n }\n\n const code = parsed?.error?.code ?? \"unknown_error\";\n const type = parsed?.error?.type ?? null;\n const message = parsed?.error?.message ?? `API error ${response.status}`;\n const rawParams = parsed?.error?.params;\n const params = rawParams ? (camelizeKeys(rawParams) as Record<string, unknown>) : null;\n\n throw new DimesApiError({ status: response.status, code, type, message, params });\n}\n\nexport interface HttpClientOptions {\n baseUrl: string;\n auth: AuthProvider;\n fetch?: typeof globalThis.fetch;\n maxRetries?: number;\n maxRetryDelayMs?: number;\n}\n\nexport class HttpClient {\n private readonly baseUrl: string;\n\n private readonly auth: AuthProvider;\n\n private readonly fetchFn: typeof globalThis.fetch;\n\n private readonly maxRetries: number;\n\n private readonly maxRetryDelayMs: number;\n\n constructor(options: HttpClientOptions) {\n this.baseUrl = options.baseUrl;\n this.auth = options.auth;\n this.fetchFn = options.fetch ?? globalThis.fetch.bind(globalThis);\n this.maxRetries = options.maxRetries ?? DEFAULT_MAX_RETRIES;\n this.maxRetryDelayMs = options.maxRetryDelayMs ?? DEFAULT_MAX_RETRY_DELAY_MS;\n }\n\n public async request<T>(path: string, options?: RequestInit): Promise<T> {\n const authHeaders = await this.auth.getHeaders();\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n ...authHeaders,\n ...(options?.headers as Record<string, string> | undefined),\n };\n\n let response = await this.fetchFn(`${this.baseUrl}${path}`, {\n ...options,\n headers,\n });\n\n if (response.status === HTTP_UNAUTHORIZED && this.auth.refresh) {\n await this.auth.refresh();\n const retryHeaders = await this.auth.getHeaders();\n response = await this.fetchFn(`${this.baseUrl}${path}`, {\n ...options,\n headers: { ...headers, ...retryHeaders },\n });\n }\n\n for (let attempt = 0; response.status === HTTP_TOO_MANY_REQUESTS && attempt < this.maxRetries; attempt++) {\n const delayMs = parseRetryAfterMs(response.headers.get(\"retry-after\"), attempt);\n if (delayMs > this.maxRetryDelayMs) {\n break;\n }\n await sleep(delayMs);\n const freshAuth = await this.auth.getHeaders();\n response = await this.fetchFn(`${this.baseUrl}${path}`, {\n ...options,\n headers: { ...headers, ...freshAuth },\n });\n }\n\n if (!response.ok) {\n await throwFromResponse(response);\n }\n\n return camelizeKeys(await response.json()) as T;\n }\n\n public async requestList<T>(path: string, options?: RequestInit): Promise<T[]> {\n const result = await this.request<{ data: T[] }>(path, options);\n return result.data;\n }\n}\n","import { DimesError } from \"../errors/dimes-error\";\n\nexport interface AuthProvider {\n getHeaders(): Promise<Record<string, string>>;\n refresh?(): Promise<void>;\n}\n\ninterface TokenResponse {\n token: string;\n expires_at: string;\n}\n\nexport interface ApiKeyAuthOptions {\n apiKey: string;\n walletAddress: string;\n baseUrl?: string;\n fetch?: typeof globalThis.fetch;\n}\n\nexport class ApiKeyAuth implements AuthProvider {\n private jwt: string | null = null;\n\n private expiresAt = 0;\n\n private refreshPromise: Promise<void> | null = null;\n\n private readonly apiKey: string;\n\n private readonly walletAddress: string;\n\n private readonly baseUrl: string;\n\n private readonly fetchFn: typeof globalThis.fetch;\n\n constructor(options: ApiKeyAuthOptions) {\n this.apiKey = options.apiKey;\n this.walletAddress = options.walletAddress;\n this.baseUrl = options.baseUrl ?? \"https://api.dimes.fi\";\n this.fetchFn = options.fetch ?? globalThis.fetch.bind(globalThis);\n }\n\n public async getHeaders(): Promise<Record<string, string>> {\n const TOKEN_EXPIRY_BUFFER_MS = 30_000;\n if (!this.jwt || Date.now() >= this.expiresAt - TOKEN_EXPIRY_BUFFER_MS) {\n await this.refresh();\n }\n return { Authorization: `Bearer ${this.jwt}` };\n }\n\n public async refresh(): Promise<void> {\n if (this.refreshPromise) {\n await this.refreshPromise;\n return;\n }\n\n this.refreshPromise = this.fetchToken();\n try {\n await this.refreshPromise;\n } finally {\n this.refreshPromise = null;\n }\n }\n\n private async fetchToken(): Promise<void> {\n const response = await this.fetchFn(`${this.baseUrl}/v1/prediction-markets/tokens`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${this.apiKey}`,\n },\n body: JSON.stringify({ wallet_address: this.walletAddress }),\n });\n\n if (!response.ok) {\n const text = await response.text();\n throw new DimesError(\"auth_token_failed\", `Failed to obtain auth token (${response.status}): ${text}`);\n }\n\n const data = (await response.json()) as TokenResponse;\n this.jwt = data.token;\n this.expiresAt = new Date(data.expires_at).getTime();\n }\n}\n\nexport interface JwtAuthOptions {\n tokenUrl: string;\n fetch?: typeof globalThis.fetch;\n}\n\nexport class JwtAuth implements AuthProvider {\n private readonly fetchFn: typeof globalThis.fetch;\n\n private readonly tokenUrl: string;\n\n private jwt: string | null = null;\n\n private expiresAt = 0;\n\n private refreshPromise: Promise<void> | null = null;\n\n constructor(options: JwtAuthOptions) {\n this.tokenUrl = options.tokenUrl;\n this.fetchFn = options.fetch ?? globalThis.fetch.bind(globalThis);\n }\n\n public async getHeaders(): Promise<Record<string, string>> {\n const TOKEN_EXPIRY_BUFFER_MS = 30_000;\n if (!this.jwt || Date.now() >= this.expiresAt - TOKEN_EXPIRY_BUFFER_MS) {\n await this.refresh();\n }\n return { Authorization: `Bearer ${this.jwt}` };\n }\n\n public async refresh(): Promise<void> {\n if (this.refreshPromise) {\n await this.refreshPromise;\n return;\n }\n\n this.refreshPromise = this.fetchToken();\n try {\n await this.refreshPromise;\n } finally {\n this.refreshPromise = null;\n }\n }\n\n private async fetchToken(): Promise<void> {\n const response = await this.fetchFn(this.tokenUrl);\n\n if (!response.ok) {\n const text = await response.text();\n throw new DimesError(\n \"auth_token_failed\",\n `Failed to fetch token from ${this.tokenUrl} (${response.status}): ${text}`,\n );\n }\n\n const data = (await response.json()) as TokenResponse;\n this.jwt = data.token;\n this.expiresAt = new Date(data.expires_at).getTime();\n }\n}\n","import type { CamelizeKeys } from \"./camelize\";\nimport type { components } from \"./generated\";\n\ntype Raw = components[\"schemas\"];\n\nexport type Market = CamelizeKeys<Raw[\"CustomerMarket\"]>;\n\nexport type MarketLeverage = CamelizeKeys<Raw[\"CustomerLeverage\"]>;\n\nexport type MarketMaxLeveragePerNotional = CamelizeKeys<Raw[\"CustomerMaxMarketLeveragePerNotional\"]>;\n\nexport type MarketSidedMaxLeveragePerNotional = CamelizeKeys<Raw[\"CustomerSidedMaxMarketLeveragePerNotional\"]>;\n\nexport type MarketSidedEligibility = CamelizeKeys<Raw[\"CustomerSidedEligibility\"]>;\n\nexport type MarketFees = CamelizeKeys<Raw[\"CustomerFees\"]>;\n\nexport type MarketPrices = CamelizeKeys<Raw[\"CustomerMarketPrices\"]>;\n\nexport interface MarketPolymarket {\n conditionId: string | null;\n noTokenId: string;\n slug: string;\n yesTokenId: string;\n}\n\nexport type OriginationTier = CamelizeKeys<Raw[\"CustomerOriginationTier\"]>;\n\nexport type Offer = CamelizeKeys<Raw[\"CustomerOffer\"]>;\n\nexport type OpenPosition = CamelizeKeys<Raw[\"CustomerOpenPosition\"]>;\n\nexport type ClosedPosition = CamelizeKeys<Raw[\"CustomerClosedPosition\"]>;\n\nexport type Position = OpenPosition | ClosedPosition;\n\nexport type PositionEntry = CamelizeKeys<Raw[\"CustomerPositionEntry\"]>;\n\nexport type PositionCurrent = CamelizeKeys<Raw[\"CustomerPositionCurrent\"]>;\n\nexport type PositionRisk = CamelizeKeys<Raw[\"CustomerPositionRisk\"]>;\n\nexport type PositionOpenFees = CamelizeKeys<Raw[\"CustomerPositionOpenFees\"]>;\n\nexport type PositionClosedFees = CamelizeKeys<Raw[\"CustomerPositionClosedFees\"]>;\n\nexport type PositionResult = CamelizeKeys<Raw[\"CustomerPositionResult\"]>;\n\nexport type PositionTiming = CamelizeKeys<Raw[\"CustomerPositionTiming\"]>;\n\nexport type PositionFailure = CamelizeKeys<Raw[\"CustomerPositionFailure\"]>;\n\nexport type PositionUnwind = CamelizeKeys<Raw[\"CustomerPositionUnwind\"]>;\n\nexport type PositionUnwindList = CamelizeKeys<Raw[\"CustomerPositionUnwindList\"]>;\n\nexport type PositionTransactionEntry = CamelizeKeys<Raw[\"PositionTransactionEntry\"]>;\n\nexport type PositionTransactionGroup = CamelizeKeys<Raw[\"PositionTransactionGroup\"]>;\n\nexport type PositionTransactions = CamelizeKeys<Raw[\"PositionTransactions\"]>;\n\nexport type ContractInfo = CamelizeKeys<Raw[\"CustomerContractInfo\"]>;\n\nexport type CustomerLimit = CamelizeKeys<Raw[\"CustomerLimit\"]>;\n\nexport type CreateTokenResult = CamelizeKeys<Raw[\"CreateTokenResult\"]>;\n\nexport interface CreateOfferParams {\n marketTicker: string;\n effectiveSide: \"yes\" | \"no\";\n leverageBps: number;\n notionalAmountUsdPips: string;\n slippageBps: number;\n pmProvider?: \"polymarket\" | \"kalshi\";\n}\n\nexport function isOpenPosition(p: Position): p is OpenPosition {\n return \"current\" in p;\n}\n\nexport function isClosedPosition(p: Position): p is ClosedPosition {\n return \"result\" in p;\n}\n\nexport function leverageMaxBps(lev: MarketLeverage, side: \"yes\" | \"no\"): number {\n const perSide = side === \"yes\" ? lev.maxYesBps : lev.maxNoBps;\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n return perSide ?? lev.maxBps ?? lev.minBps;\n}\n","import type { Market } from \"../types/aliases\";\n\nexport type Side = \"yes\" | \"no\";\n\nexport interface SideEligibility {\n open: boolean;\n reasonCode: string | null;\n}\n\nexport interface SidedEligibility {\n yes: SideEligibility;\n no: SideEligibility;\n}\n\nexport function getSidedEligibility(market: Market): SidedEligibility {\n const sided = market.sidedEligibility;\n return {\n yes: {\n open: sided.yes.acceptingNewPositions,\n reasonCode: sided.yes.rejectionReasonCode ?? null,\n },\n no: {\n open: sided.no.acceptingNewPositions,\n reasonCode: sided.no.rejectionReasonCode ?? null,\n },\n };\n}\n\nexport function defaultSide(eligibility: SidedEligibility): Side | null {\n if (eligibility.yes.open && eligibility.no.open) {\n return \"yes\";\n }\n if (eligibility.yes.open) {\n return \"yes\";\n }\n if (eligibility.no.open) {\n return \"no\";\n }\n return null;\n}\n\nexport function isFullyOpen(eligibility: SidedEligibility): boolean {\n return eligibility.yes.open && eligibility.no.open;\n}\n\nexport function isFullyClosed(eligibility: SidedEligibility): boolean {\n return !eligibility.yes.open && !eligibility.no.open;\n}\n\nexport function rejectionReasonText(code: string | null | undefined): string {\n if (!code) {\n return \"Not eligible for new positions\";\n }\n const stripped = code\n .replace(/^quote_/i, \"\")\n .replaceAll(\"_\", \" \")\n .toLowerCase();\n return stripped.charAt(0).toUpperCase() + stripped.slice(1);\n}\n\nexport function rejectionReasonShort(code: string | null | undefined): string {\n if (!code) {\n return \"unavailable\";\n }\n const stripped = code\n .replace(/^quote_/i, \"\")\n .replace(/_exceeded$/i, \"\")\n .replace(/_too_(low|high)$/i, \"\")\n .replaceAll(\"_\", \" \")\n .toLowerCase();\n return stripped;\n}\n","import { type Market, type MarketMaxLeveragePerNotional, leverageMaxBps } from \"../types/aliases\";\nimport type { Side } from \"./eligibility\";\n\nconst USD_100 = 100;\nconst USD_500 = 500;\nconst USD_1K = 1_000;\nconst USD_10K = 10_000;\nconst BPS_PER_UNIT = 10_000;\n\nconst ANCHORS_USD = [USD_100, USD_500, USD_1K, USD_10K] as const;\n\ntype Anchor = readonly [usd: number, bps: number];\n\nfunction anchorsForSide(market: Market, side: Side): readonly Anchor[] {\n const sided = market.leverage.maxMarketLeveragePerNotional;\n const per: MarketMaxLeveragePerNotional = side === \"yes\" ? sided.yes : sided.no;\n return [\n [ANCHORS_USD[0], per.at100UsdBps],\n [ANCHORS_USD[1], per.at500UsdBps],\n [ANCHORS_USD[2], per.at1000UsdBps],\n [ANCHORS_USD[3], per.at10000UsdBps],\n ];\n}\n\nfunction snapDownToStep(bps: number, stepBps: number, minBps: number): number {\n if (stepBps <= 0) {\n return Math.max(minBps, bps);\n }\n const k = Math.floor((bps - minBps) / stepBps);\n return Math.max(minBps, minBps + Math.max(0, k) * stepBps);\n}\n\nfunction interpolateRawBps(anchors: readonly Anchor[], notionalUsd: number): number {\n const first = anchors[0];\n const last = anchors[anchors.length - 1];\n if (!first || !last) {\n return 0;\n }\n if (notionalUsd <= first[0]) {\n return first[1];\n }\n if (notionalUsd >= last[0]) {\n return last[1];\n }\n for (let i = 1; i < anchors.length; i++) {\n const hi = anchors[i];\n const lo = anchors[i - 1];\n if (!hi || !lo) {\n continue;\n }\n if (notionalUsd <= hi[0]) {\n const t = (notionalUsd - lo[0]) / (hi[0] - lo[0]);\n return lo[1] + (hi[1] - lo[1]) * t;\n }\n }\n return last[1];\n}\n\n/**\n * Maximum leverage in basis points the API will allow at a given notional, per side.\n * Piecewise-linear interpolation across the four anchor points ($100/$500/$1k/$10k).\n * Below $100 uses the $100 cap; above $10k uses the $10k cap. Result is clamped to\n * the absolute side max and rounded down to `stepBps`.\n */\nexport function maxLeverageBpsAtNotional(market: Market, side: Side, notionalUsd: number): number {\n const sideAbsMax = leverageMaxBps(market.leverage, side);\n if (!Number.isFinite(notionalUsd) || notionalUsd <= 0) {\n return sideAbsMax;\n }\n const anchors = anchorsForSide(market, side);\n const raw = interpolateRawBps(anchors, notionalUsd);\n const clamped = Math.min(sideAbsMax, raw);\n return snapDownToStep(clamped, market.leverage.stepBps, market.leverage.minBps);\n}\n\n/**\n * Largest leverage (bps) the user can pick for a given collateral such that the\n * resulting notional still satisfies the per-notional cap.\n *\n * Walks down from the absolute side max in `stepBps` increments and returns the\n * first leverage `lev` where `lev <= maxLeverageBpsAtNotional(collateral * lev / 1)`.\n */\nexport function maxViableLeverageBpsForCollateral(market: Market, side: Side, collateralUsd: number): number {\n const sideAbsMax = leverageMaxBps(market.leverage, side);\n if (!Number.isFinite(collateralUsd) || collateralUsd <= 0) {\n return sideAbsMax;\n }\n\n const step = Math.max(market.leverage.stepBps, 1);\n const minBps = market.leverage.minBps;\n const maxSteps = Math.max(0, Math.floor((sideAbsMax - minBps) / step));\n\n for (let i = maxSteps; i >= 0; i--) {\n const lev = minBps + i * step;\n const notionalUsd = collateralUsd * (lev / BPS_PER_UNIT);\n if (lev <= maxLeverageBpsAtNotional(market, side, notionalUsd)) {\n return lev;\n }\n }\n return minBps;\n}\n","import type { Position, PositionEntry } from \"../types/aliases\";\n\nexport interface OriginationFeeBreakdown {\n totalBps: number;\n totalUsd: number;\n protocolBps: number;\n protocolUsd: number;\n partnerBps: number;\n partnerUsd: number;\n}\n\nfunction getEntry(position: Position): PositionEntry {\n return position.entry;\n}\n\nexport function getOriginationFeeBreakdown(position: Position): OriginationFeeBreakdown {\n const entry = getEntry(position);\n const totalBps = entry.originationFeeBps;\n const totalUsd = Number(entry.originationFeeUsd) || 0;\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n const protocolBps = entry.protocolOriginationFeeBps ?? totalBps;\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n const partnerBps = entry.partnerOriginationFeeBps ?? 0;\n\n const share = totalBps > 0 ? protocolBps / totalBps : 1;\n const protocolUsd = totalUsd * share;\n const partnerUsd = totalUsd - protocolUsd;\n\n return {\n totalBps,\n totalUsd,\n protocolBps,\n protocolUsd,\n partnerBps,\n partnerUsd,\n };\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { H as HintAdjustment } from './dimes-client-
|
|
2
|
-
import { O as Offer } from './aliases-
|
|
1
|
+
import { H as HintAdjustment } from './dimes-client-DFAKtIeI.js';
|
|
2
|
+
import { O as Offer } from './aliases-BGqwpyE-.js';
|
|
3
3
|
|
|
4
4
|
type Side = "yes" | "no";
|
|
5
5
|
interface QuoteParams {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { H as HintAdjustment } from './dimes-client-
|
|
2
|
-
import { O as Offer } from './aliases-
|
|
1
|
+
import { H as HintAdjustment } from './dimes-client-C2hT6mZ8.cjs';
|
|
2
|
+
import { O as Offer } from './aliases-BGqwpyE-.cjs';
|
|
3
3
|
|
|
4
4
|
type Side = "yes" | "no";
|
|
5
5
|
interface QuoteParams {
|
package/dist/react/index.cjs
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var _chunkCOSLZ5TMcjs = require('../chunk-COSLZ5TM.cjs');
|
|
4
4
|
|
|
5
5
|
|
|
6
|
-
var
|
|
6
|
+
var _chunkDYPABUKCcjs = require('../chunk-DYPABUKC.cjs');
|
|
7
7
|
|
|
8
8
|
// src/react/provider.tsx
|
|
9
9
|
var _react = require('react');
|
|
@@ -15,7 +15,7 @@ function DimesProvider({ client, children }) {
|
|
|
15
15
|
function useDimesClient() {
|
|
16
16
|
const client = _react.useContext.call(void 0, DimesContext);
|
|
17
17
|
if (!client) {
|
|
18
|
-
throw new (0,
|
|
18
|
+
throw new (0, _chunkDYPABUKCcjs.DimesError)("missing_provider", "useDimesClient must be used within a <DimesProvider>");
|
|
19
19
|
}
|
|
20
20
|
return client;
|
|
21
21
|
}
|
|
@@ -59,7 +59,7 @@ function useQuote() {
|
|
|
59
59
|
async (params, options) => {
|
|
60
60
|
dispatch({ type: "loading" });
|
|
61
61
|
try {
|
|
62
|
-
const result = await
|
|
62
|
+
const result = await _chunkCOSLZ5TMcjs.executeQuote.call(void 0, client, params, {
|
|
63
63
|
...options,
|
|
64
64
|
onDraftReady: (draft) => {
|
|
65
65
|
dispatch({ type: "draftReady", draft });
|
package/dist/react/index.d.cts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
2
|
import { ReactNode } from 'react';
|
|
3
|
-
import { D as DimesClient, H as HintAdjustment, G as GetMarketsParams, P as Paginated, d as GetPositionsParams } from '../dimes-client-
|
|
4
|
-
import { O as Offer, M as Market, P as Position, c as ContractInfo, e as CustomerLimit } from '../aliases-
|
|
5
|
-
import { Q as QuoteParams, a as QuoteOptions, b as QuoteResult } from '../quote-
|
|
3
|
+
import { D as DimesClient, H as HintAdjustment, G as GetMarketsParams, P as Paginated, d as GetPositionsParams } from '../dimes-client-C2hT6mZ8.cjs';
|
|
4
|
+
import { O as Offer, M as Market, P as Position, c as ContractInfo, e as CustomerLimit } from '../aliases-BGqwpyE-.cjs';
|
|
5
|
+
import { Q as QuoteParams, a as QuoteOptions, b as QuoteResult } from '../quote-BcVJ0U0l.cjs';
|
|
6
6
|
import { UseQueryOptions, UseQueryResult, UseMutationOptions, UseMutationResult } from '@tanstack/react-query';
|
|
7
7
|
|
|
8
8
|
interface DimesProviderProps {
|
package/dist/react/index.d.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
2
|
import { ReactNode } from 'react';
|
|
3
|
-
import { D as DimesClient, H as HintAdjustment, G as GetMarketsParams, P as Paginated, d as GetPositionsParams } from '../dimes-client-
|
|
4
|
-
import { O as Offer, M as Market, P as Position, c as ContractInfo, e as CustomerLimit } from '../aliases-
|
|
5
|
-
import { Q as QuoteParams, a as QuoteOptions, b as QuoteResult } from '../quote-
|
|
3
|
+
import { D as DimesClient, H as HintAdjustment, G as GetMarketsParams, P as Paginated, d as GetPositionsParams } from '../dimes-client-DFAKtIeI.js';
|
|
4
|
+
import { O as Offer, M as Market, P as Position, c as ContractInfo, e as CustomerLimit } from '../aliases-BGqwpyE-.js';
|
|
5
|
+
import { Q as QuoteParams, a as QuoteOptions, b as QuoteResult } from '../quote-BVMZb0T8.js';
|
|
6
6
|
import { UseQueryOptions, UseQueryResult, UseMutationOptions, UseMutationResult } from '@tanstack/react-query';
|
|
7
7
|
|
|
8
8
|
interface DimesProviderProps {
|
package/dist/react/index.mjs
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import {
|
|
2
2
|
executeQuote
|
|
3
|
-
} from "../chunk-
|
|
3
|
+
} from "../chunk-SGA6OZEU.mjs";
|
|
4
4
|
import {
|
|
5
5
|
DimesError
|
|
6
|
-
} from "../chunk-
|
|
6
|
+
} from "../chunk-BVILILIV.mjs";
|
|
7
7
|
|
|
8
8
|
// src/react/provider.tsx
|
|
9
9
|
import { createContext, useContext } from "react";
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { P as Position } from './aliases-
|
|
1
|
+
import { P as Position, M as Market, B as MarketPolymarket, g as MarketLeverage } from './aliases-BGqwpyE-.cjs';
|
|
2
2
|
|
|
3
3
|
declare const positionEventTypes: readonly ["position.cancelled", "position.close_requested", "position.closed", "position.created", "position.force_unwound", "position.liquidated", "position.opened", "position.opening", "position.reverted", "position.settled"];
|
|
4
4
|
type PositionEventType = (typeof positionEventTypes)[number];
|
|
@@ -14,6 +14,24 @@ interface PositionEvent {
|
|
|
14
14
|
createdAt: string;
|
|
15
15
|
data: Position;
|
|
16
16
|
}
|
|
17
|
+
declare const marketEventTypes: readonly ["market.discovered", "market.eligibility_changed", "market.max_leverage_changed"];
|
|
18
|
+
type MarketEventType = (typeof marketEventTypes)[number];
|
|
19
|
+
type MarketDelta = Pick<Market, "id"> & {
|
|
20
|
+
polymarket: MarketPolymarket;
|
|
21
|
+
leverage?: MarketLeverage;
|
|
22
|
+
} & Partial<Omit<Market, "id" | "leverage">>;
|
|
23
|
+
interface MarketEventEnvelope {
|
|
24
|
+
id: string;
|
|
25
|
+
type: MarketEventType;
|
|
26
|
+
created_at: string;
|
|
27
|
+
data: Record<string, unknown>[];
|
|
28
|
+
}
|
|
29
|
+
interface MarketEvent {
|
|
30
|
+
id: string;
|
|
31
|
+
type: MarketEventType;
|
|
32
|
+
createdAt: string;
|
|
33
|
+
data: Market[] | MarketDelta[];
|
|
34
|
+
}
|
|
17
35
|
interface NotificationEventEnvelope {
|
|
18
36
|
id: string;
|
|
19
37
|
type: "notification";
|
|
@@ -39,4 +57,4 @@ declare const notificationCodes: {
|
|
|
39
57
|
};
|
|
40
58
|
type NotificationCode = (typeof notificationCodes)[keyof typeof notificationCodes];
|
|
41
59
|
|
|
42
|
-
export { type NotificationEvent as N, type PositionEvent as P, type PositionEventType as a, type
|
|
60
|
+
export { type MarketEventType as M, type NotificationEvent as N, type PositionEvent as P, type PositionEventType as a, type MarketEvent as b, type MarketDelta as c, type MarketEventEnvelope as d, type NotificationCode as e, type NotificationEventEnvelope as f, type PositionEventEnvelope as g, marketEventTypes as m, notificationCodes as n, positionEventTypes as p };
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { P as Position } from './aliases-
|
|
1
|
+
import { P as Position, M as Market, B as MarketPolymarket, g as MarketLeverage } from './aliases-BGqwpyE-.js';
|
|
2
2
|
|
|
3
3
|
declare const positionEventTypes: readonly ["position.cancelled", "position.close_requested", "position.closed", "position.created", "position.force_unwound", "position.liquidated", "position.opened", "position.opening", "position.reverted", "position.settled"];
|
|
4
4
|
type PositionEventType = (typeof positionEventTypes)[number];
|
|
@@ -14,6 +14,24 @@ interface PositionEvent {
|
|
|
14
14
|
createdAt: string;
|
|
15
15
|
data: Position;
|
|
16
16
|
}
|
|
17
|
+
declare const marketEventTypes: readonly ["market.discovered", "market.eligibility_changed", "market.max_leverage_changed"];
|
|
18
|
+
type MarketEventType = (typeof marketEventTypes)[number];
|
|
19
|
+
type MarketDelta = Pick<Market, "id"> & {
|
|
20
|
+
polymarket: MarketPolymarket;
|
|
21
|
+
leverage?: MarketLeverage;
|
|
22
|
+
} & Partial<Omit<Market, "id" | "leverage">>;
|
|
23
|
+
interface MarketEventEnvelope {
|
|
24
|
+
id: string;
|
|
25
|
+
type: MarketEventType;
|
|
26
|
+
created_at: string;
|
|
27
|
+
data: Record<string, unknown>[];
|
|
28
|
+
}
|
|
29
|
+
interface MarketEvent {
|
|
30
|
+
id: string;
|
|
31
|
+
type: MarketEventType;
|
|
32
|
+
createdAt: string;
|
|
33
|
+
data: Market[] | MarketDelta[];
|
|
34
|
+
}
|
|
17
35
|
interface NotificationEventEnvelope {
|
|
18
36
|
id: string;
|
|
19
37
|
type: "notification";
|
|
@@ -39,4 +57,4 @@ declare const notificationCodes: {
|
|
|
39
57
|
};
|
|
40
58
|
type NotificationCode = (typeof notificationCodes)[keyof typeof notificationCodes];
|
|
41
59
|
|
|
42
|
-
export { type NotificationEvent as N, type PositionEvent as P, type PositionEventType as a, type
|
|
60
|
+
export { type MarketEventType as M, type NotificationEvent as N, type PositionEvent as P, type PositionEventType as a, type MarketEvent as b, type MarketDelta as c, type MarketEventEnvelope as d, type NotificationCode as e, type NotificationEventEnvelope as f, type PositionEventEnvelope as g, marketEventTypes as m, notificationCodes as n, positionEventTypes as p };
|
package/dist/ws/index.cjs
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; } var _class;
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; } var _class; var _class2;
|
|
2
2
|
|
|
3
3
|
|
|
4
|
-
|
|
4
|
+
|
|
5
|
+
var _chunkUHQZSMUDcjs = require('../chunk-UHQZSMUD.cjs');
|
|
5
6
|
|
|
6
7
|
// src/ws/position-socket.ts
|
|
7
8
|
var _humps = require('humps');
|
|
@@ -63,7 +64,7 @@ var PositionSocket = (_class = class {
|
|
|
63
64
|
cb(err);
|
|
64
65
|
}
|
|
65
66
|
});
|
|
66
|
-
for (const eventType of
|
|
67
|
+
for (const eventType of _chunkUHQZSMUDcjs.positionEventTypes) {
|
|
67
68
|
this.socket.on(eventType, (envelope) => {
|
|
68
69
|
const event = camelizeEnvelope(envelope);
|
|
69
70
|
this.emit(eventType, event);
|
|
@@ -126,8 +127,117 @@ var PositionSocket = (_class = class {
|
|
|
126
127
|
}
|
|
127
128
|
}, _class);
|
|
128
129
|
|
|
130
|
+
// src/ws/market-socket.ts
|
|
131
|
+
|
|
132
|
+
|
|
133
|
+
var wsNamespace2 = "/v1/ws/prediction-markets/customer-markets";
|
|
134
|
+
function camelizeEnvelope2(envelope) {
|
|
135
|
+
return {
|
|
136
|
+
id: envelope.id,
|
|
137
|
+
type: envelope.type,
|
|
138
|
+
createdAt: envelope.created_at,
|
|
139
|
+
data: envelope.data.map((item) => _humps.camelizeKeys.call(void 0, item))
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
var MarketSocket = (_class2 = class {
|
|
143
|
+
__init7() {this.socket = null}
|
|
144
|
+
|
|
145
|
+
|
|
146
|
+
__init8() {this.eventListeners = /* @__PURE__ */ new Map()}
|
|
147
|
+
__init9() {this.connectListeners = /* @__PURE__ */ new Set()}
|
|
148
|
+
__init10() {this.disconnectListeners = /* @__PURE__ */ new Set()}
|
|
149
|
+
__init11() {this.errorListeners = /* @__PURE__ */ new Set()}
|
|
150
|
+
constructor(options) {;_class2.prototype.__init7.call(this);_class2.prototype.__init8.call(this);_class2.prototype.__init9.call(this);_class2.prototype.__init10.call(this);_class2.prototype.__init11.call(this);
|
|
151
|
+
this.baseUrl = _nullishCoalesce(options.baseUrl, () => ( "https://api.dimes.fi"));
|
|
152
|
+
this.getToken = options.getToken;
|
|
153
|
+
}
|
|
154
|
+
get connected() {
|
|
155
|
+
return _nullishCoalesce(_optionalChain([this, 'access', _11 => _11.socket, 'optionalAccess', _12 => _12.connected]), () => ( false));
|
|
156
|
+
}
|
|
157
|
+
connect() {
|
|
158
|
+
if (_optionalChain([this, 'access', _13 => _13.socket, 'optionalAccess', _14 => _14.connected])) {
|
|
159
|
+
return;
|
|
160
|
+
}
|
|
161
|
+
_optionalChain([this, 'access', _15 => _15.socket, 'optionalAccess', _16 => _16.disconnect, 'call', _17 => _17()]);
|
|
162
|
+
const token = this.getToken();
|
|
163
|
+
if (!token) {
|
|
164
|
+
return;
|
|
165
|
+
}
|
|
166
|
+
const getToken = this.getToken;
|
|
167
|
+
this.socket = _socketioclient.io.call(void 0, `${this.baseUrl}${wsNamespace2}`, {
|
|
168
|
+
auth: (cb) => cb({ token: getToken() }),
|
|
169
|
+
transports: ["websocket"],
|
|
170
|
+
reconnection: true,
|
|
171
|
+
reconnectionDelay: 1e3,
|
|
172
|
+
reconnectionDelayMax: 3e4
|
|
173
|
+
});
|
|
174
|
+
this.socket.on("connect", () => {
|
|
175
|
+
for (const cb of this.connectListeners) {
|
|
176
|
+
cb();
|
|
177
|
+
}
|
|
178
|
+
});
|
|
179
|
+
this.socket.on("disconnect", () => {
|
|
180
|
+
for (const cb of this.disconnectListeners) {
|
|
181
|
+
cb();
|
|
182
|
+
}
|
|
183
|
+
});
|
|
184
|
+
this.socket.on("error", (err) => {
|
|
185
|
+
for (const cb of this.errorListeners) {
|
|
186
|
+
cb(err);
|
|
187
|
+
}
|
|
188
|
+
});
|
|
189
|
+
for (const eventType of _chunkUHQZSMUDcjs.marketEventTypes) {
|
|
190
|
+
this.socket.on(eventType, (envelope) => {
|
|
191
|
+
const event = camelizeEnvelope2(envelope);
|
|
192
|
+
this.emit(eventType, event);
|
|
193
|
+
this.emit("*", event);
|
|
194
|
+
});
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
disconnect() {
|
|
198
|
+
_optionalChain([this, 'access', _18 => _18.socket, 'optionalAccess', _19 => _19.disconnect, 'call', _20 => _20()]);
|
|
199
|
+
this.socket = null;
|
|
200
|
+
}
|
|
201
|
+
reconnectWithToken() {
|
|
202
|
+
this.disconnect();
|
|
203
|
+
this.connect();
|
|
204
|
+
}
|
|
205
|
+
on(event, cb) {
|
|
206
|
+
let set = this.eventListeners.get(event);
|
|
207
|
+
if (!set) {
|
|
208
|
+
set = /* @__PURE__ */ new Set();
|
|
209
|
+
this.eventListeners.set(event, set);
|
|
210
|
+
}
|
|
211
|
+
set.add(cb);
|
|
212
|
+
return () => set.delete(cb);
|
|
213
|
+
}
|
|
214
|
+
onConnect(cb) {
|
|
215
|
+
this.connectListeners.add(cb);
|
|
216
|
+
return () => this.connectListeners.delete(cb);
|
|
217
|
+
}
|
|
218
|
+
onDisconnect(cb) {
|
|
219
|
+
this.disconnectListeners.add(cb);
|
|
220
|
+
return () => this.disconnectListeners.delete(cb);
|
|
221
|
+
}
|
|
222
|
+
onError(cb) {
|
|
223
|
+
this.errorListeners.add(cb);
|
|
224
|
+
return () => this.errorListeners.delete(cb);
|
|
225
|
+
}
|
|
226
|
+
emit(event, data) {
|
|
227
|
+
const set = this.eventListeners.get(event);
|
|
228
|
+
if (!set) {
|
|
229
|
+
return;
|
|
230
|
+
}
|
|
231
|
+
for (const cb of set) {
|
|
232
|
+
cb(data);
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
}, _class2);
|
|
236
|
+
|
|
237
|
+
|
|
238
|
+
|
|
129
239
|
|
|
130
240
|
|
|
131
241
|
|
|
132
|
-
exports.PositionSocket = PositionSocket; exports.notificationCodes =
|
|
242
|
+
exports.MarketSocket = MarketSocket; exports.PositionSocket = PositionSocket; exports.marketEventTypes = _chunkUHQZSMUDcjs.marketEventTypes; exports.notificationCodes = _chunkUHQZSMUDcjs.notificationCodes; exports.positionEventTypes = _chunkUHQZSMUDcjs.positionEventTypes;
|
|
133
243
|
//# sourceMappingURL=index.cjs.map
|
package/dist/ws/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/alexemery/bl/dimes-sdk/dist/ws/index.cjs","../../src/ws/position-socket.ts"],"names":[],"mappings":"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","file":"/Users/alexemery/bl/dimes-sdk/dist/ws/index.cjs","sourcesContent":[null,"import { camelizeKeys } from \"humps\";\nimport { io, type Socket } from \"socket.io-client\";\nimport type { Position } from \"../types\";\nimport {\n positionEventTypes,\n type NotificationEvent,\n type NotificationEventEnvelope,\n type PositionEvent,\n type PositionEventEnvelope,\n type PositionEventType,\n} from \"./types\";\n\nexport interface PositionSocketOptions {\n baseUrl?: string;\n getToken: () => string | null;\n}\n\ntype EventCallback = (event: PositionEvent) => void;\ntype NotificationCallback = (event: NotificationEvent) => void;\ntype ConnectionCallback = () => void;\ntype ErrorCallback = (error: unknown) => void;\n\nconst wsNamespace = \"/v1/ws/prediction-markets/customer-positions\";\n\nfunction camelizeEnvelope(envelope: PositionEventEnvelope): PositionEvent {\n return {\n id: envelope.id,\n type: envelope.type,\n createdAt: envelope.created_at,\n data: camelizeKeys(envelope.data) as unknown as Position,\n };\n}\n\nexport class PositionSocket {\n private socket: Socket | null = null;\n\n private readonly baseUrl: string;\n\n private readonly getToken: () => string | null;\n\n private readonly eventListeners = new Map<string, Set<EventCallback>>();\n\n private readonly connectListeners = new Set<ConnectionCallback>();\n\n private readonly disconnectListeners = new Set<ConnectionCallback>();\n\n private readonly errorListeners = new Set<ErrorCallback>();\n\n private readonly notificationListeners = new Set<NotificationCallback>();\n\n constructor(options: PositionSocketOptions) {\n this.baseUrl = options.baseUrl ?? \"https://api.dimes.fi\";\n this.getToken = options.getToken;\n }\n\n public get connected(): boolean {\n return this.socket?.connected ?? false;\n }\n\n public connect(): void {\n if (this.socket?.connected) {\n return;\n }\n\n this.socket?.disconnect();\n\n const token = this.getToken();\n if (!token) {\n return;\n }\n\n const getToken = this.getToken;\n this.socket = io(`${this.baseUrl}${wsNamespace}`, {\n auth: (cb) => cb({ token: getToken() }),\n transports: [\"websocket\"],\n reconnection: true,\n reconnectionDelay: 1000,\n reconnectionDelayMax: 30000,\n });\n\n this.socket.on(\"connect\", () => {\n for (const cb of this.connectListeners) {\n cb();\n }\n });\n\n this.socket.on(\"disconnect\", () => {\n for (const cb of this.disconnectListeners) {\n cb();\n }\n });\n\n this.socket.on(\"error\", (err: unknown) => {\n for (const cb of this.errorListeners) {\n cb(err);\n }\n });\n\n for (const eventType of positionEventTypes) {\n this.socket.on(eventType, (envelope: PositionEventEnvelope) => {\n const event = camelizeEnvelope(envelope);\n this.emit(eventType, event);\n this.emit(\"*\", event);\n });\n }\n\n this.socket.on(\"notification\", (envelope: NotificationEventEnvelope) => {\n const event: NotificationEvent = {\n id: envelope.id,\n type: \"notification\",\n createdAt: envelope.created_at,\n data: envelope.data,\n };\n for (const cb of this.notificationListeners) {\n cb(event);\n }\n });\n }\n\n public disconnect(): void {\n this.socket?.disconnect();\n this.socket = null;\n }\n\n public reconnectWithToken(): void {\n this.disconnect();\n this.connect();\n }\n\n public on(event: PositionEventType | \"*\", cb: EventCallback): () => void {\n let set = this.eventListeners.get(event);\n if (!set) {\n set = new Set();\n this.eventListeners.set(event, set);\n }\n set.add(cb);\n return () => set.delete(cb);\n }\n\n public onConnect(cb: ConnectionCallback): () => void {\n this.connectListeners.add(cb);\n return () => this.connectListeners.delete(cb);\n }\n\n public onDisconnect(cb: ConnectionCallback): () => void {\n this.disconnectListeners.add(cb);\n return () => this.disconnectListeners.delete(cb);\n }\n\n public onError(cb: ErrorCallback): () => void {\n this.errorListeners.add(cb);\n return () => this.errorListeners.delete(cb);\n }\n\n public onNotification(cb: NotificationCallback): () => void {\n this.notificationListeners.add(cb);\n return () => this.notificationListeners.delete(cb);\n }\n\n private emit(event: string, data: PositionEvent): void {\n const set = this.eventListeners.get(event);\n if (!set) {\n return;\n }\n for (const cb of set) {\n cb(data);\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["/Users/alexemery/bl/dimes-sdk/dist/ws/index.cjs","../../src/ws/position-socket.ts","../../src/ws/market-socket.ts"],"names":["io","camelizeEnvelope"],"mappings":"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","file":"/Users/alexemery/bl/dimes-sdk/dist/ws/index.cjs","sourcesContent":[null,"import { camelizeKeys } from \"humps\";\nimport { io, type Socket } from \"socket.io-client\";\nimport type { Position } from \"../types\";\nimport {\n positionEventTypes,\n type NotificationEvent,\n type NotificationEventEnvelope,\n type PositionEvent,\n type PositionEventEnvelope,\n type PositionEventType,\n} from \"./types\";\n\nexport interface PositionSocketOptions {\n baseUrl?: string;\n getToken: () => string | null;\n}\n\ntype EventCallback = (event: PositionEvent) => void;\ntype NotificationCallback = (event: NotificationEvent) => void;\ntype ConnectionCallback = () => void;\ntype ErrorCallback = (error: unknown) => void;\n\nconst wsNamespace = \"/v1/ws/prediction-markets/customer-positions\";\n\nfunction camelizeEnvelope(envelope: PositionEventEnvelope): PositionEvent {\n return {\n id: envelope.id,\n type: envelope.type,\n createdAt: envelope.created_at,\n data: camelizeKeys(envelope.data) as unknown as Position,\n };\n}\n\nexport class PositionSocket {\n private socket: Socket | null = null;\n\n private readonly baseUrl: string;\n\n private readonly getToken: () => string | null;\n\n private readonly eventListeners = new Map<string, Set<EventCallback>>();\n\n private readonly connectListeners = new Set<ConnectionCallback>();\n\n private readonly disconnectListeners = new Set<ConnectionCallback>();\n\n private readonly errorListeners = new Set<ErrorCallback>();\n\n private readonly notificationListeners = new Set<NotificationCallback>();\n\n constructor(options: PositionSocketOptions) {\n this.baseUrl = options.baseUrl ?? \"https://api.dimes.fi\";\n this.getToken = options.getToken;\n }\n\n public get connected(): boolean {\n return this.socket?.connected ?? false;\n }\n\n public connect(): void {\n if (this.socket?.connected) {\n return;\n }\n\n this.socket?.disconnect();\n\n const token = this.getToken();\n if (!token) {\n return;\n }\n\n const getToken = this.getToken;\n this.socket = io(`${this.baseUrl}${wsNamespace}`, {\n auth: (cb) => cb({ token: getToken() }),\n transports: [\"websocket\"],\n reconnection: true,\n reconnectionDelay: 1000,\n reconnectionDelayMax: 30000,\n });\n\n this.socket.on(\"connect\", () => {\n for (const cb of this.connectListeners) {\n cb();\n }\n });\n\n this.socket.on(\"disconnect\", () => {\n for (const cb of this.disconnectListeners) {\n cb();\n }\n });\n\n this.socket.on(\"error\", (err: unknown) => {\n for (const cb of this.errorListeners) {\n cb(err);\n }\n });\n\n for (const eventType of positionEventTypes) {\n this.socket.on(eventType, (envelope: PositionEventEnvelope) => {\n const event = camelizeEnvelope(envelope);\n this.emit(eventType, event);\n this.emit(\"*\", event);\n });\n }\n\n this.socket.on(\"notification\", (envelope: NotificationEventEnvelope) => {\n const event: NotificationEvent = {\n id: envelope.id,\n type: \"notification\",\n createdAt: envelope.created_at,\n data: envelope.data,\n };\n for (const cb of this.notificationListeners) {\n cb(event);\n }\n });\n }\n\n public disconnect(): void {\n this.socket?.disconnect();\n this.socket = null;\n }\n\n public reconnectWithToken(): void {\n this.disconnect();\n this.connect();\n }\n\n public on(event: PositionEventType | \"*\", cb: EventCallback): () => void {\n let set = this.eventListeners.get(event);\n if (!set) {\n set = new Set();\n this.eventListeners.set(event, set);\n }\n set.add(cb);\n return () => set.delete(cb);\n }\n\n public onConnect(cb: ConnectionCallback): () => void {\n this.connectListeners.add(cb);\n return () => this.connectListeners.delete(cb);\n }\n\n public onDisconnect(cb: ConnectionCallback): () => void {\n this.disconnectListeners.add(cb);\n return () => this.disconnectListeners.delete(cb);\n }\n\n public onError(cb: ErrorCallback): () => void {\n this.errorListeners.add(cb);\n return () => this.errorListeners.delete(cb);\n }\n\n public onNotification(cb: NotificationCallback): () => void {\n this.notificationListeners.add(cb);\n return () => this.notificationListeners.delete(cb);\n }\n\n private emit(event: string, data: PositionEvent): void {\n const set = this.eventListeners.get(event);\n if (!set) {\n return;\n }\n for (const cb of set) {\n cb(data);\n }\n }\n}\n","import { camelizeKeys } from \"humps\";\nimport { io, type Socket } from \"socket.io-client\";\nimport type { Market } from \"../types\";\nimport {\n marketEventTypes,\n type MarketDelta,\n type MarketEvent,\n type MarketEventEnvelope,\n type MarketEventType,\n} from \"./types\";\n\nexport interface MarketSocketOptions {\n baseUrl?: string;\n getToken: () => string | null;\n}\n\ntype EventCallback = (event: MarketEvent) => void;\ntype ConnectionCallback = () => void;\ntype ErrorCallback = (error: unknown) => void;\n\nconst wsNamespace = \"/v1/ws/prediction-markets/customer-markets\";\n\nfunction camelizeEnvelope(envelope: MarketEventEnvelope): MarketEvent {\n return {\n id: envelope.id,\n type: envelope.type,\n createdAt: envelope.created_at,\n data: envelope.data.map((item) => camelizeKeys(item)) as unknown as Market[] | MarketDelta[],\n };\n}\n\nexport class MarketSocket {\n private socket: Socket | null = null;\n\n private readonly baseUrl: string;\n\n private readonly getToken: () => string | null;\n\n private readonly eventListeners = new Map<string, Set<EventCallback>>();\n\n private readonly connectListeners = new Set<ConnectionCallback>();\n\n private readonly disconnectListeners = new Set<ConnectionCallback>();\n\n private readonly errorListeners = new Set<ErrorCallback>();\n\n constructor(options: MarketSocketOptions) {\n this.baseUrl = options.baseUrl ?? \"https://api.dimes.fi\";\n this.getToken = options.getToken;\n }\n\n public get connected(): boolean {\n return this.socket?.connected ?? false;\n }\n\n public connect(): void {\n if (this.socket?.connected) {\n return;\n }\n\n this.socket?.disconnect();\n\n const token = this.getToken();\n if (!token) {\n return;\n }\n\n const getToken = this.getToken;\n this.socket = io(`${this.baseUrl}${wsNamespace}`, {\n auth: (cb) => cb({ token: getToken() }),\n transports: [\"websocket\"],\n reconnection: true,\n reconnectionDelay: 1000,\n reconnectionDelayMax: 30000,\n });\n\n this.socket.on(\"connect\", () => {\n for (const cb of this.connectListeners) {\n cb();\n }\n });\n\n this.socket.on(\"disconnect\", () => {\n for (const cb of this.disconnectListeners) {\n cb();\n }\n });\n\n this.socket.on(\"error\", (err: unknown) => {\n for (const cb of this.errorListeners) {\n cb(err);\n }\n });\n\n for (const eventType of marketEventTypes) {\n this.socket.on(eventType, (envelope: MarketEventEnvelope) => {\n const event = camelizeEnvelope(envelope);\n this.emit(eventType, event);\n this.emit(\"*\", event);\n });\n }\n }\n\n public disconnect(): void {\n this.socket?.disconnect();\n this.socket = null;\n }\n\n public reconnectWithToken(): void {\n this.disconnect();\n this.connect();\n }\n\n public on(event: MarketEventType | \"*\", cb: EventCallback): () => void {\n let set = this.eventListeners.get(event);\n if (!set) {\n set = new Set();\n this.eventListeners.set(event, set);\n }\n set.add(cb);\n return () => set.delete(cb);\n }\n\n public onConnect(cb: ConnectionCallback): () => void {\n this.connectListeners.add(cb);\n return () => this.connectListeners.delete(cb);\n }\n\n public onDisconnect(cb: ConnectionCallback): () => void {\n this.disconnectListeners.add(cb);\n return () => this.disconnectListeners.delete(cb);\n }\n\n public onError(cb: ErrorCallback): () => void {\n this.errorListeners.add(cb);\n return () => this.errorListeners.delete(cb);\n }\n\n private emit(event: string, data: MarketEvent): void {\n const set = this.eventListeners.get(event);\n if (!set) {\n return;\n }\n for (const cb of set) {\n cb(data);\n }\n }\n}\n"]}
|
package/dist/ws/index.d.cts
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
import { a as PositionEventType, P as PositionEvent, N as NotificationEvent } from '../types
|
|
2
|
-
export {
|
|
3
|
-
import '../aliases-
|
|
1
|
+
import { a as PositionEventType, P as PositionEvent, N as NotificationEvent, M as MarketEventType, b as MarketEvent } from '../types-BwPF-kCK.cjs';
|
|
2
|
+
export { c as MarketDelta, d as MarketEventEnvelope, e as NotificationCode, f as NotificationEventEnvelope, g as PositionEventEnvelope, m as marketEventTypes, n as notificationCodes, p as positionEventTypes } from '../types-BwPF-kCK.cjs';
|
|
3
|
+
import '../aliases-BGqwpyE-.cjs';
|
|
4
4
|
|
|
5
5
|
interface PositionSocketOptions {
|
|
6
6
|
baseUrl?: string;
|
|
7
7
|
getToken: () => string | null;
|
|
8
8
|
}
|
|
9
|
-
type EventCallback = (event: PositionEvent) => void;
|
|
9
|
+
type EventCallback$1 = (event: PositionEvent) => void;
|
|
10
10
|
type NotificationCallback = (event: NotificationEvent) => void;
|
|
11
|
-
type ConnectionCallback = () => void;
|
|
12
|
-
type ErrorCallback = (error: unknown) => void;
|
|
11
|
+
type ConnectionCallback$1 = () => void;
|
|
12
|
+
type ErrorCallback$1 = (error: unknown) => void;
|
|
13
13
|
declare class PositionSocket {
|
|
14
14
|
private socket;
|
|
15
15
|
private readonly baseUrl;
|
|
@@ -24,12 +24,39 @@ declare class PositionSocket {
|
|
|
24
24
|
connect(): void;
|
|
25
25
|
disconnect(): void;
|
|
26
26
|
reconnectWithToken(): void;
|
|
27
|
-
on(event: PositionEventType | "*", cb: EventCallback): () => void;
|
|
27
|
+
on(event: PositionEventType | "*", cb: EventCallback$1): () => void;
|
|
28
|
+
onConnect(cb: ConnectionCallback$1): () => void;
|
|
29
|
+
onDisconnect(cb: ConnectionCallback$1): () => void;
|
|
30
|
+
onError(cb: ErrorCallback$1): () => void;
|
|
31
|
+
onNotification(cb: NotificationCallback): () => void;
|
|
32
|
+
private emit;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
interface MarketSocketOptions {
|
|
36
|
+
baseUrl?: string;
|
|
37
|
+
getToken: () => string | null;
|
|
38
|
+
}
|
|
39
|
+
type EventCallback = (event: MarketEvent) => void;
|
|
40
|
+
type ConnectionCallback = () => void;
|
|
41
|
+
type ErrorCallback = (error: unknown) => void;
|
|
42
|
+
declare class MarketSocket {
|
|
43
|
+
private socket;
|
|
44
|
+
private readonly baseUrl;
|
|
45
|
+
private readonly getToken;
|
|
46
|
+
private readonly eventListeners;
|
|
47
|
+
private readonly connectListeners;
|
|
48
|
+
private readonly disconnectListeners;
|
|
49
|
+
private readonly errorListeners;
|
|
50
|
+
constructor(options: MarketSocketOptions);
|
|
51
|
+
get connected(): boolean;
|
|
52
|
+
connect(): void;
|
|
53
|
+
disconnect(): void;
|
|
54
|
+
reconnectWithToken(): void;
|
|
55
|
+
on(event: MarketEventType | "*", cb: EventCallback): () => void;
|
|
28
56
|
onConnect(cb: ConnectionCallback): () => void;
|
|
29
57
|
onDisconnect(cb: ConnectionCallback): () => void;
|
|
30
58
|
onError(cb: ErrorCallback): () => void;
|
|
31
|
-
onNotification(cb: NotificationCallback): () => void;
|
|
32
59
|
private emit;
|
|
33
60
|
}
|
|
34
61
|
|
|
35
|
-
export { NotificationEvent, PositionEvent, PositionEventType, PositionSocket, type PositionSocketOptions };
|
|
62
|
+
export { MarketEvent, MarketEventType, MarketSocket, type MarketSocketOptions, NotificationEvent, PositionEvent, PositionEventType, PositionSocket, type PositionSocketOptions };
|