@prophecy-dev/sdk 0.1.0 → 0.1.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/arbiter.d.ts +27 -3
- package/dist/arbiter.d.ts.map +1 -1
- package/dist/chain.d.ts.map +1 -1
- package/dist/client.d.ts +7 -4
- package/dist/client.d.ts.map +1 -1
- package/dist/events-api.d.ts +2 -2
- package/dist/events-api.d.ts.map +1 -1
- package/dist/index.cjs +236 -4
- package/dist/index.cjs.map +4 -4
- package/dist/index.d.ts +5 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +236 -4
- package/dist/index.js.map +4 -4
- package/dist/market-defaults.d.ts +135 -0
- package/dist/market-defaults.d.ts.map +1 -0
- package/dist/market-prompts.d.ts +74 -0
- package/dist/market-prompts.d.ts.map +1 -0
- package/dist/market-validation.d.ts +70 -0
- package/dist/market-validation.d.ts.map +1 -0
- package/dist/markets.d.ts +1 -1
- package/dist/markets.d.ts.map +1 -1
- package/package.json +3 -3
package/dist/index.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../src/http.ts", "../src/arbiter.ts", "../src/
|
|
4
|
-
"sourcesContent": ["/**\r\n * Minimal fetch wrapper for SDK API calls.\r\n * No dependencies \u2014 uses global fetch (available in Node 18+, edge runtimes, browsers).\r\n */\r\n\r\nexport class ApiError extends Error {\r\n constructor(\r\n public readonly status: number,\r\n public readonly body: unknown,\r\n ) {\r\n super(`API error ${status}`)\r\n this.name = 'ApiError'\r\n }\r\n}\r\n\r\ninterface FetchOptions {\r\n method?: string\r\n headers?: Record<string, string>\r\n body?: unknown\r\n}\r\n\r\nasync function request<T>(url: string | URL, options: FetchOptions = {}): Promise<T> {\r\n const headers: Record<string, string> = {\r\n 'Content-Type': 'application/json',\r\n ...options.headers,\r\n }\r\n\r\n const res = await fetch(url, {\r\n method: options.method ?? 'GET',\r\n headers,\r\n body: options.body ? JSON.stringify(options.body) : undefined,\r\n })\r\n\r\n if (!res.ok) {\r\n const body = await res.json().catch(() => null)\r\n throw new ApiError(res.status, body)\r\n }\r\n\r\n return res.json() as Promise<T>\r\n}\r\n\r\nexport function get<T>(\r\n baseUrl: string,\r\n path: string,\r\n params?: Record<string, string | number | undefined>,\r\n): Promise<T> {\r\n const url = new URL(path, baseUrl)\r\n if (params) {\r\n for (const [key, value] of Object.entries(params)) {\r\n if (value !== undefined) url.searchParams.set(key, String(value))\r\n }\r\n }\r\n return request<T>(url)\r\n}\r\n\r\nexport function post<T>(baseUrl: string, path: string, body: unknown): Promise<T> {\r\n return request<T>(new URL(path, baseUrl), { method: 'POST', body })\r\n}\r\n\r\nexport function authedPost<T>(\r\n baseUrl: string,\r\n path: string,\r\n body: unknown,\r\n authToken: string,\r\n): Promise<T> {\r\n return request<T>(new URL(path, baseUrl), {\r\n method: 'POST',\r\n body,\r\n headers: { Authorization: `Bearer ${authToken}` },\r\n })\r\n}\r\n\r\nexport function authedDelete<T>(baseUrl: string, path: string, authToken: string): Promise<T> {\r\n return request<T>(new URL(path, baseUrl), {\r\n method: 'DELETE',\r\n headers: { Authorization: `Bearer ${authToken}` },\r\n })\r\n}\r\n", "import { post } from './http'\n\n/* \u2500\u2500 Request \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\nexport interface ArbiterRatingRequest {\n prompt: string\n answerType: string\n sourceUrls: string[]\n minAgreement: number\n tradingStart: string\n tradingEnd: string\n resolutionStart: string\n resolutionEnd: string\n}\n\n/* \u2500\u2500 Response \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\nexport interface ArbiterCriterion {\n key: string\n name: string\n criterionType: 'gate' | 'score'\n evaluation: 'static' | 'llm'\n status: 'pass' | 'fail'\n summary: string\n weight?: number\n score?: number\n weightedScore?: number\n}\n\nexport interface ArbiterRatingBand {\n rating: string\n minScore: number\n maxScore: number\n definition: string\n}\n\nexport interface ArbiterRating {\n ratedAt: string\n finalScore: number\n ratingBand: ArbiterRatingBand\n criteria: ArbiterCriterion[]\n}\n\n/* \u2500\u2500 Wire format (snake_case from API) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\ninterface ArbiterRatingWire {\n rated_at: string\n final_score: number\n rating_band: {\n rating: string\n min_score: number\n max_score: number\n definition: string\n }\n criteria: Array<{\n key: string\n name: string\n criterion_type: 'gate' | 'score'\n evaluation: 'static' | 'llm'\n status: 'pass' | 'fail'\n summary: string\n weight?: number\n score?: number\n weighted_score?: number\n }>\n}\n\n/* \u2500\u2500 Helpers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\nfunction toWireRequest(input: ArbiterRatingRequest): Record<string, unknown> {\n return {\n prompt: input.prompt,\n answer_type: input.answerType,\n source_urls: input.sourceUrls,\n min_agreement: input.minAgreement,\n trading_start: input.tradingStart,\n trading_end: input.tradingEnd,\n resolution_start: input.resolutionStart,\n resolution_end: input.resolutionEnd,\n }\n}\n\nfunction fromWireResponse(wire: ArbiterRatingWire): ArbiterRating {\n return {\n ratedAt: wire.rated_at,\n finalScore: wire.final_score,\n ratingBand: {\n rating: wire.rating_band.rating,\n minScore: wire.rating_band.min_score,\n maxScore: wire.rating_band.max_score,\n definition: wire.rating_band.definition,\n },\n criteria: wire.criteria.map((c) => ({\n key: c.key,\n name: c.name,\n criterionType: c.criterion_type,\n evaluation: c.evaluation,\n status: c.status,\n summary: c.summary,\n weight: c.weight,\n score: c.score,\n weightedScore: c.weighted_score,\n })),\n }\n}\n\n/* \u2500\u2500 Public API \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n/**\n * Rate a market definition via the Arbiter API.\n * Returns a quality score, rating band, and per-criterion breakdown.\n */\nexport async function rateMarketDraft(\n arbiterUrl: string,\n input: ArbiterRatingRequest,\n): Promise<ArbiterRating> {\n const wire = await post<ArbiterRatingWire>(\n arbiterUrl,\n '/v0/ratings/markets',\n toWireRequest(input),\n )\n return fromWireResponse(wire)\n}\n", "import { type Address, createPublicClient, defineChain, encodeFunctionData, http } from 'viem'\r\n\r\nexport interface ChainConfig {\r\n rpcUrl: string\r\n chainId: number\r\n venueRegistryAddress: Address\r\n prophecyCoreAddress: Address\r\n prophecySettlementAddress?: Address\r\n}\r\n\r\n// Minimal ABI fragments \u2014 only the view functions we need\r\nconst VENUE_REGISTRY_ABI = [\r\n {\r\n inputs: [\r\n { internalType: 'uint256', name: 'venueId', type: 'uint256' },\r\n { internalType: 'address', name: 'user', type: 'address' },\r\n ],\r\n name: 'getNonce',\r\n outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }],\r\n stateMutability: 'view',\r\n type: 'function',\r\n },\r\n] as const\r\n\r\nconst PROPHECY_CORE_ABI = [\r\n {\r\n inputs: [\r\n { internalType: 'uint256', name: 'marketId', type: 'uint256' },\r\n { internalType: 'address', name: 'user', type: 'address' },\r\n ],\r\n name: 'getUserPosition',\r\n outputs: [\r\n {\r\n components: [\r\n { internalType: 'uint256', name: 'yes', type: 'uint256' },\r\n { internalType: 'uint256', name: 'no', type: 'uint256' },\r\n { internalType: 'bool', name: 'claimed', type: 'bool' },\r\n ],\r\n internalType: 'struct IProphecyCore.SharePosition',\r\n name: '',\r\n type: 'tuple',\r\n },\r\n ],\r\n stateMutability: 'view',\r\n type: 'function',\r\n },\r\n {\r\n inputs: [{ internalType: 'uint256', name: 'marketId', type: 'uint256' }],\r\n name: 'getMarketCore',\r\n outputs: [\r\n {\r\n components: [\r\n { internalType: 'uint256', name: 'tradingStartTs', type: 'uint256' },\r\n { internalType: 'uint256', name: 'tradingEndTs', type: 'uint256' },\r\n { internalType: 'uint256', name: 'resolutionStartTs', type: 'uint256' },\r\n { internalType: 'uint256', name: 'resolutionEndTs', type: 'uint256' },\r\n { internalType: 'address', name: 'creator', type: 'address' },\r\n { internalType: 'address', name: 'resolver', type: 'address' },\r\n { internalType: 'address', name: 'stakeToken', type: 'address' },\r\n { internalType: 'bool', name: 'resolved', type: 'bool' },\r\n { internalType: 'uint8', name: 'outcome', type: 'uint8' },\r\n { internalType: 'uint256', name: 'totalYesShares', type: 'uint256' },\r\n { internalType: 'uint256', name: 'totalNoShares', type: 'uint256' },\r\n { internalType: 'uint256', name: 'totalShares', type: 'uint256' },\r\n { internalType: 'uint256', name: 'participantCount', type: 'uint256' },\r\n { internalType: 'uint256', name: 'initialLiquidityBase', type: 'uint256' },\r\n { internalType: 'uint256', name: 'feeBps', type: 'uint256' },\r\n ],\r\n internalType: 'struct IProphecyCore.MarketCore',\r\n name: 'core',\r\n type: 'tuple',\r\n },\r\n { internalType: 'string', name: 'name', type: 'string' },\r\n ],\r\n stateMutability: 'view',\r\n type: 'function',\r\n },\r\n {\r\n inputs: [{ internalType: 'uint256', name: 'marketId', type: 'uint256' }],\r\n name: 'getCurrentReserves',\r\n outputs: [\r\n { internalType: 'uint256', name: 'yesPool', type: 'uint256' },\r\n { internalType: 'uint256', name: 'noPool', type: 'uint256' },\r\n ],\r\n stateMutability: 'view',\r\n type: 'function',\r\n },\r\n] as const\r\n\r\nconst PROPHECY_SETTLEMENT_ABI = [\r\n {\r\n inputs: [{ internalType: 'uint256', name: 'marketId', type: 'uint256' }],\r\n name: 'claimSettlement',\r\n outputs: [{ internalType: 'uint256', name: 'payout', type: 'uint256' }],\r\n stateMutability: 'nonpayable',\r\n type: 'function',\r\n },\r\n] as const\r\n\r\nexport interface SharePosition {\r\n yes: bigint\r\n no: bigint\r\n claimed: boolean\r\n}\r\n\r\n\r\nexport interface MarketCore {\r\n tradingStartTs: bigint\r\n tradingEndTs: bigint\r\n resolutionStartTs: bigint\r\n resolutionEndTs: bigint\r\n creator: Address\r\n resolver: Address\r\n stakeToken: Address\r\n resolved: boolean\r\n outcome: number\r\n totalYesShares: bigint\r\n totalNoShares: bigint\r\n totalShares: bigint\r\n participantCount: bigint\r\n initialLiquidityBase: bigint\r\n feeBps: bigint\r\n}\r\n\r\nexport interface ChainClient {\r\n /** Get the permit nonce for a user on a venue (VenueRegistry.getNonce) */\r\n getVenueNonce(venueId: bigint, user: Address): Promise<bigint>\r\n /** Get market core data (ProphecyCore.getMarketCore) */\r\n getMarketCore(marketId: bigint): Promise<{ core: MarketCore; name: string }>\r\n /** Get current AMM reserves (ProphecyCore.getCurrentReserves) */\r\n getReserves(marketId: bigint): Promise<{ yesPool: bigint; noPool: bigint }>\r\n /** Get a user's share position for a single market */\r\n getUserPosition(marketId: bigint, user: Address): Promise<SharePosition>\r\n /** Batch-read user positions across multiple markets via multicall */\r\n getUserPositions(marketIds: bigint[], user: Address): Promise<(SharePosition | null)[]>\r\n /** Encode a claimSettlement transaction (for the user to sign and send) */\r\n encodeClaimSettlement(marketId: bigint): { to: Address; data: `0x${string}` }\r\n}\r\n\r\n/**\r\n * Create a chain client for reading on-chain state.\r\n * Used by the SDK for nonce lookups (before permit signing) and market queries.\r\n */\r\nexport function createChainClient(config: ChainConfig): ChainClient {\r\n const chain = defineChain({\r\n id: config.chainId,\r\n name: `Somnia (${config.chainId})`,\r\n nativeCurrency: { name: 'STT', symbol: 'STT', decimals: 18 },\r\n rpcUrls: { default: { http: [config.rpcUrl] } },\r\n })\r\n\r\n const client = createPublicClient({\r\n chain,\r\n transport: http(config.rpcUrl),\r\n })\r\n\r\n return {\r\n async getVenueNonce(venueId: bigint, user: Address): Promise<bigint> {\r\n return client.readContract({\r\n address: config.venueRegistryAddress,\r\n abi: VENUE_REGISTRY_ABI,\r\n functionName: 'getNonce',\r\n args: [venueId, user],\r\n })\r\n },\r\n\r\n async getMarketCore(marketId: bigint) {\r\n const [core, name] = await client.readContract({\r\n address: config.prophecyCoreAddress,\r\n abi: PROPHECY_CORE_ABI,\r\n functionName: 'getMarketCore',\r\n args: [marketId],\r\n })\r\n return { core, name }\r\n },\r\n\r\n async getReserves(marketId: bigint) {\r\n const [yesPool, noPool] = await client.readContract({\r\n address: config.prophecyCoreAddress,\r\n abi: PROPHECY_CORE_ABI,\r\n functionName: 'getCurrentReserves',\r\n args: [marketId],\r\n })\r\n return { yesPool, noPool }\r\n },\r\n\r\n async getUserPosition(marketId: bigint, user: Address) {\r\n const result = await client.readContract({\r\n address: config.prophecyCoreAddress,\r\n abi: PROPHECY_CORE_ABI,\r\n functionName: 'getUserPosition',\r\n args: [marketId, user],\r\n })\r\n return result as unknown as SharePosition\r\n },\r\n\r\n async getUserPositions(marketIds: bigint[], user: Address) {\r\n if (marketIds.length === 0) return []\r\n\r\n const calls = marketIds.map((marketId) => ({\r\n address: config.prophecyCoreAddress,\r\n abi: PROPHECY_CORE_ABI,\r\n functionName: 'getUserPosition' as const,\r\n args: [marketId, user] as const,\r\n }))\r\n\r\n const results = await client.multicall({ contracts: calls })\r\n\r\n return results.map((r) => {\r\n if (r.status !== 'success') return null\r\n return r.result as unknown as SharePosition\r\n })\r\n },\r\n\r\n encodeClaimSettlement(marketId: bigint) {\r\n if (!config.prophecySettlementAddress) {\r\n throw new Error('prophecySettlementAddress is required in ChainConfig for claim operations')\r\n }\r\n return {\r\n to: config.prophecySettlementAddress,\r\n data: encodeFunctionData({\r\n abi: PROPHECY_SETTLEMENT_ABI,\r\n functionName: 'claimSettlement',\r\n args: [marketId],\r\n }),\r\n }\r\n },\r\n }\r\n}\r\n", "/**\r\n * Venue API key auth.\r\n * Simple bearer token \u2014 no crypto, no signing, no token exchange.\r\n * The key is generated in the admin UI and stored as an env var in the venue backend.\r\n */\r\n\r\nexport interface VenueAuth {\r\n /** The venue ID. */\r\n venueId: string\r\n /** Get the Authorization header value. */\r\n getAuthHeader(): string\r\n}\r\n\r\nexport function createVenueAuth(venueId: string, apiKey: string): VenueAuth {\r\n return {\r\n venueId,\r\n getAuthHeader: () => `Bearer ${apiKey}`,\r\n }\r\n}\r\n", "/**\r\n * Simple in-memory TTL cache for SDK responses.\r\n * Client-side layer \u2014 reduces redundant fetches within the same process.\r\n * Works alongside server-side Cache-Control headers from the Partners API.\r\n *\r\n * Edge-safe \u2014 no globals, each client gets its own cache instance.\r\n */\r\n\r\ninterface CacheEntry<T> {\r\n data: T\r\n expiresAt: number\r\n}\r\n\r\nexport interface CacheConfig {\r\n /** Default client-side cache TTL in milliseconds. 0 = disabled. Default: 15000 (15s). */\r\n defaultTtlMs?: number\r\n}\r\n\r\nexport function createCache(config: CacheConfig = {}) {\r\n const defaultTtl = config.defaultTtlMs ?? 15_000\r\n const store = new Map<string, CacheEntry<unknown>>()\r\n\r\n return {\r\n get<T>(key: string): T | undefined {\r\n if (defaultTtl === 0) return undefined\r\n const entry = store.get(key)\r\n if (!entry) return undefined\r\n if (Date.now() > entry.expiresAt) {\r\n store.delete(key)\r\n return undefined\r\n }\r\n return entry.data as T\r\n },\r\n\r\n set(key: string, data: unknown, ttlMs?: number): void {\r\n const ttl = ttlMs ?? defaultTtl\r\n if (ttl === 0) return\r\n store.set(key, { data, expiresAt: Date.now() + ttl })\r\n },\r\n\r\n invalidate(prefix: string): void {\r\n for (const key of store.keys()) {\r\n if (key.startsWith(prefix)) store.delete(key)\r\n }\r\n },\r\n\r\n clear(): void {\r\n store.clear()\r\n },\r\n }\r\n}\r\n\r\nexport type Cache = ReturnType<typeof createCache>\r\n", "/**\r\n * Off-chain event reporting.\r\n * Venue backends use these to report user actions (social shares, receipts, challenges).\r\n * Authenticated via venue API key (auto-attached by VenueAuth).\r\n */\r\n\r\nimport type { VenueAuth } from './auth'\r\n\r\nexport interface EventsNamespace {\r\n /** Report a social share. */\r\n socialShare(wallet: string, marketId: string): Promise<EventResult>\r\n /** Report a resolution receipt inspection. */\r\n receiptInspect(wallet: string, marketId: string): Promise<EventResult>\r\n /** Report daily challenge completion. */\r\n dailyChallenge(wallet: string): Promise<EventResult>\r\n}\r\n\r\nexport interface EventResult {\r\n recorded: boolean\r\n pp: number\r\n seasonId: string\r\n reason?: string\r\n}\r\n\r\nexport function createEventsNamespace(\r\n partnersApiUrl: string,\r\n venueAuth: VenueAuth,\r\n): EventsNamespace {\r\n async function postEvent(path: string, body: Record<string, unknown>): Promise<EventResult> {\r\n const url = new URL(`/v1/events${path}`, partnersApiUrl)\r\n const res = await fetch(url, {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n Authorization: venueAuth.getAuthHeader(),\r\n },\r\n body: JSON.stringify(body),\r\n })\r\n\r\n if (!res.ok) {\r\n const err = await res.json().catch(() => null)\r\n const { ApiError } = await import('./http')\r\n throw new ApiError(res.status, err)\r\n }\r\n\r\n return res.json() as Promise<EventResult>\r\n }\r\n\r\n return {\r\n socialShare: (wallet, marketId) => postEvent('/social-share', { wallet, marketId }),\r\n receiptInspect: (wallet, marketId) => postEvent('/receipt-inspect', { wallet, marketId }),\r\n dailyChallenge: (wallet) => postEvent('/daily-challenge', { wallet }),\r\n }\r\n}\r\n", "/**\n * Event operations \u2014 the primary way to browse prediction markets.\n *\n * Events are the parent container for markets. An event has a question\n * (e.g. \"Will BTC reach $100k?\") and one or more outcome markets\n * (e.g. \"Yes\" / \"No\", or \"Up\" / \"Down\" / \"Flat\").\n *\n * Use events.search() instead of markets.search() to get meaningful\n * names and grouped outcomes.\n */\n\nimport type { Cache } from './cache'\nimport { ApiError, get } from './http'\n\n/* \u2500\u2500 Types \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\nexport interface EventMarketPrice {\n timestamp: string\n values: { yes: string; no: string }\n}\n\nexport interface EventMarketStats {\n current_liquidity: string\n total_volume: string\n}\n\nexport interface EventToken {\n chain_id: number\n contract_address: string\n decimals: number\n symbol: string\n token_type: string\n}\n\nexport interface EventContracts {\n prophecy_core: string\n resolver?: string\n}\n\nexport interface EventMarketConditionFilter {\n indexed: boolean\n operator: string\n param_index: number\n param_type: string\n value: string\n}\n\nexport interface EventMarketCondition {\n absence_outcome: number\n event_signature: string\n event_source: string\n filters: EventMarketConditionFilter[]\n logical_op: string\n occurrence_type: string\n occurrence_value: string\n}\n\n/** A single outcome market within an event */\nexport interface EventMarketData {\n market_id: number\n name: string\n market_type: string\n status: string\n outcome: string\n venue_id: string\n opening_at: string\n closing_at: string\n resolving_at: string\n resolved_at: string\n created_at: string\n created_by: string\n price: EventMarketPrice\n stats: EventMarketStats\n token: EventToken\n contracts: EventContracts\n tags: string[]\n conditions?: EventMarketCondition[]\n}\n\nexport interface EventResolverParams {\n prompt: string\n urls: string[]\n result_type: string\n min_agreement: number\n num_sources: number\n resolve_url: boolean\n string_options: string[]\n}\n\nexport interface EventResolver {\n type: string\n params: EventResolverParams\n}\n\nexport interface EventResolution {\n [key: string]: unknown\n}\n\nexport interface EventStats {\n market_count: number\n total_liquidity: string\n total_volume: string\n}\n\n/** A prediction event with its outcome markets */\nexport interface EventData {\n event_id: string\n name: string\n venue_id: string\n status: string\n contracts: EventContracts\n opening_at: string\n closing_at: string\n resolving_at?: string\n resolved_at?: string\n created_at: string\n created_by: string\n stats: EventStats\n token: EventToken\n markets: EventMarketData[]\n resolver?: EventResolver\n resolution?: EventResolution\n}\n\n/* \u2500\u2500 Params \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\nexport interface SearchEventsParams {\n query?: string\n status?: string[]\n venue?: string\n tag?: string\n createdBy?: string\n sort?: string\n order?: 'asc' | 'desc'\n limit?: number\n cursor?: string\n}\n\n/* \u2500\u2500 Namespace \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\nexport interface EventsApiNamespace {\n /** Search events across the protocol. Returns events with nested markets. */\n search(\n params?: SearchEventsParams,\n ): Promise<{ items: EventData[]; hasMore: boolean; nextCursor?: string }>\n /** Get a single event by contract address and event ID. */\n get(contractAddress: string, eventId: string): Promise<EventData>\n}\n\nexport function createEventsApiNamespace(dataApiUrl: string, cache: Cache): EventsApiNamespace {\n return {\n async search(params) {\n const url = new URL('/v0/events', dataApiUrl)\n if (params?.query) url.searchParams.set('q', params.query)\n if (params?.venue) url.searchParams.set('venue', params.venue)\n if (params?.tag) url.searchParams.set('tag', params.tag)\n if (params?.createdBy) url.searchParams.set('created_by', params.createdBy)\n if (params?.sort) url.searchParams.set('sort', params.sort)\n if (params?.order) url.searchParams.set('order', params.order)\n if (params?.limit) url.searchParams.set('limit', String(params.limit))\n if (params?.cursor) url.searchParams.set('cursor', params.cursor)\n if (params?.status) {\n for (const s of params.status) url.searchParams.append('status', s)\n }\n\n const res = await fetch(url, { headers: { 'Content-Type': 'application/json' } })\n if (!res.ok) {\n throw new ApiError(res.status, await res.json().catch(() => null))\n }\n const data = (await res.json()) as {\n items: EventData[]\n has_more: boolean\n next_cursor?: string\n }\n return {\n items: data.items,\n hasMore: data.has_more,\n nextCursor: data.next_cursor,\n }\n },\n\n async get(contractAddress, eventId) {\n const key = `event:${contractAddress}:${eventId}`\n const cached = cache.get<EventData>(key)\n if (cached) return cached\n\n const result = await get<EventData>(dataApiUrl, `/v0/events/${contractAddress}/${eventId}`)\n cache.set(key, result)\n return result\n },\n }\n}\n", "/**\n * Faucet namespace \u2014 protocol-level token distribution for venue users.\n *\n * The treasury wallet is controlled by the Prophecy team.\n * Venues call these methods on behalf of their users \u2014 the venue\n * API key authenticates the request, not the end user.\n */\n\nimport type { VenueAuth } from './auth'\nimport { authedPost, get } from './http'\n\n/* \u2500\u2500 Types \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\nexport interface FaucetEligibility {\n eligible: boolean\n reason?: string\n nextClaimAt?: string\n amount?: string\n tokenAddress?: string\n}\n\nexport interface FaucetClaimResult {\n success: boolean\n error?: string\n amount?: string\n txHash?: string\n nextClaimAt?: string\n}\n\n/* \u2500\u2500 Namespace \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\nexport interface FaucetNamespace {\n /** Check if a wallet is eligible to claim tokens. Public, no auth required. */\n eligibility(wallet: string): Promise<FaucetEligibility>\n /** Claim tokens for a wallet. Requires venue API key auth. */\n claim(wallet: string): Promise<FaucetClaimResult>\n}\n\nexport function createFaucetNamespace(\n partnersApiUrl: string,\n venueId: string,\n venueAuth: VenueAuth | null,\n): FaucetNamespace {\n return {\n async eligibility(wallet) {\n return get<FaucetEligibility>(\n partnersApiUrl,\n `/v1/faucet/eligibility?wallet=${wallet.toLowerCase()}&venue=${venueId}`,\n )\n },\n\n async claim(wallet) {\n if (!venueAuth) {\n return {\n success: false,\n error: 'venueId and venueApiKey required for faucet claims',\n }\n }\n return authedPost<FaucetClaimResult>(\n partnersApiUrl,\n '/v1/faucet/claim',\n { wallet: wallet.toLowerCase() },\n venueAuth.getAuthHeader(),\n )\n },\n }\n}\n", "/**\r\n * Leaderboard queries.\r\n * PP leaderboard: Partners API (available now).\r\n * PnL leaderboard: Data API (pending Go endpoint implementation).\r\n */\r\n\r\nimport { get } from './http'\r\n\r\n// -- PP Leaderboard (Partners API) --\r\n\r\nexport interface PPLeaderboardEntry {\r\n wallet: string\r\n totalPP: number\r\n totalEvents: number\r\n}\r\n\r\nexport interface PPLeaderboardParams {\r\n venue?: string\r\n limit?: number\r\n}\r\n\r\n/**\r\n * Get top traders ranked by Prophecy Points.\r\n */\r\nexport async function getPPLeaderboard(\r\n partnersApiUrl: string,\r\n params?: PPLeaderboardParams,\r\n): Promise<{ traders: PPLeaderboardEntry[] }> {\r\n return get<{ traders: PPLeaderboardEntry[] }>(partnersApiUrl, '/v1/stats/top-traders', {\r\n venue: params?.venue,\r\n limit: params?.limit,\r\n })\r\n}\r\n\r\n// -- PnL Leaderboard (Data API \u2014 pending) --\r\n\r\nexport interface PnLLeaderboardEntry {\r\n wallet: string\r\n pnl: string\r\n tradeCount: number\r\n winRate: number\r\n marketsTraded: number\r\n}\r\n\r\nexport interface PnLLeaderboardParams {\r\n venue?: string\r\n period?: '7d' | '30d' | 'season' | 'all'\r\n limit?: number\r\n cursor?: string\r\n}\r\n\r\n/**\r\n * Get top traders ranked by PnL.\r\n * Requires the Go Data API leaderboard endpoint (pending implementation).\r\n */\r\nexport async function getPnLLeaderboard(\r\n dataApiUrl: string,\r\n params?: PnLLeaderboardParams,\r\n): Promise<{ traders: PnLLeaderboardEntry[]; nextCursor?: string }> {\r\n return get<{ traders: PnLLeaderboardEntry[]; nextCursor?: string }>(\r\n dataApiUrl,\r\n '/v0/leaderboard/pnl',\r\n {\r\n venue: params?.venue,\r\n period: params?.period,\r\n limit: params?.limit,\r\n cursor: params?.cursor,\r\n },\r\n )\r\n}\r\n\r\n// -- Volume Leaderboard (Data API \u2014 pending) --\r\n\r\nexport interface VolumeLeaderboardEntry {\r\n wallet: string\r\n totalVolume: string\r\n tradeCount: number\r\n marketsTraded: number\r\n}\r\n\r\nexport interface VolumeLeaderboardParams {\r\n venue?: string\r\n period?: '7d' | '30d' | 'season' | 'all'\r\n limit?: number\r\n cursor?: string\r\n}\r\n\r\n/**\r\n * Get top traders ranked by trading volume.\r\n * Requires the Go Data API leaderboard endpoint (pending implementation).\r\n */\r\nexport async function getVolumeLeaderboard(\r\n dataApiUrl: string,\r\n params?: VolumeLeaderboardParams,\r\n): Promise<{ traders: VolumeLeaderboardEntry[]; nextCursor?: string }> {\r\n return get<{ traders: VolumeLeaderboardEntry[]; nextCursor?: string }>(\r\n dataApiUrl,\r\n '/v0/leaderboard/volume',\r\n {\r\n venue: params?.venue,\r\n period: params?.period,\r\n limit: params?.limit,\r\n cursor: params?.cursor,\r\n },\r\n )\r\n}\r\n", "/**\r\n * Protocol-wide market operations.\r\n * Read market data from the Data API \u2014 search, get details, prices, trades.\r\n */\r\n\r\nimport type { Cache } from './cache'\r\nimport { get } from './http'\r\n\r\n// -- Types --\r\n\r\nexport interface MarketData {\r\n contract_address: string\r\n market_id: number\r\n name: string\r\n description: string\r\n status: string\r\n outcome: string\r\n yes_price: string | null\r\n no_price: string | null\r\n total_volume: string\r\n participant_count: number\r\n opening_at: string\r\n closing_at: string\r\n resolution_at: string | null\r\n created_at: string\r\n [key: string]: unknown\r\n}\r\n\r\nexport interface SearchMarketsParams {\r\n query?: string\r\n status?: string[]\r\n venue?: string\r\n sort?: string\r\n order?: 'asc' | 'desc'\r\n limit?: number\r\n cursor?: string\r\n}\r\n\r\nexport interface MarketsNamespace {\r\n /** Search all markets across the protocol. */\r\n search(params?: SearchMarketsParams): Promise<{ markets: MarketData[]; nextCursor?: string }>\r\n /** Get a single market by contract address and market ID. */\r\n get(contractAddress: string, marketId: number): Promise<MarketData>\r\n}\r\n\r\nexport function createMarketsNamespace(dataApiUrl: string, cache: Cache): MarketsNamespace {\r\n return {\r\n async search(params) {\r\n const url = new URL('/v0/markets', dataApiUrl)\r\n if (params?.query) url.searchParams.set('q', params.query)\r\n if (params?.venue) url.searchParams.set('venue', params.venue)\r\n if (params?.sort) url.searchParams.set('sort', params.sort)\r\n if (params?.order) url.searchParams.set('order', params.order)\r\n if (params?.limit) url.searchParams.set('limit', String(params.limit))\r\n if (params?.cursor) url.searchParams.set('cursor', params.cursor)\r\n if (params?.status) {\r\n for (const s of params.status) url.searchParams.append('status', s)\r\n }\r\n\r\n const res = await fetch(url, { headers: { 'Content-Type': 'application/json' } })\r\n if (!res.ok) {\r\n const { ApiError } = await import('./http')\r\n throw new ApiError(res.status, await res.json().catch(() => null))\r\n }\r\n return res.json() as Promise<{ markets: MarketData[]; nextCursor?: string }>\r\n },\r\n\r\n async get(contractAddress, marketId) {\r\n const key = `market:${contractAddress}:${marketId}`\r\n const cached = cache.get<MarketData>(key)\r\n if (cached) return cached\r\n\r\n const result = await get<MarketData>(dataApiUrl, `/v0/markets/${contractAddress}/${marketId}`)\r\n cache.set(key, result)\r\n return result\r\n },\r\n }\r\n}\r\n", "/**\r\n * Season information for frontend display.\r\n * Fetches active season config, dates, and time remaining.\r\n */\r\n\r\nimport type { Cache } from './cache'\r\nimport { get } from './http'\r\n\r\nexport interface SeasonInfo {\r\n id: string\r\n name: string\r\n status: 'upcoming' | 'active' | 'snapshot' | 'completed'\r\n startsAt: string\r\n endsAt: string\r\n snapshotAt: string | null\r\n /** Days remaining in the active season. Null if not active. */\r\n daysRemaining: number | null\r\n /** Season progress as a percentage (0-100). Null if not active. */\r\n progressPct: number | null\r\n}\r\n\r\nexport interface SeasonConfig {\r\n /** All multiplier and cap values for the current season. */\r\n config: Record<string, unknown>\r\n /** Pool allocation for SOMI distribution. */\r\n pools: Record<string, unknown>\r\n}\r\n\r\nexport interface SeasonNamespace {\r\n /** Get the active season info (cached). Returns null if no active season. */\r\n active(): Promise<SeasonInfo | null>\r\n /** Get the active season's config (for \"how points work\" pages). */\r\n config(): Promise<SeasonConfig | null>\r\n}\r\n\r\nexport function createSeasonNamespace(partnersApiUrl: string, cache: Cache): SeasonNamespace {\r\n return {\r\n async active() {\r\n const key = 'season:active'\r\n const cached = cache.get<SeasonInfo | null>(key)\r\n if (cached !== undefined) return cached\r\n\r\n const result = await get<SeasonInfo | null>(partnersApiUrl, '/v1/seasons/active').catch(\r\n () => null,\r\n )\r\n\r\n cache.set(key, result, 60_000) // cache 60s \u2014 season data changes slowly\r\n return result\r\n },\r\n\r\n async config() {\r\n const key = 'season:config'\r\n const cached = cache.get<SeasonConfig | null>(key)\r\n if (cached !== undefined) return cached\r\n\r\n const result = await get<SeasonConfig | null>(\r\n partnersApiUrl,\r\n '/v1/seasons/active/config',\r\n ).catch(() => null)\r\n\r\n cache.set(key, result, 60_000)\r\n return result\r\n },\r\n }\r\n}\r\n", "/**\r\n * User-facing operations \u2014 points, identity, wallet linking.\r\n * Calls Partners API endpoints.\r\n */\r\n\r\nimport type { Cache } from './cache'\r\nimport { get, post } from './http'\r\n\r\n// -- Points types --\r\n\r\nexport interface VenueBreakdown {\r\n venueId: string\r\n wallet: string\r\n pp: number\r\n}\r\n\r\nexport interface PointsBalance {\r\n wallet: string\r\n season: string\r\n aggregated: boolean\r\n balance: {\r\n totalPP: number\r\n accuracy: number\r\n streakDays: number\r\n totalPredictions: number\r\n correctPredictions: number\r\n venues?: VenueBreakdown[]\r\n } | null\r\n}\r\n\r\n// -- Identity types --\r\n\r\nexport interface LinkWalletParams {\r\n wallet: string\r\n email: string\r\n venueId: string\r\n authType: 'social' | 'wallet'\r\n}\r\n\r\nexport interface LinkedWallet {\r\n wallet_address: string\r\n venue_id: string\r\n auth_type: string\r\n}\r\n\r\nexport interface WalletIdentity {\r\n wallet: string\r\n emailHash?: string\r\n linkedWallets: LinkedWallet[]\r\n}\r\n\r\n// -- Dashboard types --\r\n\r\nexport interface MultiplierBreakdown {\r\n truth: number\r\n streak: number\r\n auth: number\r\n effective: number\r\n}\r\n\r\nexport interface ActivityBreakdown {\r\n action: string\r\n pp: number\r\n count: number\r\n}\r\n\r\nexport interface RecentActivity {\r\n action: string\r\n ref: string | null\r\n basePP: number\r\n multiplier: number\r\n finalPP: number\r\n source: string\r\n at: string\r\n}\r\n\r\nexport interface UserDashboard {\r\n wallet: string\r\n totalPP: number\r\n totalEvents: number\r\n totalPredictions: number\r\n correctPredictions: number\r\n accuracy: number\r\n multipliers: MultiplierBreakdown\r\n streakDays: number\r\n breakdown: ActivityBreakdown[]\r\n recentActivity: RecentActivity[]\r\n authType: string\r\n aggregated: boolean\r\n}\r\n\r\n// -- Namespace --\r\n\r\nexport interface UserNamespace {\r\n /** Fetch a user's points balance. Aggregates across linked wallets. */\r\n points(wallet: string, params?: { season?: string }): Promise<PointsBalance>\r\n /** Full dashboard data: PP, multipliers, breakdown, recent activity. */\r\n dashboard(wallet: string, params?: { venue?: string }): Promise<UserDashboard>\r\n /** Link a wallet to an email for cross-venue points aggregation. */\r\n linkWallet(params: LinkWalletParams): Promise<{ linked: boolean }>\r\n /** Get all wallets linked to the same email as the given wallet. */\r\n linkedWallets(wallet: string): Promise<WalletIdentity>\r\n}\r\n\r\nexport function createUserNamespace(partnersApiUrl: string, cache: Cache): UserNamespace {\r\n return {\r\n async points(wallet, params) {\r\n const key = `user:${wallet}:points:${params?.season ?? 'current'}`\r\n const cached = cache.get<PointsBalance>(key)\r\n if (cached) return cached\r\n\r\n const result = await get<PointsBalance>(\r\n partnersApiUrl,\r\n `/v1/points/${wallet}`,\r\n params?.season ? { season: params.season } : undefined,\r\n )\r\n cache.set(key, result)\r\n return result\r\n },\r\n\r\n async dashboard(wallet, params) {\r\n const key = `user:${wallet}:dashboard:${params?.venue ?? 'all'}`\r\n const cached = cache.get<UserDashboard>(key)\r\n if (cached) return cached\r\n\r\n const result = await get<UserDashboard>(\r\n partnersApiUrl,\r\n `/v1/users/${wallet}/dashboard`,\r\n params?.venue ? { venue: params.venue } : undefined,\r\n )\r\n cache.set(key, result)\r\n return result\r\n },\r\n\r\n linkWallet: (params) => post<{ linked: boolean }>(partnersApiUrl, '/v1/identity/link', params),\r\n\r\n linkedWallets: (wallet) => get<WalletIdentity>(partnersApiUrl, `/v1/identity/${wallet}`),\r\n }\r\n}\r\n", "/**\r\n * Venue management \u2014 market curation, stats, operators.\r\n * Calls Partners API endpoints. Venue market list is cached client-side\r\n * and benefits from server-side Cache-Control headers.\r\n */\r\n\r\nimport type { Cache } from './cache'\r\nimport { authedDelete, authedPost, get } from './http'\r\nimport type { MarketData } from './markets'\r\n\r\n// -- Types --\r\n\r\nexport interface VenueMarketEntry {\r\n venueMarketId: number\r\n contractAddress: string\r\n marketId: number\r\n addedBy: string\r\n addedAt: string\r\n market: MarketData | null\r\n}\r\n\r\nexport interface AddMarketParams {\r\n contractAddress: string\r\n marketId: number\r\n}\r\n\r\nexport interface VenueStats {\r\n venueId: string\r\n season: string\r\n totalEvents: number\r\n totalPPAwarded: number\r\n uniqueTraders: number\r\n}\r\n\r\nexport interface VenueMarketsNamespace {\r\n /** List markets curated for this venue (enriched with Data API). Cached. */\r\n list(\r\n venueId: string,\r\n params?: { status?: string },\r\n ): Promise<{ markets: VenueMarketEntry[]; total: number }>\r\n /** Add market(s) to a venue. Requires auth. Invalidates cache. */\r\n add(\r\n venueId: string,\r\n markets: AddMarketParams[],\r\n authToken: string,\r\n ): Promise<{ added: AddMarketParams[]; count: number }>\r\n /** Remove a market from a venue. Requires auth. Invalidates cache. */\r\n remove(\r\n venueId: string,\r\n contractAddress: string,\r\n marketId: number,\r\n authToken: string,\r\n ): Promise<{ removed: boolean }>\r\n}\r\n\r\nexport interface VenueNamespace {\r\n /** Curated market management for a venue. */\r\n markets: VenueMarketsNamespace\r\n /** Venue operator stats \u2014 traffic, PP awarded, traders. */\r\n stats(venueId: string, season?: string): Promise<VenueStats>\r\n /** Invalidate all cached data for a venue. */\r\n invalidate(venueId: string): void\r\n /** Clear all venue cache. */\r\n clearCache(): void\r\n}\r\n\r\nexport function createVenueNamespace(partnersApiUrl: string, cache: Cache): VenueNamespace {\r\n return {\r\n markets: {\r\n async list(venueId, params) {\r\n const key = `venue:${venueId}:markets:${params?.status ?? 'all'}`\r\n const cached = cache.get<{ markets: VenueMarketEntry[]; total: number }>(key)\r\n if (cached) return cached\r\n\r\n const result = await get<{ markets: VenueMarketEntry[]; total: number }>(\r\n partnersApiUrl,\r\n `/v1/venues/${venueId}/markets`,\r\n { status: params?.status },\r\n )\r\n cache.set(key, result)\r\n return result\r\n },\r\n\r\n async add(venueId, markets, authToken) {\r\n const result = await authedPost<{ added: AddMarketParams[]; count: number }>(\r\n partnersApiUrl,\r\n `/v1/venues/${venueId}/markets`,\r\n { markets },\r\n authToken,\r\n )\r\n cache.invalidate(`venue:${venueId}`)\r\n return result\r\n },\r\n\r\n async remove(venueId, contractAddress, marketId, authToken) {\r\n const result = await authedDelete<{ removed: boolean }>(\r\n partnersApiUrl,\r\n `/v1/venues/${venueId}/markets/${contractAddress}/${marketId}`,\r\n authToken,\r\n )\r\n cache.invalidate(`venue:${venueId}`)\r\n return result\r\n },\r\n },\r\n\r\n async stats(venueId, season) {\r\n const key = `venue:${venueId}:stats:${season ?? 'current'}`\r\n const cached = cache.get<VenueStats>(key)\r\n if (cached) return cached\r\n\r\n const result = await get<VenueStats>(\r\n partnersApiUrl,\r\n `/v1/points/venue/${venueId}`,\r\n season ? { season } : undefined,\r\n )\r\n cache.set(key, result)\r\n return result\r\n },\r\n\r\n invalidate: (venueId) => cache.invalidate(`venue:${venueId}`),\r\n clearCache: () => cache.invalidate('venue:'),\r\n }\r\n}\r\n", "/**\r\n * Unified Prophecy client.\r\n * Configure once, access all SDK services. Edge-runtime safe \u2014 no globals, no classes.\r\n *\r\n * Usage:\r\n * const prophecy = createProphecyClient({\r\n * chainId: 50312,\r\n * rpcUrl: 'https://dream-rpc.somnia.network',\r\n * dataApiUrl: 'https://api.prophecy.fun',\r\n * partnersApiUrl: 'https://partners.prophecy.fun',\r\n * venueRegistryAddress: '0x...',\r\n * prophecyCoreAddress: '0x...',\r\n * venueId: '46',\r\n * operatorPrivateKey: '0x...',\r\n * })\r\n *\r\n * await prophecy.events.socialShare('0xUser...', 'market-1')\r\n */\r\n\r\nimport type { Address } from 'viem'\r\nimport { type ArbiterRating, type ArbiterRatingRequest, rateMarketDraft } from './arbiter'\r\nimport { createVenueAuth, type VenueAuth } from './auth'\r\nimport { type CacheConfig, createCache } from './cache'\r\nimport { type ChainClient, createChainClient } from './chain'\r\nimport { createEventsNamespace, type EventsNamespace } from './events'\r\nimport { createEventsApiNamespace, type EventsApiNamespace } from './events-api'\r\nimport { createFaucetNamespace, type FaucetNamespace } from './faucet'\r\nimport {\r\n getPnLLeaderboard,\r\n getPPLeaderboard,\r\n getVolumeLeaderboard,\r\n type PnLLeaderboardEntry,\r\n type PnLLeaderboardParams,\r\n type PPLeaderboardEntry,\r\n type PPLeaderboardParams,\r\n type VolumeLeaderboardEntry,\r\n type VolumeLeaderboardParams,\r\n} from './leaderboard'\r\nimport { createMarketsNamespace, type MarketsNamespace } from './markets'\r\nimport { createSeasonNamespace, type SeasonNamespace } from './season'\r\nimport { createUserNamespace, type UserNamespace } from './user'\r\nimport { createVenueNamespace, type VenueNamespace } from './venue'\r\n\r\nexport interface ProphecyClientConfig {\r\n /** Somnia chain ID */\r\n chainId: number\r\n /** RPC endpoint URL */\r\n rpcUrl: string\r\n /** Go Data API base URL (e.g. https://api.prophecy.fun) */\r\n dataApiUrl: string\r\n /** Partners API base URL (e.g. https://partners.prophecy.fun) */\r\n partnersApiUrl: string\r\n /** VenueRegistry contract address */\r\n venueRegistryAddress: Address\r\n /** ProphecyCore contract address */\r\n prophecyCoreAddress: Address\r\n /** ProphecySettlement contract address. Required for claim operations. */\r\n prophecySettlementAddress?: Address\r\n /** Arbiter API base URL (e.g. https://arbiter.prophecy.fun). Optional \u2014 only needed for market rating. */\r\n arbiterUrl?: string\r\n /** Client-side cache config. Default: 15s TTL. Set defaultTtlMs: 0 to disable. */\r\n cache?: CacheConfig\r\n /**\r\n * Venue config \u2014 required for write operations (events, venue market management).\r\n * If omitted, read-only namespaces still work.\r\n */\r\n venueId?: string\r\n /** Venue API key (vk_...). Generated in admin UI. Server-side only \u2014 never expose to browsers. */\r\n venueApiKey?: string\r\n}\r\n\r\nexport interface ProphecyClient {\r\n /** On-chain reads: nonces, market data, AMM reserves */\r\n chain: ChainClient\r\n /** Protocol-wide market data: search, get details */\r\n markets: MarketsNamespace\r\n /** Prediction events with grouped outcome markets */\r\n eventsApi: EventsApiNamespace\r\n /** Venue management: curated markets, stats */\r\n venue: VenueNamespace\r\n /** User data: points, wallet linking */\r\n user: UserNamespace\r\n /** Leaderboards: PP, PnL, volume rankings */\r\n leaderboard: {\r\n pp(params?: PPLeaderboardParams): Promise<{ traders: PPLeaderboardEntry[] }>\r\n pnl(\r\n params?: PnLLeaderboardParams,\r\n ): Promise<{ traders: PnLLeaderboardEntry[]; nextCursor?: string }>\r\n volume(\r\n params?: VolumeLeaderboardParams,\r\n ): Promise<{ traders: VolumeLeaderboardEntry[]; nextCursor?: string }>\r\n }\r\n /** Season info: active season, config, time remaining */\r\n season: SeasonNamespace\r\n /** Protocol faucet: claim daily tokens for users */\r\n faucet: FaucetNamespace\r\n /** Off-chain event reporting (requires venueId + venueApiKey) */\r\n events: EventsNamespace\r\n /** Arbiter: rate market definitions for quality before on-chain submission */\r\n arbiter: {\r\n rate(input: ArbiterRatingRequest): Promise<ArbiterRating>\r\n }\r\n /** Venue auth manager (null if no API key configured) */\r\n auth: VenueAuth | null\r\n}\r\n\r\n/**\r\n * Create a Prophecy client. Configure API URLs once, use everywhere.\r\n * Safe for edge runtimes \u2014 pure closure, no global state.\r\n */\r\nexport function createProphecyClient(config: ProphecyClientConfig): ProphecyClient {\r\n const cache = createCache(config.cache)\r\n\r\n const chain = createChainClient({\r\n chainId: config.chainId,\r\n rpcUrl: config.rpcUrl,\r\n venueRegistryAddress: config.venueRegistryAddress,\r\n prophecyCoreAddress: config.prophecyCoreAddress,\r\n prophecySettlementAddress: config.prophecySettlementAddress,\r\n })\r\n\r\n // Venue auth \u2014 only if API key is provided\r\n const venueAuth =\r\n config.venueId && config.venueApiKey\r\n ? createVenueAuth(config.venueId, config.venueApiKey)\r\n : null\r\n\r\n // Events namespace \u2014 throws clear error if auth not configured\r\n const noAuthEvents: EventsNamespace = {\r\n socialShare: () =>\r\n Promise.reject(new Error('venueId and venueApiKey required for event reporting')),\r\n receiptInspect: () =>\r\n Promise.reject(new Error('venueId and venueApiKey required for event reporting')),\r\n dailyChallenge: () =>\r\n Promise.reject(new Error('venueId and venueApiKey required for event reporting')),\r\n }\r\n\r\n return {\r\n chain,\r\n markets: createMarketsNamespace(config.dataApiUrl, cache),\r\n eventsApi: createEventsApiNamespace(config.dataApiUrl, cache),\r\n venue: createVenueNamespace(config.partnersApiUrl, cache),\r\n user: createUserNamespace(config.partnersApiUrl, cache),\r\n season: createSeasonNamespace(config.partnersApiUrl, cache),\r\n leaderboard: {\r\n pp: (params) => getPPLeaderboard(config.partnersApiUrl, params),\r\n pnl: (params) => getPnLLeaderboard(config.dataApiUrl, params),\r\n volume: (params) => getVolumeLeaderboard(config.dataApiUrl, params),\r\n },\r\n faucet: createFaucetNamespace(config.partnersApiUrl, config.venueId ?? '', venueAuth),\r\n events: venueAuth ? createEventsNamespace(config.partnersApiUrl, venueAuth) : noAuthEvents,\r\n arbiter: config.arbiterUrl\r\n ? { rate: (input) => rateMarketDraft(config.arbiterUrl!, input) }\r\n : {\r\n rate: () =>\r\n Promise.reject(\r\n new Error('arbiterUrl is required in ProphecyClientConfig to rate markets'),\r\n ),\r\n },\r\n auth: venueAuth,\r\n }\r\n}\r\n", "// Client\r\n\r\n// Arbiter\r\nexport {\r\n type ArbiterCriterion,\r\n type ArbiterRating,\r\n type ArbiterRatingBand,\r\n type ArbiterRatingRequest,\r\n rateMarketDraft,\r\n} from './arbiter'\r\n\r\n// Auth\r\nexport type { VenueAuth } from './auth'\r\n\r\n// Cache\r\nexport type { CacheConfig } from './cache'\r\n// Chain\r\nexport {\r\n type ChainClient,\r\n type ChainConfig,\r\n createChainClient,\r\n type MarketCore,\r\n type SharePosition,\r\n} from './chain'\r\nexport {\r\n createProphecyClient,\r\n type ProphecyClient,\r\n type ProphecyClientConfig,\r\n} from './client'\r\n\r\n// Events (off-chain reporting for points)\r\nexport type { EventResult, EventsNamespace } from './events'\r\n\r\n// Events API (prediction events with grouped markets)\r\nexport {\r\n createEventsApiNamespace,\r\n type EventContracts,\r\n type EventData,\r\n type EventMarketData,\r\n type EventMarketPrice,\r\n type EventMarketStats,\r\n type EventResolution,\r\n type EventResolver,\r\n type EventStats,\r\n type EventsApiNamespace,\r\n type EventToken,\r\n type SearchEventsParams,\r\n} from './events-api'\r\n\r\n// Faucet\r\nexport type {\r\n FaucetClaimResult,\r\n FaucetEligibility,\r\n FaucetNamespace,\r\n} from './faucet'\r\n\r\n\r\n// HTTP\r\nexport { ApiError } from './http'\r\n\r\n// Leaderboard\r\nexport {\r\n getPnLLeaderboard,\r\n getPPLeaderboard,\r\n getVolumeLeaderboard,\r\n type PnLLeaderboardEntry,\r\n type PnLLeaderboardParams,\r\n type PPLeaderboardEntry,\r\n type PPLeaderboardParams,\r\n type VolumeLeaderboardEntry,\r\n type VolumeLeaderboardParams,\r\n} from './leaderboard'\r\n\r\n// LLM\r\nexport type { LanguageModel } from './llm'\r\n\r\n// Market creation\r\nexport {\r\n createMarketDefinition,\r\n type MarketDefinition,\r\n type MarketDefinitionInput,\r\n marketDefinitionSchema,\r\n} from './market-creation'\r\n\r\n// Markets\r\nexport type {\r\n MarketData,\r\n MarketsNamespace,\r\n SearchMarketsParams,\r\n} from './markets'\r\n\r\n// Permits\r\nexport { signCreateMarketPermit, signTradePermit } from './permits'\r\n\r\n// Season\r\nexport type {\r\n SeasonConfig,\r\n SeasonInfo,\r\n SeasonNamespace,\r\n} from './season'\r\n\r\n// User\r\nexport type {\r\n ActivityBreakdown,\r\n LinkedWallet,\r\n LinkWalletParams,\r\n MultiplierBreakdown,\r\n PointsBalance,\r\n RecentActivity,\r\n UserDashboard,\r\n UserNamespace,\r\n VenueBreakdown,\r\n WalletIdentity,\r\n} from './user'\r\n\r\n// Venue\r\nexport type {\r\n AddMarketParams,\r\n VenueMarketEntry,\r\n VenueMarketsNamespace,\r\n VenueNamespace,\r\n VenueStats,\r\n} from './venue'\r\n", "/**\n * Market creation via LLM.\n * Reframes a natural language question into a structured market definition.\n * Uses Vercel AI SDK \u2014 provider-agnostic, partners pass any LanguageModel.\n *\n * Req: LLM lives in frontend libraries \u2014 partners bring own keys, customise prompts.\n * (architecture-notion.md)\n */\n\nimport type { LanguageModel } from 'ai'\nimport { generateText } from 'ai'\nimport { z } from 'zod'\n\nexport interface MarketDefinitionInput {\n /** The user's natural language question or prediction */\n question: string\n /** Vercel AI SDK model instance (any provider) */\n model: LanguageModel\n /** Override the system prompt. Defaults to built-in market configurator prompt. */\n systemPrompt?: string\n /** User's timezone for relative date interpretation */\n userTimeZone?: string\n}\n\n/** Unified market definition schema \u2014 type field determines which fields are used */\nexport const marketDefinitionSchema = z.object({\n type: z.enum(['ai', 'creator']).describe('ai = verifiable from URL, creator = manual resolution'),\n name: z.string().describe('Market title \u2014 frames the specific prediction'),\n description: z.string().describe('What will be extracted / resolution criteria'),\n tradingStartTs: z.string().describe('ISO 8601 \u2014 when trading opens'),\n tradingEndTs: z.string().describe('ISO 8601 \u2014 when trading closes'),\n resolutionStartTs: z.string().describe('ISO 8601 \u2014 when resolution can begin'),\n resolutionEndTs: z.string().describe('ISO 8601 \u2014 resolution deadline'),\n // AI-resolved fields (present when type === 'ai')\n extractionPrompt: z\n .string()\n .optional()\n .describe('Prompt used to extract the answer from sources'),\n urls: z.array(z.string()).optional().describe('Credible source URLs (2-4 recommended)'),\n options: z.array(z.string()).optional().describe('Possible outcomes for string extractions'),\n expectedOutcome: z\n .string()\n .optional()\n .describe(\"The user's prediction \u2014 inferred from the question\"),\n resultType: z.enum(['string', 'number']).optional().describe('Type of extraction result'),\n})\n\nexport type MarketDefinition = z.infer<typeof marketDefinitionSchema>\n\nfunction buildDefaultSystemPrompt(): string {\n const today = new Date().toISOString().split('T')[0]\n\n return `You are a prediction market configurator. Given a user's question or prediction, create a structured market definition.\n\nToday's date (UTC) is: ${today}\n\nDetermine whether this market can be AI-resolved (outcome verifiable from public URLs) or needs creator resolution (subjective/manual).\n\nFor AI-resolved markets:\n- Provide 2-4 credible, authoritative source URLs\n- Write a clear extraction prompt for future data extraction\n- Set the expected outcome (the user's prediction) inferred from their question\n- Frame the market name to include the specific prediction (e.g., \"England to win Euro 2024\", NOT \"Winner of Euro 2024\")\n- Choose string or number result type based on the outcome\n\nFor creator-resolved markets:\n- Write a clear market name as a question\n- Provide context and resolution criteria\n\nSet appropriate timestamps:\n- tradingStartTs: when trading opens (usually now or soon)\n- tradingEndTs: when trading closes (usually just before the event)\n- resolutionStartTs: when the outcome can be checked (usually when event concludes)\n- resolutionEndTs: deadline for resolution (usually hours/days after event)`\n}\n\n/**\n * Generate a structured market definition from a natural language question.\n * Uses Vercel AI SDK's generateObject for type-safe structured output.\n */\nexport async function createMarketDefinition(\n input: MarketDefinitionInput,\n): Promise<MarketDefinition> {\n const systemPrompt = input.systemPrompt ?? buildDefaultSystemPrompt()\n\n const timeContext = input.userTimeZone\n ? `\\nUser timezone: ${input.userTimeZone}. Interpret relative dates accordingly.`\n : ''\n\n const { text } = await generateText({\n model: input.model,\n system: `${systemPrompt}\\n\\nRespond ONLY with valid JSON matching this schema. No markdown, no explanation.\\nSchema: ${JSON.stringify(marketDefinitionSchema.shape)}`,\n prompt: `Create a prediction market for: \"${input.question}\"${timeContext}`,\n })\n\n const parsed = marketDefinitionSchema.parse(JSON.parse(text))\n return parsed\n}\n", "import type { Address, Hex } from 'viem'\nimport { privateKeyToAccount } from 'viem/accounts'\n\n/** Permit deadline: 60 seconds from now. */\nconst PERMIT_TTL_SECONDS = 60\n\n// EIP-712 domain \u2014 matches VenueRegistry contract\nconst EIP712_DOMAIN = {\n name: 'VenueRegistry',\n version: '1',\n} as const\n\nconst CREATE_MARKET_PERMIT_TYPES = {\n CreateMarketPermit: [\n { name: 'name', type: 'string' },\n { name: 'venueId', type: 'uint256' },\n { name: 'tradingStartTs', type: 'uint256' },\n { name: 'tradingEndTs', type: 'uint256' },\n { name: 'resolutionStartTs', type: 'uint256' },\n { name: 'resolutionEndTs', type: 'uint256' },\n { name: 'stakeToken', type: 'address' },\n { name: 'initialLiquidityBase', type: 'uint256' },\n { name: 'noMatchOutcome', type: 'uint8' },\n { name: 'resolverType', type: 'uint8' },\n { name: 'creator', type: 'address' },\n { name: 'nonce', type: 'uint256' },\n { name: 'deadline', type: 'uint256' },\n ],\n} as const\n\n// Req: Trade permit \u2014 venue operator signs to attribute the trade entry point to their venue.\n// The permit is NOT a gatekeeper \u2014 markets are permissionless. The signature attributes\n// which venue facilitated the trade (used for operator points scoping).\nconst TRADE_PERMIT_TYPES = {\n TradePermit: [\n { name: 'marketId', type: 'uint256' },\n { name: 'venueId', type: 'uint256' },\n { name: 'user', type: 'address' },\n { name: 'amount', type: 'uint256' },\n { name: 'action', type: 'uint8' },\n { name: 'nonce', type: 'uint256' },\n { name: 'deadline', type: 'uint256' },\n ],\n} as const\n\nexport interface TradePermitParams {\n marketId: bigint\n venueId: bigint\n user: Address\n amount: bigint\n action: number\n nonce: bigint\n operatorPrivateKey: Hex\n chainId: number\n venueRegistryAddress: Address\n}\n\nexport interface CreateMarketPermitParams {\n name: string\n venueId: bigint\n tradingStartTs: number\n tradingEndTs: number\n resolutionStartTs: number\n resolutionEndTs: number\n stakeToken: Address\n initialLiquidityBase: bigint\n noMatchOutcome: number\n resolverType: number\n creator: Address\n nonce: bigint\n operatorPrivateKey: Hex\n chainId: number\n venueRegistryAddress: Address\n}\n\nexport interface PermitResult {\n signature: Hex\n signer: Address\n deadline: bigint\n}\n\n/**\n * Sign an EIP-712 trade permit using the venue operator's private key.\n * Called by the venue's own backend \u2014 the key never leaves the operator's infra.\n */\nexport async function signTradePermit(params: TradePermitParams): Promise<PermitResult> {\n const account = privateKeyToAccount(params.operatorPrivateKey)\n const deadline = BigInt(Math.floor(Date.now() / 1000) + PERMIT_TTL_SECONDS)\n\n const signature = await account.signTypedData({\n domain: {\n ...EIP712_DOMAIN,\n chainId: params.chainId,\n verifyingContract: params.venueRegistryAddress,\n },\n types: TRADE_PERMIT_TYPES,\n primaryType: 'TradePermit',\n message: {\n marketId: params.marketId,\n venueId: params.venueId,\n user: params.user,\n amount: params.amount,\n action: params.action,\n nonce: params.nonce,\n deadline,\n },\n })\n\n return { signature, signer: account.address, deadline }\n}\n\n/**\n * Sign an EIP-712 market creation permit using the venue operator's private key.\n */\nexport async function signCreateMarketPermit(\n params: CreateMarketPermitParams,\n): Promise<PermitResult> {\n const account = privateKeyToAccount(params.operatorPrivateKey)\n const deadline = BigInt(Math.floor(Date.now() / 1000) + PERMIT_TTL_SECONDS)\n\n const signature = await account.signTypedData({\n domain: {\n ...EIP712_DOMAIN,\n chainId: params.chainId,\n verifyingContract: params.venueRegistryAddress,\n },\n types: CREATE_MARKET_PERMIT_TYPES,\n primaryType: 'CreateMarketPermit',\n message: {\n name: params.name,\n venueId: params.venueId,\n tradingStartTs: BigInt(params.tradingStartTs),\n tradingEndTs: BigInt(params.tradingEndTs),\n resolutionStartTs: BigInt(params.resolutionStartTs),\n resolutionEndTs: BigInt(params.resolutionEndTs),\n stakeToken: params.stakeToken,\n initialLiquidityBase: params.initialLiquidityBase,\n noMatchOutcome: params.noMatchOutcome,\n resolverType: params.resolverType,\n creator: params.creator,\n nonce: params.nonce,\n deadline,\n },\n })\n\n return { signature, signer: account.address, deadline }\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["http_exports", "__export", "ApiError", "authedDelete", "authedPost", "get", "post", "request", "url", "options", "headers", "res", "body", "baseUrl", "path", "params", "key", "value", "authToken", "init_http", "__esmMin", "status", "init_http", "toWireRequest", "input", "fromWireResponse", "wire", "c", "
|
|
3
|
+
"sources": ["../src/http.ts", "../src/arbiter.ts", "../src/cache.ts", "../src/chain.ts", "../src/auth.ts", "../src/events.ts", "../src/events-api.ts", "../src/faucet.ts", "../src/leaderboard.ts", "../src/markets.ts", "../src/season.ts", "../src/user.ts", "../src/venue.ts", "../src/client.ts", "../src/index.ts", "../src/market-creation.ts", "../src/market-defaults.ts", "../src/market-prompts.ts", "../src/market-validation.ts", "../src/permits.ts"],
|
|
4
|
+
"sourcesContent": ["/**\r\n * Minimal fetch wrapper for SDK API calls.\r\n * No dependencies \u2014 uses global fetch (available in Node 18+, edge runtimes, browsers).\r\n */\r\n\r\nexport class ApiError extends Error {\r\n constructor(\r\n public readonly status: number,\r\n public readonly body: unknown,\r\n ) {\r\n super(`API error ${status}`)\r\n this.name = 'ApiError'\r\n }\r\n}\r\n\r\ninterface FetchOptions {\r\n method?: string\r\n headers?: Record<string, string>\r\n body?: unknown\r\n}\r\n\r\nasync function request<T>(url: string | URL, options: FetchOptions = {}): Promise<T> {\r\n const headers: Record<string, string> = {\r\n 'Content-Type': 'application/json',\r\n ...options.headers,\r\n }\r\n\r\n const res = await fetch(url, {\r\n method: options.method ?? 'GET',\r\n headers,\r\n body: options.body ? JSON.stringify(options.body) : undefined,\r\n })\r\n\r\n if (!res.ok) {\r\n const body = await res.json().catch(() => null)\r\n throw new ApiError(res.status, body)\r\n }\r\n\r\n return res.json() as Promise<T>\r\n}\r\n\r\nexport function get<T>(\r\n baseUrl: string,\r\n path: string,\r\n params?: Record<string, string | number | undefined>,\r\n): Promise<T> {\r\n const url = new URL(path, baseUrl)\r\n if (params) {\r\n for (const [key, value] of Object.entries(params)) {\r\n if (value !== undefined) url.searchParams.set(key, String(value))\r\n }\r\n }\r\n return request<T>(url)\r\n}\r\n\r\nexport function post<T>(baseUrl: string, path: string, body: unknown): Promise<T> {\r\n return request<T>(new URL(path, baseUrl), { method: 'POST', body })\r\n}\r\n\r\nexport function authedPost<T>(\r\n baseUrl: string,\r\n path: string,\r\n body: unknown,\r\n authToken: string,\r\n): Promise<T> {\r\n return request<T>(new URL(path, baseUrl), {\r\n method: 'POST',\r\n body,\r\n headers: { Authorization: `Bearer ${authToken}` },\r\n })\r\n}\r\n\r\nexport function authedDelete<T>(baseUrl: string, path: string, authToken: string): Promise<T> {\r\n return request<T>(new URL(path, baseUrl), {\r\n method: 'DELETE',\r\n headers: { Authorization: `Bearer ${authToken}` },\r\n })\r\n}\r\n", "import { get, post } from './http'\r\n\r\n/* \u2500\u2500 Request \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\r\n\r\nexport interface ArbiterRatingRequest {\r\n prompt: string\r\n answerType: string\r\n sourceUrls: string[]\r\n minAgreement: number\r\n tradingStart: string\r\n tradingEnd: string\r\n resolutionStart: string\r\n resolutionEnd: string\r\n}\r\n\r\n/* \u2500\u2500 Response \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\r\n\r\nexport interface ArbiterCriterion {\r\n key: string\r\n name: string\r\n criterionType: 'gate' | 'score'\r\n evaluation: 'static' | 'llm'\r\n status: 'pass' | 'fail'\r\n summary: string\r\n weight?: number\r\n score?: number\r\n weightedScore?: number\r\n}\r\n\r\nexport interface ArbiterRatingBand {\r\n rating: string\r\n minScore: number\r\n maxScore: number\r\n definition: string\r\n}\r\n\r\nexport interface ArbiterRating {\r\n ratedAt: string\r\n finalScore: number\r\n ratingBand: ArbiterRatingBand\r\n criteria: ArbiterCriterion[]\r\n}\r\n\r\n/* \u2500\u2500 Wire format (snake_case from API) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\r\n\r\ninterface ArbiterRatingWire {\r\n rated_at: string\r\n final_score: number\r\n rating_band: {\r\n rating: string\r\n min_score: number\r\n max_score: number\r\n definition: string\r\n }\r\n criteria: Array<{\r\n key: string\r\n name: string\r\n criterion_type: 'gate' | 'score'\r\n evaluation: 'static' | 'llm'\r\n status: 'pass' | 'fail'\r\n summary: string\r\n weight?: number\r\n score?: number\r\n weighted_score?: number\r\n }>\r\n}\r\n\r\n/* \u2500\u2500 Helpers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\r\n\r\nfunction toWireRequest(input: ArbiterRatingRequest): Record<string, unknown> {\r\n return {\r\n prompt: input.prompt,\r\n answer_type: input.answerType,\r\n source_urls: input.sourceUrls,\r\n min_agreement: input.minAgreement,\r\n trading_start: input.tradingStart,\r\n trading_end: input.tradingEnd,\r\n resolution_start: input.resolutionStart,\r\n resolution_end: input.resolutionEnd,\r\n }\r\n}\r\n\r\nfunction fromWireResponse(wire: ArbiterRatingWire): ArbiterRating {\r\n return {\r\n ratedAt: wire.rated_at,\r\n finalScore: wire.final_score,\r\n ratingBand: {\r\n rating: wire.rating_band.rating,\r\n minScore: wire.rating_band.min_score,\r\n maxScore: wire.rating_band.max_score,\r\n definition: wire.rating_band.definition,\r\n },\r\n criteria: wire.criteria.map((c) => ({\r\n key: c.key,\r\n name: c.name,\r\n criterionType: c.criterion_type,\r\n evaluation: c.evaluation,\r\n status: c.status,\r\n summary: c.summary,\r\n weight: c.weight,\r\n score: c.score,\r\n weightedScore: c.weighted_score,\r\n })),\r\n }\r\n}\r\n\r\n/* \u2500\u2500 Public API (all routed through Partners API) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\r\n\r\nexport interface ArbiterPreviewResult {\r\n arbiterId: string\r\n badgeUrl: string\r\n rating: string | null\r\n score: number | null\r\n definition: string | null\r\n criteria: unknown[]\r\n}\r\n\r\nexport interface EventRating {\r\n arbiterId: string\r\n badgeUrl: string\r\n detailUrl?: string\r\n cached: boolean\r\n}\r\n\r\n/**\r\n * Preview a market rating before creation. Routes through Partners API.\r\n * Use this during market creation to show the user expected quality.\r\n */\r\nexport async function previewRating(\r\n partnersApiUrl: string,\r\n input: ArbiterRatingRequest,\r\n): Promise<ArbiterPreviewResult> {\r\n return post<ArbiterPreviewResult>(partnersApiUrl, '/v1/arbiter/preview', toWireRequest(input))\r\n}\r\n\r\n/**\r\n * Rate a market definition via Partners API \u2192 Arbiter.\r\n * Returns the full rating with criteria breakdown.\r\n */\r\nexport async function rateMarketDraft(\r\n partnersApiUrl: string,\r\n input: ArbiterRatingRequest,\r\n): Promise<ArbiterRating> {\r\n const wire = await post<ArbiterRatingWire>(\r\n partnersApiUrl,\r\n '/v1/arbiter/preview',\r\n toWireRequest(input),\r\n )\r\n return fromWireResponse(wire)\r\n}\r\n\r\n/**\r\n * Get the Arbiter rating for an on-chain event.\r\n * Partners API handles the lazy cache: fetches from Data API + rates via Arbiter on first request.\r\n */\r\nexport async function getEventRating(\r\n partnersApiUrl: string,\r\n contractAddress: string,\r\n eventId: string,\r\n): Promise<EventRating> {\r\n return get<EventRating>(partnersApiUrl, `/v1/arbiter/events/${contractAddress}/${eventId}`)\r\n}\r\n", "/**\r\n * Simple in-memory TTL cache for SDK responses.\r\n * Client-side layer \u2014 reduces redundant fetches within the same process.\r\n * Works alongside server-side Cache-Control headers from the Partners API.\r\n *\r\n * Edge-safe \u2014 no globals, each client gets its own cache instance.\r\n */\r\n\r\ninterface CacheEntry<T> {\r\n data: T\r\n expiresAt: number\r\n}\r\n\r\nexport interface CacheConfig {\r\n /** Default client-side cache TTL in milliseconds. 0 = disabled. Default: 15000 (15s). */\r\n defaultTtlMs?: number\r\n}\r\n\r\nexport function createCache(config: CacheConfig = {}) {\r\n const defaultTtl = config.defaultTtlMs ?? 15_000\r\n const store = new Map<string, CacheEntry<unknown>>()\r\n\r\n return {\r\n get<T>(key: string): T | undefined {\r\n if (defaultTtl === 0) return undefined\r\n const entry = store.get(key)\r\n if (!entry) return undefined\r\n if (Date.now() > entry.expiresAt) {\r\n store.delete(key)\r\n return undefined\r\n }\r\n return entry.data as T\r\n },\r\n\r\n set(key: string, data: unknown, ttlMs?: number): void {\r\n const ttl = ttlMs ?? defaultTtl\r\n if (ttl === 0) return\r\n store.set(key, { data, expiresAt: Date.now() + ttl })\r\n },\r\n\r\n invalidate(prefix: string): void {\r\n for (const key of store.keys()) {\r\n if (key.startsWith(prefix)) store.delete(key)\r\n }\r\n },\r\n\r\n clear(): void {\r\n store.clear()\r\n },\r\n }\r\n}\r\n\r\nexport type Cache = ReturnType<typeof createCache>\r\n", "import { type Address, createPublicClient, defineChain, encodeFunctionData, http } from 'viem'\r\n\r\nexport interface ChainConfig {\r\n rpcUrl: string\r\n chainId: number\r\n venueRegistryAddress: Address\r\n prophecyCoreAddress: Address\r\n prophecySettlementAddress?: Address\r\n}\r\n\r\n// Minimal ABI fragments \u2014 only the view functions we need\r\nconst VENUE_REGISTRY_ABI = [\r\n {\r\n inputs: [\r\n { internalType: 'uint256', name: 'venueId', type: 'uint256' },\r\n { internalType: 'address', name: 'user', type: 'address' },\r\n ],\r\n name: 'getNonce',\r\n outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }],\r\n stateMutability: 'view',\r\n type: 'function',\r\n },\r\n] as const\r\n\r\nconst PROPHECY_CORE_ABI = [\r\n {\r\n inputs: [\r\n { internalType: 'uint256', name: 'marketId', type: 'uint256' },\r\n { internalType: 'address', name: 'user', type: 'address' },\r\n ],\r\n name: 'getUserPosition',\r\n outputs: [\r\n {\r\n components: [\r\n { internalType: 'uint256', name: 'yes', type: 'uint256' },\r\n { internalType: 'uint256', name: 'no', type: 'uint256' },\r\n { internalType: 'bool', name: 'claimed', type: 'bool' },\r\n ],\r\n internalType: 'struct IProphecyCore.SharePosition',\r\n name: '',\r\n type: 'tuple',\r\n },\r\n ],\r\n stateMutability: 'view',\r\n type: 'function',\r\n },\r\n {\r\n inputs: [{ internalType: 'uint256', name: 'marketId', type: 'uint256' }],\r\n name: 'getMarketCore',\r\n outputs: [\r\n {\r\n components: [\r\n { internalType: 'uint256', name: 'tradingStartTs', type: 'uint256' },\r\n { internalType: 'uint256', name: 'tradingEndTs', type: 'uint256' },\r\n { internalType: 'uint256', name: 'resolutionStartTs', type: 'uint256' },\r\n { internalType: 'uint256', name: 'resolutionEndTs', type: 'uint256' },\r\n { internalType: 'address', name: 'creator', type: 'address' },\r\n { internalType: 'address', name: 'resolver', type: 'address' },\r\n { internalType: 'address', name: 'stakeToken', type: 'address' },\r\n { internalType: 'bool', name: 'resolved', type: 'bool' },\r\n { internalType: 'uint8', name: 'outcome', type: 'uint8' },\r\n { internalType: 'uint256', name: 'totalYesShares', type: 'uint256' },\r\n { internalType: 'uint256', name: 'totalNoShares', type: 'uint256' },\r\n { internalType: 'uint256', name: 'totalShares', type: 'uint256' },\r\n { internalType: 'uint256', name: 'participantCount', type: 'uint256' },\r\n { internalType: 'uint256', name: 'initialLiquidityBase', type: 'uint256' },\r\n { internalType: 'uint256', name: 'feeBps', type: 'uint256' },\r\n ],\r\n internalType: 'struct IProphecyCore.MarketCore',\r\n name: 'core',\r\n type: 'tuple',\r\n },\r\n { internalType: 'string', name: 'name', type: 'string' },\r\n ],\r\n stateMutability: 'view',\r\n type: 'function',\r\n },\r\n {\r\n inputs: [{ internalType: 'uint256', name: 'marketId', type: 'uint256' }],\r\n name: 'getCurrentReserves',\r\n outputs: [\r\n { internalType: 'uint256', name: 'yesPool', type: 'uint256' },\r\n { internalType: 'uint256', name: 'noPool', type: 'uint256' },\r\n ],\r\n stateMutability: 'view',\r\n type: 'function',\r\n },\r\n] as const\r\n\r\nconst PROPHECY_SETTLEMENT_ABI = [\r\n {\r\n inputs: [{ internalType: 'uint256', name: 'marketId', type: 'uint256' }],\r\n name: 'claimSettlement',\r\n outputs: [{ internalType: 'uint256', name: 'payout', type: 'uint256' }],\r\n stateMutability: 'nonpayable',\r\n type: 'function',\r\n },\r\n] as const\r\n\r\nexport interface SharePosition {\r\n yes: bigint\r\n no: bigint\r\n claimed: boolean\r\n}\r\n\r\nexport interface MarketCore {\r\n tradingStartTs: bigint\r\n tradingEndTs: bigint\r\n resolutionStartTs: bigint\r\n resolutionEndTs: bigint\r\n creator: Address\r\n resolver: Address\r\n stakeToken: Address\r\n resolved: boolean\r\n outcome: number\r\n totalYesShares: bigint\r\n totalNoShares: bigint\r\n totalShares: bigint\r\n participantCount: bigint\r\n initialLiquidityBase: bigint\r\n feeBps: bigint\r\n}\r\n\r\nexport interface ChainClient {\r\n /** Get the permit nonce for a user on a venue (VenueRegistry.getNonce) */\r\n getVenueNonce(venueId: bigint, user: Address): Promise<bigint>\r\n /** Get market core data (ProphecyCore.getMarketCore) */\r\n getMarketCore(marketId: bigint): Promise<{ core: MarketCore; name: string }>\r\n /** Get current AMM reserves (ProphecyCore.getCurrentReserves) */\r\n getReserves(marketId: bigint): Promise<{ yesPool: bigint; noPool: bigint }>\r\n /** Get a user's share position for a single market */\r\n getUserPosition(marketId: bigint, user: Address): Promise<SharePosition>\r\n /** Batch-read user positions across multiple markets via multicall */\r\n getUserPositions(marketIds: bigint[], user: Address): Promise<(SharePosition | null)[]>\r\n /** Encode a claimSettlement transaction (for the user to sign and send) */\r\n encodeClaimSettlement(marketId: bigint): { to: Address; data: `0x${string}` }\r\n}\r\n\r\n/**\r\n * Create a chain client for reading on-chain state.\r\n * Used by the SDK for nonce lookups (before permit signing) and market queries.\r\n */\r\nexport function createChainClient(config: ChainConfig): ChainClient {\r\n const chain = defineChain({\r\n id: config.chainId,\r\n name: `Somnia (${config.chainId})`,\r\n nativeCurrency: { name: 'STT', symbol: 'STT', decimals: 18 },\r\n rpcUrls: { default: { http: [config.rpcUrl] } },\r\n })\r\n\r\n const client = createPublicClient({\r\n chain,\r\n transport: http(config.rpcUrl),\r\n })\r\n\r\n return {\r\n async getVenueNonce(venueId: bigint, user: Address): Promise<bigint> {\r\n return client.readContract({\r\n address: config.venueRegistryAddress,\r\n abi: VENUE_REGISTRY_ABI,\r\n functionName: 'getNonce',\r\n args: [venueId, user],\r\n })\r\n },\r\n\r\n async getMarketCore(marketId: bigint) {\r\n const [core, name] = await client.readContract({\r\n address: config.prophecyCoreAddress,\r\n abi: PROPHECY_CORE_ABI,\r\n functionName: 'getMarketCore',\r\n args: [marketId],\r\n })\r\n return { core, name }\r\n },\r\n\r\n async getReserves(marketId: bigint) {\r\n const [yesPool, noPool] = await client.readContract({\r\n address: config.prophecyCoreAddress,\r\n abi: PROPHECY_CORE_ABI,\r\n functionName: 'getCurrentReserves',\r\n args: [marketId],\r\n })\r\n return { yesPool, noPool }\r\n },\r\n\r\n async getUserPosition(marketId: bigint, user: Address) {\r\n const result = await client.readContract({\r\n address: config.prophecyCoreAddress,\r\n abi: PROPHECY_CORE_ABI,\r\n functionName: 'getUserPosition',\r\n args: [marketId, user],\r\n })\r\n return result as unknown as SharePosition\r\n },\r\n\r\n async getUserPositions(marketIds: bigint[], user: Address) {\r\n if (marketIds.length === 0) return []\r\n\r\n const calls = marketIds.map((marketId) => ({\r\n address: config.prophecyCoreAddress,\r\n abi: PROPHECY_CORE_ABI,\r\n functionName: 'getUserPosition' as const,\r\n args: [marketId, user] as const,\r\n }))\r\n\r\n const results = await client.multicall({ contracts: calls })\r\n\r\n return results.map((r) => {\r\n if (r.status !== 'success') return null\r\n return r.result as unknown as SharePosition\r\n })\r\n },\r\n\r\n encodeClaimSettlement(marketId: bigint) {\r\n if (!config.prophecySettlementAddress) {\r\n throw new Error('prophecySettlementAddress is required in ChainConfig for claim operations')\r\n }\r\n return {\r\n to: config.prophecySettlementAddress,\r\n data: encodeFunctionData({\r\n abi: PROPHECY_SETTLEMENT_ABI,\r\n functionName: 'claimSettlement',\r\n args: [marketId],\r\n }),\r\n }\r\n },\r\n }\r\n}\r\n", "/**\r\n * Venue API key auth.\r\n * Simple bearer token \u2014 no crypto, no signing, no token exchange.\r\n * The key is generated in the admin UI and stored as an env var in the venue backend.\r\n */\r\n\r\nexport interface VenueAuth {\r\n /** The venue ID. */\r\n venueId: string\r\n /** Get the Authorization header value. */\r\n getAuthHeader(): string\r\n}\r\n\r\nexport function createVenueAuth(venueId: string, apiKey: string): VenueAuth {\r\n return {\r\n venueId,\r\n getAuthHeader: () => `Bearer ${apiKey}`,\r\n }\r\n}\r\n", "/**\r\n * Off-chain event reporting.\r\n * Venue backends use these to report user actions (social shares, receipts, challenges).\r\n * Authenticated via venue API key (auto-attached by VenueAuth).\r\n */\r\n\r\nimport type { VenueAuth } from './auth'\r\n\r\nexport interface EventsNamespace {\r\n /** Report a social share. */\r\n socialShare(wallet: string, marketId: string): Promise<EventResult>\r\n /** Report a resolution receipt inspection. */\r\n receiptInspect(wallet: string, marketId: string): Promise<EventResult>\r\n /** Report daily challenge completion. */\r\n dailyChallenge(wallet: string): Promise<EventResult>\r\n}\r\n\r\nexport interface EventResult {\r\n recorded: boolean\r\n pp: number\r\n seasonId: string\r\n reason?: string\r\n}\r\n\r\nexport function createEventsNamespace(\r\n partnersApiUrl: string,\r\n venueAuth: VenueAuth,\r\n): EventsNamespace {\r\n async function postEvent(path: string, body: Record<string, unknown>): Promise<EventResult> {\r\n const url = new URL(`/v1/events${path}`, partnersApiUrl)\r\n const res = await fetch(url, {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n Authorization: venueAuth.getAuthHeader(),\r\n },\r\n body: JSON.stringify(body),\r\n })\r\n\r\n if (!res.ok) {\r\n const err = await res.json().catch(() => null)\r\n const { ApiError } = await import('./http')\r\n throw new ApiError(res.status, err)\r\n }\r\n\r\n return res.json() as Promise<EventResult>\r\n }\r\n\r\n return {\r\n socialShare: (wallet, marketId) => postEvent('/social-share', { wallet, marketId }),\r\n receiptInspect: (wallet, marketId) => postEvent('/receipt-inspect', { wallet, marketId }),\r\n dailyChallenge: (wallet) => postEvent('/daily-challenge', { wallet }),\r\n }\r\n}\r\n", "/**\r\n * Event operations \u2014 the primary way to browse prediction markets.\r\n *\r\n * Events are the parent container for markets. An event has a question\r\n * (e.g. \"Will BTC reach $100k?\") and one or more outcome markets\r\n * (e.g. \"Yes\" / \"No\", or \"Up\" / \"Down\" / \"Flat\").\r\n *\r\n * Use events.search() instead of markets.search() to get meaningful\r\n * names and grouped outcomes.\r\n */\r\n\r\nimport type { Cache } from './cache'\r\nimport { ApiError, get } from './http'\r\n\r\n/* \u2500\u2500 Types \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\r\n\r\nexport interface EventMarketPrice {\r\n timestamp: string\r\n values: { yes: string; no: string }\r\n}\r\n\r\nexport interface EventMarketStats {\r\n current_liquidity: string\r\n total_volume: string\r\n}\r\n\r\nexport interface EventToken {\r\n chain_id: number\r\n contract_address: string\r\n decimals: number\r\n symbol: string\r\n token_type: string\r\n}\r\n\r\nexport interface EventContracts {\r\n prophecy_core: string\r\n resolver?: string\r\n}\r\n\r\nexport interface EventMarketConditionFilter {\r\n indexed: boolean\r\n operator: string\r\n param_index: number\r\n param_type: string\r\n value: string\r\n}\r\n\r\nexport interface EventMarketCondition {\r\n absence_outcome: number\r\n event_signature: string\r\n event_source: string\r\n filters: EventMarketConditionFilter[]\r\n logical_op: string\r\n occurrence_type: string\r\n occurrence_value: string\r\n}\r\n\r\n/** A single outcome market within an event */\r\nexport interface EventMarketData {\r\n market_id: number\r\n name: string\r\n market_type: string\r\n status: string\r\n outcome: string\r\n venue_id: string\r\n opening_at: string\r\n closing_at: string\r\n resolving_at: string\r\n resolved_at: string\r\n created_at: string\r\n created_by: string\r\n price: EventMarketPrice\r\n stats: EventMarketStats\r\n token: EventToken\r\n contracts: EventContracts\r\n tags: string[]\r\n conditions?: EventMarketCondition[]\r\n}\r\n\r\nexport interface EventResolverParams {\r\n prompt: string\r\n urls: string[]\r\n result_type: string\r\n min_agreement: number\r\n num_sources: number\r\n resolve_url: boolean\r\n string_options: string[]\r\n}\r\n\r\nexport interface EventResolver {\r\n type: string\r\n params: EventResolverParams\r\n}\r\n\r\nexport interface EventResolution {\r\n [key: string]: unknown\r\n}\r\n\r\nexport interface EventStats {\r\n market_count: number\r\n total_liquidity: string\r\n total_volume: string\r\n}\r\n\r\n/** A prediction event with its outcome markets */\r\nexport interface EventData {\r\n event_id: string\r\n name: string\r\n venue_id: string\r\n status: string\r\n contracts: EventContracts\r\n opening_at: string\r\n closing_at: string\r\n resolving_at?: string\r\n resolved_at?: string\r\n created_at: string\r\n created_by: string\r\n stats: EventStats\r\n token: EventToken\r\n markets: EventMarketData[]\r\n resolver?: EventResolver\r\n resolution?: EventResolution\r\n}\r\n\r\n/* \u2500\u2500 Params \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\r\n\r\nexport interface SearchEventsParams {\r\n q?: string\r\n status?: string[]\r\n venue?: string\r\n tag?: string\r\n created_by?: string\r\n sort?: string\r\n order?: 'asc' | 'desc'\r\n limit?: number\r\n cursor?: string\r\n}\r\n\r\n/* \u2500\u2500 Namespace \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\r\n\r\nexport interface EventsApiNamespace {\r\n /** Search events across the protocol. Returns events with nested markets. */\r\n search(\r\n params?: SearchEventsParams,\r\n ): Promise<{ items: EventData[]; hasMore: boolean; nextCursor?: string }>\r\n /** Get a single event by contract address and event ID. */\r\n get(contractAddress: string, eventId: string): Promise<EventData>\r\n}\r\n\r\nexport function createEventsApiNamespace(dataApiUrl: string, cache: Cache): EventsApiNamespace {\r\n return {\r\n async search(params) {\r\n const url = new URL('/v0/events', dataApiUrl)\r\n if (params?.q) url.searchParams.set('q', params.q)\r\n if (params?.venue) url.searchParams.set('venue', params.venue)\r\n if (params?.tag) url.searchParams.set('tag', params.tag)\r\n if (params?.created_by) url.searchParams.set('created_by', params.created_by)\r\n if (params?.sort) url.searchParams.set('sort', params.sort)\r\n if (params?.order) url.searchParams.set('order', params.order)\r\n if (params?.limit) url.searchParams.set('limit', String(params.limit))\r\n if (params?.cursor) url.searchParams.set('cursor', params.cursor)\r\n if (params?.status) {\r\n for (const s of params.status) url.searchParams.append('status', s)\r\n }\r\n\r\n const res = await fetch(url, { headers: { 'Content-Type': 'application/json' } })\r\n if (!res.ok) {\r\n throw new ApiError(res.status, await res.json().catch(() => null))\r\n }\r\n const data = (await res.json()) as {\r\n items: EventData[]\r\n has_more: boolean\r\n next_cursor?: string\r\n }\r\n return {\r\n items: data.items,\r\n hasMore: data.has_more,\r\n nextCursor: data.next_cursor,\r\n }\r\n },\r\n\r\n async get(contractAddress, eventId) {\r\n const key = `event:${contractAddress}:${eventId}`\r\n const cached = cache.get<EventData>(key)\r\n if (cached) return cached\r\n\r\n const result = await get<EventData>(dataApiUrl, `/v0/events/${contractAddress}/${eventId}`)\r\n cache.set(key, result)\r\n return result\r\n },\r\n }\r\n}\r\n", "/**\r\n * Faucet namespace \u2014 protocol-level token distribution for venue users.\r\n *\r\n * The treasury wallet is controlled by the Prophecy team.\r\n * Venues call these methods on behalf of their users \u2014 the venue\r\n * API key authenticates the request, not the end user.\r\n */\r\n\r\nimport type { VenueAuth } from './auth'\r\nimport { authedPost, get } from './http'\r\n\r\n/* \u2500\u2500 Types \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\r\n\r\nexport interface FaucetEligibility {\r\n eligible: boolean\r\n reason?: string\r\n nextClaimAt?: string\r\n amount?: string\r\n tokenAddress?: string\r\n}\r\n\r\nexport interface FaucetClaimResult {\r\n success: boolean\r\n error?: string\r\n amount?: string\r\n txHash?: string\r\n nextClaimAt?: string\r\n}\r\n\r\n/* \u2500\u2500 Namespace \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\r\n\r\nexport interface FaucetNamespace {\r\n /** Check if a wallet is eligible to claim tokens. Public, no auth required. */\r\n eligibility(wallet: string): Promise<FaucetEligibility>\r\n /** Claim tokens for a wallet. Requires venue API key auth. */\r\n claim(wallet: string): Promise<FaucetClaimResult>\r\n}\r\n\r\nexport function createFaucetNamespace(\r\n partnersApiUrl: string,\r\n venueId: string,\r\n venueAuth: VenueAuth | null,\r\n): FaucetNamespace {\r\n return {\r\n async eligibility(wallet) {\r\n return get<FaucetEligibility>(\r\n partnersApiUrl,\r\n `/v1/faucet/eligibility?wallet=${wallet.toLowerCase()}&venue=${venueId}`,\r\n )\r\n },\r\n\r\n async claim(wallet) {\r\n if (!venueAuth) {\r\n return {\r\n success: false,\r\n error: 'venueId and venueApiKey required for faucet claims',\r\n }\r\n }\r\n return authedPost<FaucetClaimResult>(\r\n partnersApiUrl,\r\n '/v1/faucet/claim',\r\n { wallet: wallet.toLowerCase() },\r\n venueAuth.getAuthHeader(),\r\n )\r\n },\r\n }\r\n}\r\n", "/**\r\n * Leaderboard queries.\r\n * PP leaderboard: Partners API (available now).\r\n * PnL leaderboard: Data API (pending Go endpoint implementation).\r\n */\r\n\r\nimport { get } from './http'\r\n\r\n// -- PP Leaderboard (Partners API) --\r\n\r\nexport interface PPLeaderboardEntry {\r\n wallet: string\r\n totalPP: number\r\n totalEvents: number\r\n}\r\n\r\nexport interface PPLeaderboardParams {\r\n venue?: string\r\n limit?: number\r\n}\r\n\r\n/**\r\n * Get top traders ranked by Prophecy Points.\r\n */\r\nexport async function getPPLeaderboard(\r\n partnersApiUrl: string,\r\n params?: PPLeaderboardParams,\r\n): Promise<{ traders: PPLeaderboardEntry[] }> {\r\n return get<{ traders: PPLeaderboardEntry[] }>(partnersApiUrl, '/v1/stats/top-traders', {\r\n venue: params?.venue,\r\n limit: params?.limit,\r\n })\r\n}\r\n\r\n// -- PnL Leaderboard (Data API \u2014 pending) --\r\n\r\nexport interface PnLLeaderboardEntry {\r\n wallet: string\r\n pnl: string\r\n tradeCount: number\r\n winRate: number\r\n marketsTraded: number\r\n}\r\n\r\nexport interface PnLLeaderboardParams {\r\n venue?: string\r\n period?: '7d' | '30d' | 'season' | 'all'\r\n limit?: number\r\n cursor?: string\r\n}\r\n\r\n/**\r\n * Get top traders ranked by PnL.\r\n * Requires the Go Data API leaderboard endpoint (pending implementation).\r\n */\r\nexport async function getPnLLeaderboard(\r\n dataApiUrl: string,\r\n params?: PnLLeaderboardParams,\r\n): Promise<{ traders: PnLLeaderboardEntry[]; nextCursor?: string }> {\r\n return get<{ traders: PnLLeaderboardEntry[]; nextCursor?: string }>(\r\n dataApiUrl,\r\n '/v0/leaderboard/pnl',\r\n {\r\n venue: params?.venue,\r\n period: params?.period,\r\n limit: params?.limit,\r\n cursor: params?.cursor,\r\n },\r\n )\r\n}\r\n\r\n// -- Volume Leaderboard (Data API \u2014 pending) --\r\n\r\nexport interface VolumeLeaderboardEntry {\r\n wallet: string\r\n totalVolume: string\r\n tradeCount: number\r\n marketsTraded: number\r\n}\r\n\r\nexport interface VolumeLeaderboardParams {\r\n venue?: string\r\n period?: '7d' | '30d' | 'season' | 'all'\r\n limit?: number\r\n cursor?: string\r\n}\r\n\r\n/**\r\n * Get top traders ranked by trading volume.\r\n * Requires the Go Data API leaderboard endpoint (pending implementation).\r\n */\r\nexport async function getVolumeLeaderboard(\r\n dataApiUrl: string,\r\n params?: VolumeLeaderboardParams,\r\n): Promise<{ traders: VolumeLeaderboardEntry[]; nextCursor?: string }> {\r\n return get<{ traders: VolumeLeaderboardEntry[]; nextCursor?: string }>(\r\n dataApiUrl,\r\n '/v0/leaderboard/volume',\r\n {\r\n venue: params?.venue,\r\n period: params?.period,\r\n limit: params?.limit,\r\n cursor: params?.cursor,\r\n },\r\n )\r\n}\r\n", "/**\r\n * Protocol-wide market operations.\r\n * Read market data from the Data API \u2014 search, get details, prices, trades.\r\n */\r\n\r\nimport type { Cache } from './cache'\r\nimport { get } from './http'\r\n\r\n// -- Types --\r\n\r\nexport interface MarketData {\r\n contract_address: string\r\n market_id: number\r\n name: string\r\n description: string\r\n status: string\r\n outcome: string\r\n yes_price: string | null\r\n no_price: string | null\r\n total_volume: string\r\n participant_count: number\r\n opening_at: string\r\n closing_at: string\r\n resolution_at: string | null\r\n created_at: string\r\n [key: string]: unknown\r\n}\r\n\r\nexport interface SearchMarketsParams {\r\n q?: string\r\n status?: string[]\r\n venue?: string\r\n sort?: string\r\n order?: 'asc' | 'desc'\r\n limit?: number\r\n cursor?: string\r\n}\r\n\r\nexport interface MarketsNamespace {\r\n /** Search all markets across the protocol. */\r\n search(params?: SearchMarketsParams): Promise<{ markets: MarketData[]; nextCursor?: string }>\r\n /** Get a single market by contract address and market ID. */\r\n get(contractAddress: string, marketId: number): Promise<MarketData>\r\n}\r\n\r\nexport function createMarketsNamespace(dataApiUrl: string, cache: Cache): MarketsNamespace {\r\n return {\r\n async search(params) {\r\n const url = new URL('/v0/markets', dataApiUrl)\r\n if (params?.q) url.searchParams.set('q', params.q)\r\n if (params?.venue) url.searchParams.set('venue', params.venue)\r\n if (params?.sort) url.searchParams.set('sort', params.sort)\r\n if (params?.order) url.searchParams.set('order', params.order)\r\n if (params?.limit) url.searchParams.set('limit', String(params.limit))\r\n if (params?.cursor) url.searchParams.set('cursor', params.cursor)\r\n if (params?.status) {\r\n for (const s of params.status) url.searchParams.append('status', s)\r\n }\r\n\r\n const res = await fetch(url, { headers: { 'Content-Type': 'application/json' } })\r\n if (!res.ok) {\r\n const { ApiError } = await import('./http')\r\n throw new ApiError(res.status, await res.json().catch(() => null))\r\n }\r\n return res.json() as Promise<{ markets: MarketData[]; nextCursor?: string }>\r\n },\r\n\r\n async get(contractAddress, marketId) {\r\n const key = `market:${contractAddress}:${marketId}`\r\n const cached = cache.get<MarketData>(key)\r\n if (cached) return cached\r\n\r\n const result = await get<MarketData>(dataApiUrl, `/v0/markets/${contractAddress}/${marketId}`)\r\n cache.set(key, result)\r\n return result\r\n },\r\n }\r\n}\r\n", "/**\r\n * Season information for frontend display.\r\n * Fetches active season config, dates, and time remaining.\r\n */\r\n\r\nimport type { Cache } from './cache'\r\nimport { get } from './http'\r\n\r\nexport interface SeasonInfo {\r\n id: string\r\n name: string\r\n status: 'upcoming' | 'active' | 'snapshot' | 'completed'\r\n startsAt: string\r\n endsAt: string\r\n snapshotAt: string | null\r\n /** Days remaining in the active season. Null if not active. */\r\n daysRemaining: number | null\r\n /** Season progress as a percentage (0-100). Null if not active. */\r\n progressPct: number | null\r\n}\r\n\r\nexport interface SeasonConfig {\r\n /** All multiplier and cap values for the current season. */\r\n config: Record<string, unknown>\r\n /** Pool allocation for SOMI distribution. */\r\n pools: Record<string, unknown>\r\n}\r\n\r\nexport interface SeasonNamespace {\r\n /** Get the active season info (cached). Returns null if no active season. */\r\n active(): Promise<SeasonInfo | null>\r\n /** Get the active season's config (for \"how points work\" pages). */\r\n config(): Promise<SeasonConfig | null>\r\n}\r\n\r\nexport function createSeasonNamespace(partnersApiUrl: string, cache: Cache): SeasonNamespace {\r\n return {\r\n async active() {\r\n const key = 'season:active'\r\n const cached = cache.get<SeasonInfo | null>(key)\r\n if (cached !== undefined) return cached\r\n\r\n const result = await get<SeasonInfo | null>(partnersApiUrl, '/v1/seasons/active').catch(\r\n () => null,\r\n )\r\n\r\n cache.set(key, result, 60_000) // cache 60s \u2014 season data changes slowly\r\n return result\r\n },\r\n\r\n async config() {\r\n const key = 'season:config'\r\n const cached = cache.get<SeasonConfig | null>(key)\r\n if (cached !== undefined) return cached\r\n\r\n const result = await get<SeasonConfig | null>(\r\n partnersApiUrl,\r\n '/v1/seasons/active/config',\r\n ).catch(() => null)\r\n\r\n cache.set(key, result, 60_000)\r\n return result\r\n },\r\n }\r\n}\r\n", "/**\r\n * User-facing operations \u2014 points, identity, wallet linking.\r\n * Calls Partners API endpoints.\r\n */\r\n\r\nimport type { Cache } from './cache'\r\nimport { get, post } from './http'\r\n\r\n// -- Points types --\r\n\r\nexport interface VenueBreakdown {\r\n venueId: string\r\n wallet: string\r\n pp: number\r\n}\r\n\r\nexport interface PointsBalance {\r\n wallet: string\r\n season: string\r\n aggregated: boolean\r\n balance: {\r\n totalPP: number\r\n accuracy: number\r\n streakDays: number\r\n totalPredictions: number\r\n correctPredictions: number\r\n venues?: VenueBreakdown[]\r\n } | null\r\n}\r\n\r\n// -- Identity types --\r\n\r\nexport interface LinkWalletParams {\r\n wallet: string\r\n email: string\r\n venueId: string\r\n authType: 'social' | 'wallet'\r\n}\r\n\r\nexport interface LinkedWallet {\r\n wallet_address: string\r\n venue_id: string\r\n auth_type: string\r\n}\r\n\r\nexport interface WalletIdentity {\r\n wallet: string\r\n emailHash?: string\r\n linkedWallets: LinkedWallet[]\r\n}\r\n\r\n// -- Dashboard types --\r\n\r\nexport interface MultiplierBreakdown {\r\n truth: number\r\n streak: number\r\n auth: number\r\n effective: number\r\n}\r\n\r\nexport interface ActivityBreakdown {\r\n action: string\r\n pp: number\r\n count: number\r\n}\r\n\r\nexport interface RecentActivity {\r\n action: string\r\n ref: string | null\r\n basePP: number\r\n multiplier: number\r\n finalPP: number\r\n source: string\r\n at: string\r\n}\r\n\r\nexport interface UserDashboard {\r\n wallet: string\r\n totalPP: number\r\n totalEvents: number\r\n totalPredictions: number\r\n correctPredictions: number\r\n accuracy: number\r\n multipliers: MultiplierBreakdown\r\n streakDays: number\r\n breakdown: ActivityBreakdown[]\r\n recentActivity: RecentActivity[]\r\n authType: string\r\n aggregated: boolean\r\n}\r\n\r\n// -- Namespace --\r\n\r\nexport interface UserNamespace {\r\n /** Fetch a user's points balance. Aggregates across linked wallets. */\r\n points(wallet: string, params?: { season?: string }): Promise<PointsBalance>\r\n /** Full dashboard data: PP, multipliers, breakdown, recent activity. */\r\n dashboard(wallet: string, params?: { venue?: string }): Promise<UserDashboard>\r\n /** Link a wallet to an email for cross-venue points aggregation. */\r\n linkWallet(params: LinkWalletParams): Promise<{ linked: boolean }>\r\n /** Get all wallets linked to the same email as the given wallet. */\r\n linkedWallets(wallet: string): Promise<WalletIdentity>\r\n}\r\n\r\nexport function createUserNamespace(partnersApiUrl: string, cache: Cache): UserNamespace {\r\n return {\r\n async points(wallet, params) {\r\n const key = `user:${wallet}:points:${params?.season ?? 'current'}`\r\n const cached = cache.get<PointsBalance>(key)\r\n if (cached) return cached\r\n\r\n const result = await get<PointsBalance>(\r\n partnersApiUrl,\r\n `/v1/points/${wallet}`,\r\n params?.season ? { season: params.season } : undefined,\r\n )\r\n cache.set(key, result)\r\n return result\r\n },\r\n\r\n async dashboard(wallet, params) {\r\n const key = `user:${wallet}:dashboard:${params?.venue ?? 'all'}`\r\n const cached = cache.get<UserDashboard>(key)\r\n if (cached) return cached\r\n\r\n const result = await get<UserDashboard>(\r\n partnersApiUrl,\r\n `/v1/users/${wallet}/dashboard`,\r\n params?.venue ? { venue: params.venue } : undefined,\r\n )\r\n cache.set(key, result)\r\n return result\r\n },\r\n\r\n linkWallet: (params) => post<{ linked: boolean }>(partnersApiUrl, '/v1/identity/link', params),\r\n\r\n linkedWallets: (wallet) => get<WalletIdentity>(partnersApiUrl, `/v1/identity/${wallet}`),\r\n }\r\n}\r\n", "/**\r\n * Venue management \u2014 market curation, stats, operators.\r\n * Calls Partners API endpoints. Venue market list is cached client-side\r\n * and benefits from server-side Cache-Control headers.\r\n */\r\n\r\nimport type { Cache } from './cache'\r\nimport { authedDelete, authedPost, get } from './http'\r\nimport type { MarketData } from './markets'\r\n\r\n// -- Types --\r\n\r\nexport interface VenueMarketEntry {\r\n venueMarketId: number\r\n contractAddress: string\r\n marketId: number\r\n addedBy: string\r\n addedAt: string\r\n market: MarketData | null\r\n}\r\n\r\nexport interface AddMarketParams {\r\n contractAddress: string\r\n marketId: number\r\n}\r\n\r\nexport interface VenueStats {\r\n venueId: string\r\n season: string\r\n totalEvents: number\r\n totalPPAwarded: number\r\n uniqueTraders: number\r\n}\r\n\r\nexport interface VenueMarketsNamespace {\r\n /** List markets curated for this venue (enriched with Data API). Cached. */\r\n list(\r\n venueId: string,\r\n params?: { status?: string },\r\n ): Promise<{ markets: VenueMarketEntry[]; total: number }>\r\n /** Add market(s) to a venue. Requires auth. Invalidates cache. */\r\n add(\r\n venueId: string,\r\n markets: AddMarketParams[],\r\n authToken: string,\r\n ): Promise<{ added: AddMarketParams[]; count: number }>\r\n /** Remove a market from a venue. Requires auth. Invalidates cache. */\r\n remove(\r\n venueId: string,\r\n contractAddress: string,\r\n marketId: number,\r\n authToken: string,\r\n ): Promise<{ removed: boolean }>\r\n}\r\n\r\nexport interface VenueNamespace {\r\n /** Curated market management for a venue. */\r\n markets: VenueMarketsNamespace\r\n /** Venue operator stats \u2014 traffic, PP awarded, traders. */\r\n stats(venueId: string, season?: string): Promise<VenueStats>\r\n /** Invalidate all cached data for a venue. */\r\n invalidate(venueId: string): void\r\n /** Clear all venue cache. */\r\n clearCache(): void\r\n}\r\n\r\nexport function createVenueNamespace(partnersApiUrl: string, cache: Cache): VenueNamespace {\r\n return {\r\n markets: {\r\n async list(venueId, params) {\r\n const key = `venue:${venueId}:markets:${params?.status ?? 'all'}`\r\n const cached = cache.get<{ markets: VenueMarketEntry[]; total: number }>(key)\r\n if (cached) return cached\r\n\r\n const result = await get<{ markets: VenueMarketEntry[]; total: number }>(\r\n partnersApiUrl,\r\n `/v1/venues/${venueId}/markets`,\r\n { status: params?.status },\r\n )\r\n cache.set(key, result)\r\n return result\r\n },\r\n\r\n async add(venueId, markets, authToken) {\r\n const result = await authedPost<{ added: AddMarketParams[]; count: number }>(\r\n partnersApiUrl,\r\n `/v1/venues/${venueId}/markets`,\r\n { markets },\r\n authToken,\r\n )\r\n cache.invalidate(`venue:${venueId}`)\r\n return result\r\n },\r\n\r\n async remove(venueId, contractAddress, marketId, authToken) {\r\n const result = await authedDelete<{ removed: boolean }>(\r\n partnersApiUrl,\r\n `/v1/venues/${venueId}/markets/${contractAddress}/${marketId}`,\r\n authToken,\r\n )\r\n cache.invalidate(`venue:${venueId}`)\r\n return result\r\n },\r\n },\r\n\r\n async stats(venueId, season) {\r\n const key = `venue:${venueId}:stats:${season ?? 'current'}`\r\n const cached = cache.get<VenueStats>(key)\r\n if (cached) return cached\r\n\r\n const result = await get<VenueStats>(\r\n partnersApiUrl,\r\n `/v1/points/venue/${venueId}`,\r\n season ? { season } : undefined,\r\n )\r\n cache.set(key, result)\r\n return result\r\n },\r\n\r\n invalidate: (venueId) => cache.invalidate(`venue:${venueId}`),\r\n clearCache: () => cache.invalidate('venue:'),\r\n }\r\n}\r\n", "/**\r\n * Unified Prophecy client.\r\n * Configure once, access all SDK services. Edge-runtime safe \u2014 no globals, no classes.\r\n *\r\n * Usage:\r\n * const prophecy = createProphecyClient({\r\n * chainId: 50312,\r\n * rpcUrl: 'https://dream-rpc.somnia.network',\r\n * dataApiUrl: 'https://api.prophecy.fun',\r\n * partnersApiUrl: 'https://partners.prophecy.fun',\r\n * venueRegistryAddress: '0x...',\r\n * prophecyCoreAddress: '0x...',\r\n * venueId: '46',\r\n * operatorPrivateKey: '0x...',\r\n * })\r\n *\r\n * await prophecy.events.socialShare('0xUser...', 'market-1')\r\n */\r\n\r\nimport type { Address } from 'viem'\r\nimport {\r\n type ArbiterPreviewResult,\r\n type ArbiterRating,\r\n type ArbiterRatingRequest,\r\n type EventRating,\r\n getEventRating,\r\n previewRating,\r\n rateMarketDraft,\r\n} from './arbiter'\r\nimport { createVenueAuth, type VenueAuth } from './auth'\r\nimport { type CacheConfig, createCache } from './cache'\r\nimport { type ChainClient, createChainClient } from './chain'\r\nimport { createEventsNamespace, type EventsNamespace } from './events'\r\nimport { createEventsApiNamespace, type EventsApiNamespace } from './events-api'\r\nimport { createFaucetNamespace, type FaucetNamespace } from './faucet'\r\nimport {\r\n getPnLLeaderboard,\r\n getPPLeaderboard,\r\n getVolumeLeaderboard,\r\n type PnLLeaderboardEntry,\r\n type PnLLeaderboardParams,\r\n type PPLeaderboardEntry,\r\n type PPLeaderboardParams,\r\n type VolumeLeaderboardEntry,\r\n type VolumeLeaderboardParams,\r\n} from './leaderboard'\r\nimport { createMarketsNamespace, type MarketsNamespace } from './markets'\r\nimport { createSeasonNamespace, type SeasonNamespace } from './season'\r\nimport { createUserNamespace, type UserNamespace } from './user'\r\nimport { createVenueNamespace, type VenueNamespace } from './venue'\r\n\r\nexport interface ProphecyClientConfig {\r\n /** Somnia chain ID */\r\n chainId: number\r\n /** RPC endpoint URL */\r\n rpcUrl: string\r\n /** Go Data API base URL (e.g. https://api.prophecy.fun) */\r\n dataApiUrl: string\r\n /** Partners API base URL (e.g. https://partners.prophecy.fun) */\r\n partnersApiUrl: string\r\n /** VenueRegistry contract address */\r\n venueRegistryAddress: Address\r\n /** ProphecyCore contract address */\r\n prophecyCoreAddress: Address\r\n /** ProphecySettlement contract address. Required for claim operations. */\r\n prophecySettlementAddress?: Address\r\n /** Client-side cache config. Default: 15s TTL. Set defaultTtlMs: 0 to disable. */\r\n cache?: CacheConfig\r\n /**\r\n * Venue config \u2014 required for write operations (events, venue market management).\r\n * If omitted, read-only namespaces still work.\r\n */\r\n venueId?: string\r\n /** Venue API key (vk_...). Generated in admin UI. Server-side only \u2014 never expose to browsers. */\r\n venueApiKey?: string\r\n}\r\n\r\nexport interface ProphecyClient {\r\n /** On-chain reads: nonces, market data, AMM reserves */\r\n chain: ChainClient\r\n /** Protocol-wide market data: search, get details */\r\n markets: MarketsNamespace\r\n /** Prediction events with grouped outcome markets */\r\n eventsApi: EventsApiNamespace\r\n /** Venue management: curated markets, stats */\r\n venue: VenueNamespace\r\n /** User data: points, wallet linking */\r\n user: UserNamespace\r\n /** Leaderboards: PP, PnL, volume rankings */\r\n leaderboard: {\r\n pp(params?: PPLeaderboardParams): Promise<{ traders: PPLeaderboardEntry[] }>\r\n pnl(\r\n params?: PnLLeaderboardParams,\r\n ): Promise<{ traders: PnLLeaderboardEntry[]; nextCursor?: string }>\r\n volume(\r\n params?: VolumeLeaderboardParams,\r\n ): Promise<{ traders: VolumeLeaderboardEntry[]; nextCursor?: string }>\r\n }\r\n /** Season info: active season, config, time remaining */\r\n season: SeasonNamespace\r\n /** Protocol faucet: claim daily tokens for users */\r\n faucet: FaucetNamespace\r\n /** Off-chain event reporting (requires venueId + venueApiKey) */\r\n events: EventsNamespace\r\n /** Arbiter: rate market definitions and look up event ratings (all via Partners API) */\r\n arbiter: {\r\n /** Preview rating before market creation */\r\n rate(input: ArbiterRatingRequest): Promise<ArbiterRating>\r\n /** Preview with full response (badge URL, criteria) */\r\n preview(input: ArbiterRatingRequest): Promise<ArbiterPreviewResult>\r\n /** Get cached rating for an on-chain event (lazy \u2014 rates on first request) */\r\n eventRating(contractAddress: string, eventId: string): Promise<EventRating>\r\n }\r\n /** Venue auth manager (null if no API key configured) */\r\n auth: VenueAuth | null\r\n}\r\n\r\n/**\r\n * Create a Prophecy client. Configure API URLs once, use everywhere.\r\n * Safe for edge runtimes \u2014 pure closure, no global state.\r\n */\r\nexport function createProphecyClient(config: ProphecyClientConfig): ProphecyClient {\r\n const cache = createCache(config.cache)\r\n\r\n const chain = createChainClient({\r\n chainId: config.chainId,\r\n rpcUrl: config.rpcUrl,\r\n venueRegistryAddress: config.venueRegistryAddress,\r\n prophecyCoreAddress: config.prophecyCoreAddress,\r\n prophecySettlementAddress: config.prophecySettlementAddress,\r\n })\r\n\r\n // Venue auth \u2014 only if API key is provided\r\n const venueAuth =\r\n config.venueId && config.venueApiKey\r\n ? createVenueAuth(config.venueId, config.venueApiKey)\r\n : null\r\n\r\n // Events namespace \u2014 throws clear error if auth not configured\r\n const noAuthEvents: EventsNamespace = {\r\n socialShare: () =>\r\n Promise.reject(new Error('venueId and venueApiKey required for event reporting')),\r\n receiptInspect: () =>\r\n Promise.reject(new Error('venueId and venueApiKey required for event reporting')),\r\n dailyChallenge: () =>\r\n Promise.reject(new Error('venueId and venueApiKey required for event reporting')),\r\n }\r\n\r\n return {\r\n chain,\r\n markets: createMarketsNamespace(config.dataApiUrl, cache),\r\n eventsApi: createEventsApiNamespace(config.dataApiUrl, cache),\r\n venue: createVenueNamespace(config.partnersApiUrl, cache),\r\n user: createUserNamespace(config.partnersApiUrl, cache),\r\n season: createSeasonNamespace(config.partnersApiUrl, cache),\r\n leaderboard: {\r\n pp: (params) => getPPLeaderboard(config.partnersApiUrl, params),\r\n pnl: (params) => getPnLLeaderboard(config.dataApiUrl, params),\r\n volume: (params) => getVolumeLeaderboard(config.dataApiUrl, params),\r\n },\r\n faucet: createFaucetNamespace(config.partnersApiUrl, config.venueId ?? '', venueAuth),\r\n events: venueAuth ? createEventsNamespace(config.partnersApiUrl, venueAuth) : noAuthEvents,\r\n arbiter: {\r\n rate: (input) => rateMarketDraft(config.partnersApiUrl, input),\r\n preview: (input) => previewRating(config.partnersApiUrl, input),\r\n eventRating: (contractAddress, eventId) =>\r\n getEventRating(config.partnersApiUrl, contractAddress, eventId),\r\n },\r\n auth: venueAuth,\r\n }\r\n}\r\n", "// Client\n\n// Arbiter\nexport {\n type ArbiterCriterion,\n type ArbiterPreviewResult,\n type ArbiterRating,\n type ArbiterRatingBand,\n type ArbiterRatingRequest,\n type EventRating,\n getEventRating,\n previewRating,\n rateMarketDraft,\n} from './arbiter'\n\n// Auth\nexport type { VenueAuth } from './auth'\n\n// Cache\nexport type { CacheConfig } from './cache'\nexport { createCache } from './cache'\n// Chain\nexport {\n type ChainClient,\n type ChainConfig,\n createChainClient,\n type MarketCore,\n type SharePosition,\n} from './chain'\nexport {\n createProphecyClient,\n type ProphecyClient,\n type ProphecyClientConfig,\n} from './client'\n\n// Events (off-chain reporting for points)\nexport type { EventResult, EventsNamespace } from './events'\n\n// Events API (prediction events with grouped markets)\nexport {\n createEventsApiNamespace,\n type EventContracts,\n type EventData,\n type EventMarketData,\n type EventMarketPrice,\n type EventMarketStats,\n type EventResolution,\n type EventResolver,\n type EventStats,\n type EventsApiNamespace,\n type EventToken,\n type SearchEventsParams,\n} from './events-api'\n\n// Faucet\nexport type {\n FaucetClaimResult,\n FaucetEligibility,\n FaucetNamespace,\n} from './faucet'\n\n// HTTP\nexport { ApiError } from './http'\n\n// Leaderboard\nexport {\n getPnLLeaderboard,\n getPPLeaderboard,\n getVolumeLeaderboard,\n type PnLLeaderboardEntry,\n type PnLLeaderboardParams,\n type PPLeaderboardEntry,\n type PPLeaderboardParams,\n type VolumeLeaderboardEntry,\n type VolumeLeaderboardParams,\n} from './leaderboard'\n\n// LLM\nexport type { LanguageModel } from './llm'\n\n// Market creation\nexport {\n createMarketDefinition,\n type MarketDefinition,\n type MarketDefinitionInput,\n marketDefinitionSchema,\n} from './market-creation'\n\n// Market defaults\nexport {\n ACTIVE_MARKET_CAP,\n BANNED_DOMAINS,\n type BannedDomain,\n CATEGORIES,\n DEFAULT_CATEGORY,\n DEFAULT_DURATION_HOURS,\n DEFAULT_LIQUIDITY,\n DEFAULT_RESOLUTION_HOURS,\n DEFAULT_TRADING_START_BUFFER_SECONDS,\n DURATION_HINTS,\n ENTITY_TYPES,\n type EntityType,\n LOW_CONFIDENCE_OVERRIDE,\n MARKET_DEFAULTS,\n MAX_BINARY_PROBABILITY,\n MAX_DURATION_HOURS,\n MAX_OPTION_PROBABILITY,\n type MarketCategory,\n type MarketDefaultsConfig,\n MIN_BINARY_PROBABILITY,\n MIN_DURATION_HOURS,\n MIN_OPTION_PROBABILITY,\n RESOLUTION_CONFIDENCE_THRESHOLD,\n SIMILARITY_THRESHOLD,\n VIRALITY_THRESHOLD,\n} from './market-defaults'\n\n// Market prompts\nexport {\n buildCarouselPrompt,\n buildEntityExtractionPrompt,\n buildGroupingPrompt,\n buildMarketGenerationPrompt,\n buildNewsContextPrompt,\n buildProbabilityEstimationPrompt,\n buildReframePrompt,\n buildResolutionEvalPrompt,\n buildUrlGuidanceBlock,\n type CarouselPromptConfig,\n type EntityExtractionPromptConfig,\n type GroupingPromptConfig,\n type MarketGenerationPromptConfig,\n type NewsContextPromptConfig,\n type ProbabilityEstimationPromptConfig,\n type ReframePromptConfig,\n type ResolutionEvalPromptConfig,\n type UrlGuidanceConfig,\n} from './market-prompts'\n\n// Market validation\nexport {\n clampBinaryProbability,\n clampDuration,\n type GeneratedMarketBase,\n googleNewsFallbackUrl,\n isBannedDomain,\n isValidUrl,\n normalizeOptionProbabilities,\n parseLlmMarketJson,\n} from './market-validation'\n\n// Markets\nexport type {\n MarketData,\n MarketsNamespace,\n SearchMarketsParams,\n} from './markets'\n\n// Permits\nexport { signCreateMarketPermit, signTradePermit } from './permits'\n\n// Season\nexport type {\n SeasonConfig,\n SeasonInfo,\n SeasonNamespace,\n} from './season'\n\n// User\nexport type {\n ActivityBreakdown,\n LinkedWallet,\n LinkWalletParams,\n MultiplierBreakdown,\n PointsBalance,\n RecentActivity,\n UserDashboard,\n UserNamespace,\n VenueBreakdown,\n WalletIdentity,\n} from './user'\n\n// Venue\nexport type {\n AddMarketParams,\n VenueMarketEntry,\n VenueMarketsNamespace,\n VenueNamespace,\n VenueStats,\n} from './venue'\n", "/**\r\n * Market creation via LLM.\r\n * Reframes a natural language question into a structured market definition.\r\n * Uses Vercel AI SDK \u2014 provider-agnostic, partners pass any LanguageModel.\r\n *\r\n * Req: LLM lives in frontend libraries \u2014 partners bring own keys, customise prompts.\r\n * (architecture-notion.md)\r\n */\r\n\r\nimport type { LanguageModel } from 'ai'\r\nimport { generateText } from 'ai'\r\nimport { z } from 'zod'\r\n\r\nexport interface MarketDefinitionInput {\r\n /** The user's natural language question or prediction */\r\n question: string\r\n /** Vercel AI SDK model instance (any provider) */\r\n model: LanguageModel\r\n /** Override the system prompt. Defaults to built-in market configurator prompt. */\r\n systemPrompt?: string\r\n /** User's timezone for relative date interpretation */\r\n userTimeZone?: string\r\n}\r\n\r\n/** Unified market definition schema \u2014 type field determines which fields are used */\r\nexport const marketDefinitionSchema = z.object({\r\n type: z.enum(['ai', 'creator']).describe('ai = verifiable from URL, creator = manual resolution'),\r\n name: z.string().describe('Market title \u2014 frames the specific prediction'),\r\n description: z.string().describe('What will be extracted / resolution criteria'),\r\n tradingStartTs: z.string().describe('ISO 8601 \u2014 when trading opens'),\r\n tradingEndTs: z.string().describe('ISO 8601 \u2014 when trading closes'),\r\n resolutionStartTs: z.string().describe('ISO 8601 \u2014 when resolution can begin'),\r\n resolutionEndTs: z.string().describe('ISO 8601 \u2014 resolution deadline'),\r\n // AI-resolved fields (present when type === 'ai')\r\n extractionPrompt: z\r\n .string()\r\n .optional()\r\n .describe('Prompt used to extract the answer from sources'),\r\n urls: z.array(z.string()).optional().describe('Credible source URLs (2-4 recommended)'),\r\n options: z.array(z.string()).optional().describe('Possible outcomes for string extractions'),\r\n expectedOutcome: z\r\n .string()\r\n .optional()\r\n .describe(\"The user's prediction \u2014 inferred from the question\"),\r\n resultType: z.enum(['string', 'number']).optional().describe('Type of extraction result'),\r\n})\r\n\r\nexport type MarketDefinition = z.infer<typeof marketDefinitionSchema>\r\n\r\nfunction buildDefaultSystemPrompt(): string {\r\n const today = new Date().toISOString().split('T')[0]\r\n\r\n return `You are a prediction market configurator. Given a user's question or prediction, create a structured market definition.\r\n\r\nToday's date (UTC) is: ${today}\r\n\r\nDetermine whether this market can be AI-resolved (outcome verifiable from public URLs) or needs creator resolution (subjective/manual).\r\n\r\nFor AI-resolved markets:\r\n- Provide 2-4 credible, authoritative source URLs\r\n- Write a clear extraction prompt for future data extraction\r\n- Set the expected outcome (the user's prediction) inferred from their question\r\n- Frame the market name to include the specific prediction (e.g., \"England to win Euro 2024\", NOT \"Winner of Euro 2024\")\r\n- Choose string or number result type based on the outcome\r\n\r\nFor creator-resolved markets:\r\n- Write a clear market name as a question\r\n- Provide context and resolution criteria\r\n\r\nSet appropriate timestamps:\r\n- tradingStartTs: when trading opens (usually now or soon)\r\n- tradingEndTs: when trading closes (usually just before the event)\r\n- resolutionStartTs: when the outcome can be checked (usually when event concludes)\r\n- resolutionEndTs: deadline for resolution (usually hours/days after event)`\r\n}\r\n\r\n/**\r\n * Generate a structured market definition from a natural language question.\r\n * Uses Vercel AI SDK's generateObject for type-safe structured output.\r\n */\r\nexport async function createMarketDefinition(\r\n input: MarketDefinitionInput,\r\n): Promise<MarketDefinition> {\r\n const systemPrompt = input.systemPrompt ?? buildDefaultSystemPrompt()\r\n\r\n const timeContext = input.userTimeZone\r\n ? `\\nUser timezone: ${input.userTimeZone}. Interpret relative dates accordingly.`\r\n : ''\r\n\r\n const { text } = await generateText({\r\n model: input.model,\r\n system: `${systemPrompt}\\n\\nRespond ONLY with valid JSON matching this schema. No markdown, no explanation.\\nSchema: ${JSON.stringify(marketDefinitionSchema.shape)}`,\r\n prompt: `Create a prediction market for: \"${input.question}\"${timeContext}`,\r\n })\r\n\r\n const parsed = marketDefinitionSchema.parse(JSON.parse(text))\r\n return parsed\r\n}\r\n", "/**\n * Market defaults \u2014 centralised constants for market generation, validation,\n * and publishing. Every value is exported individually so partners can\n * cherry-pick, and also bundled into typed config objects for convenience.\n *\n * Usage (override pattern):\n * import { MARKET_DEFAULTS } from '@prophecy-dev/sdk'\n * const cfg = { ...MARKET_DEFAULTS, viralityThreshold: 7 }\n */\n\n// ============================================================\n// Categories\n// ============================================================\n\nexport const CATEGORIES = [\n 'crypto',\n 'sport',\n 'pop_culture',\n 'technology',\n 'politics',\n 'science',\n 'entertainment',\n] as const\n\nexport type MarketCategory = (typeof CATEGORIES)[number]\n\nexport const DEFAULT_CATEGORY: MarketCategory = 'politics'\n\n// ============================================================\n// Entity types (image resolver)\n// ============================================================\n\nexport const ENTITY_TYPES = ['country', 'person', 'company', 'team', 'crypto', 'topic'] as const\n\nexport type EntityType = (typeof ENTITY_TYPES)[number]\n\n// ============================================================\n// Scoring thresholds\n// ============================================================\n\n/** Minimum virality score (1-10) for a market to be published. */\nexport const VIRALITY_THRESHOLD = 6\n\n/** Minimum resolution-URL confidence (1-10) for a market to be published. */\nexport const RESOLUTION_CONFIDENCE_THRESHOLD = 4\n\n/** Embedding cosine-similarity threshold for duplicate detection (0-1). */\nexport const SIMILARITY_THRESHOLD = 0.85\n\n// ============================================================\n// Duration & probability clamps\n// ============================================================\n\n/** Default duration in hours when the LLM doesn't provide one. */\nexport const DEFAULT_DURATION_HOURS = 168\n\n/** Minimum allowed market duration in hours. */\nexport const MIN_DURATION_HOURS = 1\n\n/** Maximum allowed market duration in hours. */\nexport const MAX_DURATION_HOURS = 720\n\n/** Binary market probability floor. */\nexport const MIN_BINARY_PROBABILITY = 0.05\n\n/** Binary market probability ceiling. */\nexport const MAX_BINARY_PROBABILITY = 0.95\n\n/** Multi-outcome per-option probability floor. */\nexport const MIN_OPTION_PROBABILITY = 0.02\n\n/** Multi-outcome per-option probability ceiling. */\nexport const MAX_OPTION_PROBABILITY = 0.95\n\n// ============================================================\n// Publishing\n// ============================================================\n\n/** Default initial liquidity per option, in ETH units. */\nexport const DEFAULT_LIQUIDITY = '100'\n\n/** Seconds before trading starts (buffer after creation tx). */\nexport const DEFAULT_TRADING_START_BUFFER_SECONDS = 60\n\n/** Default resolution window in hours after trading ends. */\nexport const DEFAULT_RESOLUTION_HOURS = 1\n\n// ============================================================\n// Active market cap\n// ============================================================\n\n/** Maximum number of active markets before the pipeline stops creating new ones. */\nexport const ACTIVE_MARKET_CAP = 5000\n\n// ============================================================\n// Banned resolution domains\n// ============================================================\n\n/**\n * Domains that always fail resolution (JS-rendered, auth walls, unreliable).\n * Exported as a plain array so partners can spread + extend.\n */\nexport const BANNED_DOMAINS = [\n 'x.com',\n 'twitter.com',\n 'charts.spotify.com',\n 'xtracker.polymarket.com',\n 'www.youtube.com',\n 'youtube.com',\n 'www.espncricinfo.com',\n 'espncricinfo.com',\n 'liquipedia.net',\n 'www.dotabuff.com',\n 'dotabuff.com',\n 'www.premierleague.com',\n 'premierleague.com',\n 'gol.gg',\n 'www.gol.gg',\n] as const\n\nexport type BannedDomain = (typeof BANNED_DOMAINS)[number]\n\n// ============================================================\n// Duration hints (per-category guidance for LLM prompts)\n// ============================================================\n\nexport const DURATION_HINTS: Record<string, string> = {\n crypto: '1-4h',\n sport: '4-12h',\n news: '18-24h',\n politics: '18-24h',\n}\n\n// ============================================================\n// Prompt-internal constants\n// ============================================================\n// These are used by prompt builders in market-prompts.ts to generate\n// LLM instruction text. They're not exported from the public API \u2014\n// partners override prompts via the builder config, not by tuning\n// individual rubric entries.\n\n/** @internal */\nexport const VIRALITY_RUBRIC = {\n '9-10': 'massive global interest (Super Bowl, elections)',\n '7-8': 'mainstream (top-20 crypto, major sports leagues, significant news)',\n '5-6': 'niche interest',\n '1-4': 'very low interest',\n} as const\n\n/** @internal */\nexport const RESOLUTION_CONFIDENCE_RUBRIC = {\n '9-10': 'URL always contains the answer (CoinGecko, ESPN scoreboard)',\n '7-8': 'URL very likely has the answer (major news, official standings)',\n '4-6': 'uncertain (general news, social media)',\n '1-3': 'unlikely to have a clear answer',\n} as const\n\n/** @internal */\nexport const CONFIDENCE_TIERS = {\n explicit: { min: 0.9, max: 1.0, label: 'URL explicitly states the outcome' },\n strong: { min: 0.5, max: 0.8, label: 'Strong but indirect evidence' },\n tangential: { min: 0.1, max: 0.4, label: 'Tangentially related content' },\n none: { min: 0.0, max: 0.1, label: 'No relevant information \u2014 UNKNOWN' },\n} as const\n\n/** Confidence below this forces UNKNOWN regardless of LLM output. */\nexport const LOW_CONFIDENCE_OVERRIDE = 0.6\n\n/** @internal */\nexport const PROBABILITY_CALIBRATION = {\n frontrunner: { min: 0.1, max: 0.3 },\n midfield: { min: 0.02, max: 0.08 },\n backmarker: { min: 0.002, max: 0.02 },\n} as const\n\n// ============================================================\n// Bundled defaults object\n// ============================================================\n\n/**\n * All defaults as a single object \u2014 easy to spread and override.\n *\n * ```ts\n * import { MARKET_DEFAULTS } from '@prophecy-dev/sdk'\n * const myConfig = { ...MARKET_DEFAULTS, viralityThreshold: 7 }\n * ```\n */\nexport const MARKET_DEFAULTS = {\n categories: CATEGORIES,\n defaultCategory: DEFAULT_CATEGORY,\n entityTypes: ENTITY_TYPES,\n viralityThreshold: VIRALITY_THRESHOLD,\n resolutionConfidenceThreshold: RESOLUTION_CONFIDENCE_THRESHOLD,\n similarityThreshold: SIMILARITY_THRESHOLD,\n defaultDurationHours: DEFAULT_DURATION_HOURS,\n minDurationHours: MIN_DURATION_HOURS,\n maxDurationHours: MAX_DURATION_HOURS,\n minBinaryProbability: MIN_BINARY_PROBABILITY,\n maxBinaryProbability: MAX_BINARY_PROBABILITY,\n minOptionProbability: MIN_OPTION_PROBABILITY,\n maxOptionProbability: MAX_OPTION_PROBABILITY,\n defaultLiquidity: DEFAULT_LIQUIDITY,\n defaultTradingStartBufferSeconds: DEFAULT_TRADING_START_BUFFER_SECONDS,\n defaultResolutionHours: DEFAULT_RESOLUTION_HOURS,\n activeMarketCap: ACTIVE_MARKET_CAP,\n bannedDomains: BANNED_DOMAINS,\n durationHints: DURATION_HINTS,\n lowConfidenceOverride: LOW_CONFIDENCE_OVERRIDE,\n} as const\n\nexport type MarketDefaultsConfig = typeof MARKET_DEFAULTS\n", "/**\n * Prompt builders for every LLM use-case in the Prophecy market lifecycle.\n *\n * Each builder accepts an optional partial config so callers can override\n * specific sections while keeping sensible defaults. The returned string\n * is the system prompt \u2014 pass it straight to your LLM provider.\n *\n * ```ts\n * import { buildReframePrompt } from '@prophecy-dev/sdk'\n * const prompt = buildReframePrompt({ durationHints: { crypto: '1-6h' } })\n * ```\n */\n\nimport {\n BANNED_DOMAINS,\n CATEGORIES,\n CONFIDENCE_TIERS,\n DEFAULT_DURATION_HOURS,\n DURATION_HINTS,\n ENTITY_TYPES,\n LOW_CONFIDENCE_OVERRIDE,\n PROBABILITY_CALIBRATION,\n RESOLUTION_CONFIDENCE_RUBRIC,\n VIRALITY_RUBRIC,\n} from './market-defaults'\n\n// ============================================================\n// Helpers\n// ============================================================\n\nfunction utcNow(): string {\n return new Date().toUTCString()\n}\n\nfunction todayUtc(): string {\n return new Date().toISOString().slice(0, 10)\n}\n\nfunction bannedDomainsBlock(domains: readonly string[]): string {\n return `BANNED RESOLUTION DOMAINS (JS-rendered/auth-walled): ${domains.join(', ')}. Use alternatives or set confidence \u2264 2.`\n}\n\nfunction categoryEnum(cats: readonly string[]): string {\n return cats.join('|')\n}\n\n// ============================================================\n// 1. Market Generation (admin / interactive)\n// ============================================================\n\nexport interface MarketGenerationPromptConfig {\n /** Extra instructions appended to the system prompt. */\n extraInstructions?: string\n /** Override the list of valid categories. */\n categories?: readonly string[]\n /** Default suggested duration in hours. */\n defaultDurationHours?: number\n /** URL guidance block appended to the prompt. */\n urlGuidance?: string\n /** Override banned domains list. */\n bannedDomains?: readonly string[]\n}\n\nexport function buildMarketGenerationPrompt(\n overrides?: Partial<MarketGenerationPromptConfig>,\n): string {\n const cfg = {\n categories: CATEGORIES as readonly string[],\n defaultDurationHours: DEFAULT_DURATION_HOURS,\n bannedDomains: BANNED_DOMAINS as readonly string[],\n ...overrides,\n }\n\n return `You are a prediction market designer for Prophecy, a blockchain-based prediction market platform. Given a user's natural language prompt, generate a complete, well-structured prediction market.\n\nCURRENT DATE/TIME: ${utcNow()}\n\nReturn ONLY valid JSON (no markdown, no code fences) with this exact structure:\n{\n \"question\": \"A clear, specific yes/no question or multi-option question\",\n \"description\": \"2-3 sentence description explaining what this market is about and how it resolves\",\n \"resolution_criteria\": \"Precise criteria for how this market will be resolved, including data sources\",\n \"prompt\": \"Instructions for the AI resolver: what to look for on the resolution page and how to determine YES or NO\",\n \"options\": [\"YES\", \"NO\"],\n \"expected_result\": \"YES\",\n \"category\": \"${categoryEnum(cfg.categories)}\",\n \"subcategory\": \"a more specific subcategory\",\n \"tags\": [\"relevant\", \"tags\", \"for\", \"discovery\"],\n \"suggested_duration_hours\": ${cfg.defaultDurationHours},\n \"source_references\": [\"https://relevant-source.com/specific-page\"],\n \"news_context\": [{\"title\": \"Article headline\", \"url\": \"https://source.com/article\", \"source\": \"Publication Name\"}]\n}\n\nNews context (news_context field):\n- Include 2-4 real, relevant news articles that provide background context for this market.\n- Each entry needs: \"title\" (article headline), \"url\" (full URL to the article), \"source\" (publication name).\n- Only include articles you found via web search \u2014 do NOT fabricate URLs. Return [] if none found.\n\nRules:\n- The question must be specific, unambiguous, and have a clear resolution date or condition\n- CRITICAL: The event MUST be in the future. Use web search to verify the current state of events.\n - If the user says \"next X\", search to find what the ACTUAL next upcoming X is \u2014 do NOT rely on your training data for schedules, fixtures, or dates.\n - If a specific event has ALREADY HAPPENED (results exist), do NOT create a market for it. Find the next upcoming instance instead.\n - Example: if user says \"next F1 race winner\" and the Australian GP already happened, find the actual next race on the calendar.\n- If the user specifies custom options (not yes/no), use those options instead\n- For multi-option markets (e.g. \"who will win\"), use web search to verify the options are CURRENT participants. For sports, use the current season's roster/entry list \u2014 not last year's. For elections, use confirmed candidates. Always include an \"Other\" option as the last choice.\n- expected_result should be one of the options\n- suggested_duration_hours should be reasonable for the question (1-720 hours). The market MUST end BEFORE the event resolves \u2014 set duration so trading closes just before the event starts/result is announced.\n- source_references should be real, relevant websites that could help verify the outcome \u2014 use FULL URLs to specific pages, not just domains\n- Do NOT guess URL path segments you are unsure about (e.g., race numbers, event IDs). Use stable hub/event pages instead.\n- The prompt field is what the AI resolver will see when resolving the market \u2014 make it a clear, answerable question\n- Keep descriptions concise but informative\n- Tags should be lowercase, relevant keywords\n${cfg.urlGuidance ? `\\n${cfg.urlGuidance}` : ''}\n${cfg.extraInstructions ? `\\n${cfg.extraInstructions}` : ''}\n${bannedDomainsBlock(cfg.bannedDomains)}`\n}\n\n// ============================================================\n// 2. Market Reframing (pipeline / cron)\n// ============================================================\n\nexport interface ReframePromptConfig {\n categories?: readonly string[]\n durationHints?: Record<string, string>\n bannedDomains?: readonly string[]\n extraInstructions?: string\n}\n\nexport function buildReframePrompt(overrides?: Partial<ReframePromptConfig>): string {\n const cfg = {\n categories: CATEGORIES as readonly string[],\n durationHints: DURATION_HINTS,\n bannedDomains: BANNED_DOMAINS as readonly string[],\n ...overrides,\n }\n\n const durationHintStr = Object.entries(cfg.durationHints)\n .map(([k, v]) => `${k} ${v}`)\n .join(', ')\n\n return `You are a prediction market designer for Prophecy, a blockchain-based prediction market platform. Reframe market candidates as SHORT-DURATION prediction markets with clear, near-term resolution.\n\nMARKET FORMAT:\n\nBINARY (options: [\"YES\", \"NO\"]): For straightforward yes/no propositions \u2014 price targets, policy decisions, head-to-head matchups.\n\nMULTI-OUTCOME (options: [\"Option A\", \"Option B\", ..., \"Other\"]): PREFER this for \"who will win\", \"which X\", or any question with 3+ possible outcomes. 3-8 options (including \"Other\"), each with >2% chance. Frame as \"Who/Which/What will...\" not yes/no.\n\nHIDDEN MULTI-OUTCOME DETECTION \u2014 CRITICAL (overrides all other rules):\nConvert binary to multi-outcome when the underlying reality is a multi-way contest. Test: \"Could a different entity plausibly achieve this instead?\" If yes \u2192 MUST convert.\n- \"Will [X] win [tournament/award]?\" \u2192 \"Who will win [tournament]?\" with all realistic contenders\n- \"Will [X] be ranked #N / be first to [Y]?\" \u2192 \"Which [entity] will...?\" with contenders\nExamples: \"Will Djokovic win the French Open?\" \u2192 \"Who will win the 2026 French Open?\" with [Djokovic, Sinner, Alcaraz, Zverev, Other]\nDo NOT convert genuinely binary questions: price targets, policy decisions, weather, head-to-head matches.\nWhen converting, include 4-8 realistic contenders plus \"Other\".\n\nReturn ONLY valid JSON (no markdown, no code fences):\n{\"question\":\"...\", \"description\":\"2-3 sentences\", \"resolution_criteria\":\"...\", \"prompt\":\"AI resolver instructions\", \"options\":[\"YES\",\"NO\"], \"expected_result\":\"YES\", \"category\":\"${categoryEnum(cfg.categories)}\", \"subcategory\":\"...\", \"tags\":[\"lowercase\"], \"suggested_duration_hours\":24, \"trading_end_time\":\"ISO 8601 UTC (optional)\", \"source_references\":[\"full URL\"], \"virality_score\":7, \"resolution_url_confidence\":8, \"is_already_decided\":false, \"already_decided_reason\":\"\", \"yes_probability\":0.55, \"option_probabilities\":null, \"news_context\":[{\"title\":\"...\", \"url\":\"...\", \"source\":\"...\"}]}\n\nFIELD GUIDANCE:\n- prompt: Binary \u2192 tell agent what to check and YES/NO criteria. Multi-outcome \u2192 tell agent which option won, returning exact option string.\n- yes_probability (binary, 0.0-1.0) OR option_probabilities (multi-outcome array summing to ~1.0). Use source prices/odds when available. Avoid extremes (<0.05 or >0.95).\n- trading_end_time: preferred when event time is known. Close when event CONCLUDES (sports: kickoff + match duration + buffer; crypto: 1-6h; news: 2-6h; awards: ceremony end).\n- suggested_duration_hours: fallback when trading_end_time not set. Vary durations \u2014 ${durationHintStr}. Do NOT default to 24h.\n- news_context: 2-4 real articles with title, url, source. Only include URLs you're confident exist. Empty array [] if none.\n\nSTALENESS \u2014 CRITICAL:\nIf the event has ALREADY OCCURRED or result is ALREADY KNOWN (check the date/time in user message), set \"is_already_decided\": true with reason. When unsure, err on the side of marking decided.\n\nQUESTION NAMING \u2014 be SPECIFIC:\nAlways include teams/competitors + competition, price thresholds + timeframe, specific event/award names, who + what + when. A reader must understand the question without additional context.\n\nSCORING:\n- virality_score (1-10): ${Object.entries(VIRALITY_RUBRIC)\n .map(([k, v]) => `${k} ${v}`)\n .join(', ')}.\n- resolution_url_confidence (1-10): ${Object.entries(RESOLUTION_CONFIDENCE_RUBRIC)\n .map(([k, v]) => `${k} ${v}`)\n .join(', ')}.\n\nSOURCE-SPECIFIC RULES:\n- Crypto: Use CoinGecko coin pages, confidence 9-10, duration 1-6h.\n- Sports: Use DATE-SPECIFIC ESPN scoreboards (e.g. espn.com/nba/scoreboard/_/date/20260301). Generic /scoreboard URLs will fail for past dates. BBC Sport date-specific URLs also work. Esports: HLTV results for CS, not gol.gg/op.gg homepages.\n- News: Find specific data-rich pages. For search-based: use news.google.com/search?q=... URLs.\n- Polymarket: Keep same trading_end_time, proposition, deadline, threshold. Use outcomePrices for probabilities. EXCEPTION: convert hidden multi-outcome as above.\n\n${bannedDomainsBlock(cfg.bannedDomains)}\n\nsource_references[0] is the URL the AI resolver visits. Must be a FULL URL to a specific page with relevant data. The \"prompt\" field tells the resolver exactly what to look for on that page.\n${cfg.extraInstructions ? `\\n${cfg.extraInstructions}` : ''}`\n}\n\n// ============================================================\n// 3. Multi-Outcome Grouping\n// ============================================================\n\nexport interface GroupingPromptConfig {\n minOptions?: number\n maxOptions?: number\n extraInstructions?: string\n}\n\nexport function buildGroupingPrompt(overrides?: Partial<GroupingPromptConfig>): string {\n const cfg = { minOptions: 4, maxOptions: 10, ...overrides }\n\n return `You are a prediction market analyst. Given a list of market candidate headlines, identify groups of candidates that are about the SAME underlying event or competition and should be combined into a single multi-outcome market instead of separate binary yes/no markets.\n\nExamples of candidates that should be grouped:\n- \"Will Naomi Osaka win the 2026 WTA Miami Open?\" + \"Will Aryna Sabalenka win the 2026 WTA Miami Open?\" \u2192 \"Who will win the 2026 WTA Miami Open?\" with all realistic contenders\n- \"Will OpenAI have the highest Chatbot Arena score?\" + \"Will Anthropic have the highest Chatbot Arena score?\" \u2192 \"Which AI lab will have the highest Chatbot Arena score?\" with all major labs\n- \"Will Andrey Esipenko win the FIDE Candidates?\" + \"Will Fabiano Caruana win the FIDE Candidates?\" \u2192 \"Who will win the FIDE Candidates Tournament?\" with all participants\n\nExamples that should NOT be grouped:\n- \"Will Bitcoin hit $100k?\" \u2014 standalone binary, not a multi-way competition\n- \"Will Liverpool beat Manchester City?\" \u2014 head-to-head match, not a multi-way \"who will win the league\"\n- Unrelated markets about different events\n\nFor each group you identify:\n1. Write the multi-outcome question (e.g., \"Who will win X?\")\n2. List ALL realistic options, not just the ones from the candidates. Add well-known contenders, favorites, and realistic possibilities that the source missed. Include \"Other\" as the last option.\n3. Aim for ${cfg.minOptions}-${cfg.maxOptions} options (including Other). Include anyone with a realistic chance (>2%).\n4. Only group candidates that are clearly about the same specific event/competition.\n\nReturn ONLY valid JSON (no markdown, no code fences):\n{ \"groups\": [{ \"question\": \"...\", \"candidateIndices\": [0, 3, 7], \"options\": [\"Option A\", \"Option B\", ..., \"Other\"] }] }\n\nIf no candidates should be grouped, return: { \"groups\": [] }\n${cfg.extraInstructions ? `\\n${cfg.extraInstructions}` : ''}`\n}\n\n// ============================================================\n// 4. Resolution Evaluation\n// ============================================================\n\nexport interface ResolutionEvalPromptConfig {\n confidenceTiers?: typeof CONFIDENCE_TIERS\n lowConfidenceOverride?: number\n extraInstructions?: string\n}\n\nexport function buildResolutionEvalPrompt(overrides?: Partial<ResolutionEvalPromptConfig>): string {\n const cfg = {\n confidenceTiers: CONFIDENCE_TIERS,\n lowConfidenceOverride: LOW_CONFIDENCE_OVERRIDE,\n ...overrides,\n }\n\n const tiers = cfg.confidenceTiers\n\n return `You are evaluating whether a prediction market resolved correctly. You will be given the market question, resolution criteria, and content from a resolution URL. Your job is to determine the outcome based SOLELY on evidence found in the URL content.\n\nEVIDENCE RULES:\n- Your ONLY source of truth is the provided URL content. Nothing else.\n- If the URL content does not explicitly contain the specific information needed to answer the question, return UNKNOWN with confidence below 0.1.\n- This includes cases where: the page is a homepage or generic listing, the page doesn't mention the specific event/match/result, the page has related but not directly answering content, or the data is ambiguous.\n- Do NOT use your training data, general knowledge, or prior beliefs. Even if you are certain you know the answer, you MUST return UNKNOWN unless the URL content itself contains the evidence.\n- Do NOT reason about likely outcomes based on team strength, historical patterns, market context, or common sense.\n\nCONFIDENCE RULES:\n- Confidence measures how clearly the URL content answers the question \u2014 NOT how sure you are of the real-world answer.\n- ${tiers.explicit.min}-${tiers.explicit.max}: ${tiers.explicit.label} (e.g. a scoreboard showing the final score, a price page showing the current price).\n- ${tiers.strong.min}-${tiers.strong.max}: ${tiers.strong.label} (e.g. a match report that implies the result without stating the score).\n- ${tiers.tangential.min}-${tiers.tangential.max}: ${tiers.tangential.label}.\n- ${tiers.none.min}-${tiers.none.max}: ${tiers.none.label}. You MUST return UNKNOWN in this case.\n\nCurrent date/time: ${utcNow()}\n\nRespond with ONLY valid JSON (no markdown, no code fences):\n{\n \"outcome\": \"YES\" or \"NO\" or \"UNKNOWN\",\n \"confidence\": 0.0 to 1.0,\n \"reasoning\": \"Quote or cite the specific evidence from the URL content that supports your answer, or explain why the URL content was insufficient\"\n}\n${cfg.extraInstructions ? `\\n${cfg.extraInstructions}` : ''}`\n}\n\n// ============================================================\n// 5. Carousel Curation\n// ============================================================\n\nexport interface CarouselPromptConfig {\n maxSlots?: number\n extraCriteria?: string\n extraInstructions?: string\n}\n\nexport function buildCarouselPrompt(overrides?: Partial<CarouselPromptConfig>): string {\n const cfg = { maxSlots: 10, ...overrides }\n\n return `You are a prediction market curator selecting events for a homepage carousel.\n\nPick exactly ${cfg.maxSlots} events from the candidate list to maximize engagement. Selection criteria (priority order):\n1. Trending & timely \u2014 cross-reference with Polymarket trending data. Prefer current hot topics.\n2. Category diversity \u2014 spread across politics, sport, tech, pop_culture, crypto, entertainment, science.\n3. Urgency \u2014 events closing within 1-7 days beat distant ones.\n4. Volume signal \u2014 higher volume = more interest.\n5. De-prioritize lightning markets (5-min BTC) unless genuinely trending.\n6. Match Polymarket trends \u2014 prefer events covering the same hot topics.\n${cfg.extraCriteria ? `7. ${cfg.extraCriteria}` : ''}\n\nONLY select from candidate event ids. Return ONLY raw JSON:\n{\"selected_event_ids\": [123, 456, ...], \"reasoning\": \"Brief explanation\"}\n${cfg.extraInstructions ? `\\n${cfg.extraInstructions}` : ''}`\n}\n\n// ============================================================\n// 6. Probability Estimation (signal refresh)\n// ============================================================\n\nexport interface ProbabilityEstimationPromptConfig {\n calibration?: typeof PROBABILITY_CALIBRATION\n extraInstructions?: string\n}\n\nexport function buildProbabilityEstimationPrompt(\n overrides?: Partial<ProbabilityEstimationPromptConfig>,\n): string {\n const cfg = {\n calibration: PROBABILITY_CALIBRATION,\n ...overrides,\n }\n\n const cal = cfg.calibration\n\n return `You are a world-class probability estimation expert with deep domain knowledge. Given a group of mutually exclusive outcomes, estimate realistic probabilities that each will occur. Your probabilities MUST sum to exactly 1.0.\n\nCurrent date: ${todayUtc()}\n\nCALIBRATION RULES \u2014 critical for realistic odds:\n- Frontrunners/favorites should get MUCH higher probabilities than underdogs\n- For sports with many competitors (F1, tennis draws, horse racing):\n - Top 3-5 contenders: ${Math.round(cal.frontrunner.min * 100)}-${Math.round(cal.frontrunner.max * 100)}% each\n - Midfield/competitive: ${Math.round(cal.midfield.min * 100)}-${Math.round(cal.midfield.max * 100)}% each\n - Backmarkers/long shots: ${cal.backmarker.min * 100}-${cal.backmarker.max * 100}% each\n- For team sports (soccer, basketball): use recent form, home advantage, head-to-head\n- For politics: use polling data, expert consensus, incumbency advantage\n- NEVER give near-uniform probabilities unless outcomes are genuinely equal\n- Your estimates should resemble real betting/prediction market odds\n\nReturn ONLY a JSON object mapping each option name (exactly as given) to its probability. No explanation.\n${cfg.extraInstructions ? `\\n${cfg.extraInstructions}` : ''}`\n}\n\n// ============================================================\n// 7. Image Entity Extraction\n// ============================================================\n\nexport interface EntityExtractionPromptConfig {\n entityTypes?: readonly string[]\n maxEntities?: number\n extraInstructions?: string\n}\n\nexport function buildEntityExtractionPrompt(\n overrides?: Partial<EntityExtractionPromptConfig>,\n): string {\n const cfg = {\n entityTypes: ENTITY_TYPES as readonly string[],\n maxEntities: 2,\n ...overrides,\n }\n\n return `Analyze this prediction market question and extract the PRIMARY visual entity that should be shown as a thumbnail image.\n\nReturn ONLY valid JSON (no markdown) with this structure:\n{\n \"entities\": [\n {\n \"type\": \"${cfg.entityTypes.join('|')}\",\n \"name\": \"exact name\",\n \"searchQuery\": \"optimized search query for finding an image\"\n }\n ]\n}\n\nRules:\n- Return at most ${cfg.maxEntities} entities, prioritizing the MOST VISUALLY DISTINCTIVE one first\n- For geopolitical events (wars, treaties, sanctions): extract the PRIMARY country involved\n- For sports: extract the team name (not the league)\n- For people (politicians, celebrities, athletes): extract the person's full name\n- For companies/stocks: extract the company name\n- For crypto: extract the cryptocurrency name (e.g., \"Bitcoin\", not \"BTC price\")\n- For abstract topics: use type \"topic\" with a concrete visual search query\n\nExamples:\n- \"Will Bitcoin hit $100k?\" \u2192 [{\"type\": \"crypto\", \"name\": \"bitcoin\"}]\n- \"Bank of Japan interest rate decision\" \u2192 [{\"type\": \"country\", \"name\": \"japan\"}]\n- \"Will Trump win the election?\" \u2192 [{\"type\": \"person\", \"name\": \"Donald Trump\", \"searchQuery\": \"Donald Trump portrait\"}]\n- \"Lakers vs Celtics game\" \u2192 [{\"type\": \"team\", \"name\": \"Los Angeles Lakers\", \"searchQuery\": \"Lakers logo\"}]\n- \"S&P 500 price movement\" \u2192 [{\"type\": \"topic\", \"name\": \"S&P 500\", \"searchQuery\": \"stock market chart\"}]\n${cfg.extraInstructions ? `\\n${cfg.extraInstructions}` : ''}`\n}\n\n// ============================================================\n// 8. News Context\n// ============================================================\n\nexport interface NewsContextPromptConfig {\n maxArticles?: number\n preferredSources?: string[]\n extraInstructions?: string\n}\n\nexport function buildNewsContextPrompt(overrides?: Partial<NewsContextPromptConfig>): string {\n const cfg = {\n maxArticles: 4,\n preferredSources: ['ESPN', 'BBC', 'Reuters', 'CoinDesk', 'Bloomberg', 'AP News'],\n ...overrides,\n }\n\n return `You are a news research assistant. Given a prediction market question, find 2-${cfg.maxArticles} real, currently accessible news articles that provide relevant background context for this market.\n\nReturn ONLY valid JSON (no markdown, no code fences) \u2014 an array of objects:\n[{\"title\": \"Article headline\", \"url\": \"https://full-url.com/article\", \"source\": \"Publication Name\"}]\n\nRules:\n- Only include articles you found via web search \u2014 do NOT fabricate or guess URLs.\n- Prefer recent articles from reputable sources (${cfg.preferredSources.join(', ')}, etc.).\n- For sports: match previews, team form, injury reports, head-to-head records.\n- For crypto: price analysis, market commentary, regulatory news.\n- For politics: polling data, policy analysis, expert commentary.\n- If you cannot find relevant articles, return an empty array [].\n${cfg.extraInstructions ? `\\n${cfg.extraInstructions}` : ''}`\n}\n\n// ============================================================\n// URL Guidance (shared block used by multiple prompts)\n// ============================================================\n\nexport interface UrlGuidanceConfig {\n bannedDomains?: readonly string[]\n extraGuidance?: string\n}\n\nexport function buildUrlGuidanceBlock(overrides?: Partial<UrlGuidanceConfig>): string {\n const cfg = {\n bannedDomains: BANNED_DOMAINS as readonly string[],\n ...overrides,\n }\n\n return `Resolution URL confidence rubric (resolution_url_confidence, 1-10):\n- 9-10: URL always contains the answer (CoinGecko price page, ESPN scoreboard, official results page)\n- 7-8: URL very likely has the answer (major news site live page, official standings)\n- 4-6: URL might have relevant info but uncertain (general news article, social media)\n- 1-3: URL unlikely to have a clear, machine-readable answer\n\nSource-specific URL guidance:\n- Crypto: Use CoinGecko coin pages (e.g., https://www.coingecko.com/en/coins/bitcoin) \u2014 these always show current price. Resolution URL confidence should be 9-10.\n- Sports: ALWAYS use DATE-SPECIFIC scoreboards with the date parameter in the URL path. Generic scoreboards only show today's games and will fail for past dates.\n - GOOD: \"https://www.espn.com/nba/scoreboard/_/date/20260301\" \u2014 shows March 1 games specifically\n - BAD: \"https://www.espn.com/nba/scoreboard\" \u2014 only shows today's date, useless for past/future games\n - BBC Sport date-specific URLs: \"https://www.bbc.co.uk/sport/football/scores-fixtures/2026-02-28\"\n - For motorsport: Use the event hub page (e.g., \"https://www.formula1.com/en/racing/2025/australia\") which links to qualifying/race results.\n - For esports: Use HLTV results (https://www.hltv.org/results) for CS, match-specific Liquipedia pages for LoL/Dota.\n - Resolution URL confidence 7-9 for date-specific URLs, 3 or below for generic scoreboards.\n- News: Find the most specific, data-rich page possible. For search-based resolution: Use Google News search URLs like https://news.google.com/search?q=specific+search+terms.\n- Pop culture / entertainment: Use official announcement pages or news search URLs.\n\n${bannedDomainsBlock(cfg.bannedDomains)}\nIf the only resolution URL for a market would be a banned domain, either find an alternative or set resolution_url_confidence to 2 or below.\n${cfg.extraGuidance ? `\\n${cfg.extraGuidance}` : ''}`\n}\n", "/**\n * Market validation utilities \u2014 shared logic for clamping, URL checks,\n * and LLM response parsing.\n *\n * These are the pure functions that prophecy-social currently has spread\n * across market-types.ts, url-validation.ts, and market-pipeline.ts.\n * Partners can use them directly or through the higher-level prompt builders.\n */\n\nimport {\n BANNED_DOMAINS,\n DEFAULT_CATEGORY,\n DEFAULT_DURATION_HOURS,\n MAX_BINARY_PROBABILITY,\n MAX_DURATION_HOURS,\n MAX_OPTION_PROBABILITY,\n MIN_BINARY_PROBABILITY,\n MIN_DURATION_HOURS,\n MIN_OPTION_PROBABILITY,\n} from './market-defaults'\n\n// ============================================================\n// Duration\n// ============================================================\n\n/**\n * Clamp a duration value to the allowed range.\n * Returns the default if the input is not a finite number.\n */\nexport function clampDuration(\n hours: unknown,\n opts?: { min?: number; max?: number; fallback?: number },\n): number {\n const min = opts?.min ?? MIN_DURATION_HOURS\n const max = opts?.max ?? MAX_DURATION_HOURS\n const fallback = opts?.fallback ?? DEFAULT_DURATION_HOURS\n const n = typeof hours === 'number' && Number.isFinite(hours) ? hours : fallback\n return Math.min(max, Math.max(min, n))\n}\n\n// ============================================================\n// Probability\n// ============================================================\n\n/**\n * Clamp a binary (YES/NO) probability to the allowed range.\n */\nexport function clampBinaryProbability(p: number, opts?: { min?: number; max?: number }): number {\n const min = opts?.min ?? MIN_BINARY_PROBABILITY\n const max = opts?.max ?? MAX_BINARY_PROBABILITY\n return Math.min(max, Math.max(min, p))\n}\n\n/**\n * Clamp each option probability and normalise so the array sums to 1.0.\n */\nexport function normalizeOptionProbabilities(\n probs: number[],\n opts?: { min?: number; max?: number },\n): number[] {\n const min = opts?.min ?? MIN_OPTION_PROBABILITY\n const max = opts?.max ?? MAX_OPTION_PROBABILITY\n\n const clamped = probs.map((p) => Math.min(max, Math.max(min, p)))\n const sum = clamped.reduce((a, b) => a + b, 0)\n if (sum === 0) return probs.map(() => 1 / probs.length)\n return clamped.map((p) => p / sum)\n}\n\n// ============================================================\n// URL validation\n// ============================================================\n\n/**\n * Returns true if the string is a valid http(s) URL.\n */\nexport function isValidUrl(url: string): boolean {\n try {\n const parsed = new URL(url)\n return parsed.protocol === 'http:' || parsed.protocol === 'https:'\n } catch {\n return false\n }\n}\n\n/**\n * Returns true if the URL's hostname is in the banned list.\n * Accepts an optional custom banned list (defaults to SDK's BANNED_DOMAINS).\n */\nexport function isBannedDomain(url: string, bannedList?: readonly string[]): boolean {\n const banned = new Set(bannedList ?? BANNED_DOMAINS)\n try {\n const hostname = new URL(url).hostname\n return banned.has(hostname) || banned.has(hostname.replace(/^www\\./, ''))\n } catch {\n return false\n }\n}\n\n/**\n * Generate a Google News search fallback URL from a market question.\n */\nexport function googleNewsFallbackUrl(question: string): string {\n const terms = question\n .replace(/[?!.,;:'\"]/g, '')\n .split(/\\s+/)\n .slice(0, 10)\n .join('+')\n return `https://news.google.com/search?q=${encodeURIComponent(terms)}`\n}\n\n// ============================================================\n// LLM response parsing\n// ============================================================\n\nexport type GeneratedMarketBase = {\n question: string\n description: string\n resolution_criteria: string\n prompt: string\n options: string[]\n expected_result: string\n category: string\n subcategory: string\n tags: string[]\n suggested_duration_hours: number\n source_references: string[]\n}\n\n/**\n * Parse an LLM JSON response into a GeneratedMarketBase.\n *\n * Handles markdown code fences, trailing text, unescaped newlines,\n * and trailing commas \u2014 all common LLM quirks.\n *\n * Returns the typed base plus the raw parsed record for callers\n * that need to access extra fields (virality_score, etc.).\n */\nexport function parseLlmMarketJson(\n responseText: string,\n): GeneratedMarketBase & { _raw: Record<string, unknown> } {\n let jsonStr = responseText.trim()\n\n // Strip markdown code fences\n if (jsonStr.includes('```')) {\n const fenceMatch = jsonStr.match(/```(?:json)?\\s*([\\s\\S]*?)```/)\n if (fenceMatch?.[1]) {\n jsonStr = fenceMatch[1].trim()\n }\n }\n\n // Find first JSON object if response has leading text\n if (!jsonStr.startsWith('{')) {\n const braceStart = jsonStr.indexOf('{')\n if (braceStart !== -1) {\n jsonStr = jsonStr.slice(braceStart)\n }\n }\n\n // Trim trailing text after the last closing brace\n if (jsonStr.includes('}')) {\n const lastBrace = jsonStr.lastIndexOf('}')\n jsonStr = jsonStr.slice(0, lastBrace + 1)\n }\n\n // Fix unescaped newlines inside JSON string values\n jsonStr = jsonStr.replace(/\"(?:[^\"\\\\]|\\\\.)*\"/g, (match) =>\n match.replace(/\\n/g, '\\\\n').replace(/\\r/g, '\\\\r'),\n )\n\n // Strip trailing commas before } or ]\n jsonStr = jsonStr.replace(/,\\s*([}\\]])/g, '$1')\n\n let parsed: unknown\n try {\n parsed = JSON.parse(jsonStr)\n } catch {\n throw new Error('Failed to parse LLM response as JSON. Please try again.')\n }\n\n const market = parsed as Record<string, unknown>\n\n if (typeof market.question !== 'string' || !market.question) {\n throw new Error('Generated market is missing a question')\n }\n if (!Array.isArray(market.options) || market.options.length < 2) {\n throw new Error('Generated market must have at least 2 options')\n }\n\n const durationHours = clampDuration(market.suggested_duration_hours)\n\n return {\n question: market.question as string,\n description: (market.description as string) || '',\n resolution_criteria: (market.resolution_criteria as string) || '',\n prompt: (market.prompt as string) || (market.question as string),\n options: market.options as string[],\n expected_result: (market.expected_result as string) || (market.options as string[])[0] || '',\n category: (market.category as string) || DEFAULT_CATEGORY,\n subcategory: (market.subcategory as string) || '',\n tags: Array.isArray(market.tags) ? (market.tags as string[]) : [],\n suggested_duration_hours: durationHours,\n source_references: Array.isArray(market.source_references)\n ? (market.source_references as string[])\n : [],\n _raw: market,\n }\n}\n", "import type { Address, Hex } from 'viem'\r\nimport { privateKeyToAccount } from 'viem/accounts'\r\n\r\n/** Permit deadline: 60 seconds from now. */\r\nconst PERMIT_TTL_SECONDS = 60\r\n\r\n// EIP-712 domain \u2014 matches VenueRegistry contract\r\nconst EIP712_DOMAIN = {\r\n name: 'VenueRegistry',\r\n version: '1',\r\n} as const\r\n\r\nconst CREATE_MARKET_PERMIT_TYPES = {\r\n CreateMarketPermit: [\r\n { name: 'name', type: 'string' },\r\n { name: 'venueId', type: 'uint256' },\r\n { name: 'tradingStartTs', type: 'uint256' },\r\n { name: 'tradingEndTs', type: 'uint256' },\r\n { name: 'resolutionStartTs', type: 'uint256' },\r\n { name: 'resolutionEndTs', type: 'uint256' },\r\n { name: 'stakeToken', type: 'address' },\r\n { name: 'initialLiquidityBase', type: 'uint256' },\r\n { name: 'noMatchOutcome', type: 'uint8' },\r\n { name: 'resolverType', type: 'uint8' },\r\n { name: 'creator', type: 'address' },\r\n { name: 'nonce', type: 'uint256' },\r\n { name: 'deadline', type: 'uint256' },\r\n ],\r\n} as const\r\n\r\n// Req: Trade permit \u2014 venue operator signs to attribute the trade entry point to their venue.\r\n// The permit is NOT a gatekeeper \u2014 markets are permissionless. The signature attributes\r\n// which venue facilitated the trade (used for operator points scoping).\r\nconst TRADE_PERMIT_TYPES = {\r\n TradePermit: [\r\n { name: 'marketId', type: 'uint256' },\r\n { name: 'venueId', type: 'uint256' },\r\n { name: 'user', type: 'address' },\r\n { name: 'amount', type: 'uint256' },\r\n { name: 'action', type: 'uint8' },\r\n { name: 'nonce', type: 'uint256' },\r\n { name: 'deadline', type: 'uint256' },\r\n ],\r\n} as const\r\n\r\nexport interface TradePermitParams {\r\n marketId: bigint\r\n venueId: bigint\r\n user: Address\r\n amount: bigint\r\n action: number\r\n nonce: bigint\r\n operatorPrivateKey: Hex\r\n chainId: number\r\n venueRegistryAddress: Address\r\n}\r\n\r\nexport interface CreateMarketPermitParams {\r\n name: string\r\n venueId: bigint\r\n tradingStartTs: number\r\n tradingEndTs: number\r\n resolutionStartTs: number\r\n resolutionEndTs: number\r\n stakeToken: Address\r\n initialLiquidityBase: bigint\r\n noMatchOutcome: number\r\n resolverType: number\r\n creator: Address\r\n nonce: bigint\r\n operatorPrivateKey: Hex\r\n chainId: number\r\n venueRegistryAddress: Address\r\n}\r\n\r\nexport interface PermitResult {\r\n signature: Hex\r\n signer: Address\r\n deadline: bigint\r\n}\r\n\r\n/**\r\n * Sign an EIP-712 trade permit using the venue operator's private key.\r\n * Called by the venue's own backend \u2014 the key never leaves the operator's infra.\r\n */\r\nexport async function signTradePermit(params: TradePermitParams): Promise<PermitResult> {\r\n const account = privateKeyToAccount(params.operatorPrivateKey)\r\n const deadline = BigInt(Math.floor(Date.now() / 1000) + PERMIT_TTL_SECONDS)\r\n\r\n const signature = await account.signTypedData({\r\n domain: {\r\n ...EIP712_DOMAIN,\r\n chainId: params.chainId,\r\n verifyingContract: params.venueRegistryAddress,\r\n },\r\n types: TRADE_PERMIT_TYPES,\r\n primaryType: 'TradePermit',\r\n message: {\r\n marketId: params.marketId,\r\n venueId: params.venueId,\r\n user: params.user,\r\n amount: params.amount,\r\n action: params.action,\r\n nonce: params.nonce,\r\n deadline,\r\n },\r\n })\r\n\r\n return { signature, signer: account.address, deadline }\r\n}\r\n\r\n/**\r\n * Sign an EIP-712 market creation permit using the venue operator's private key.\r\n */\r\nexport async function signCreateMarketPermit(\r\n params: CreateMarketPermitParams,\r\n): Promise<PermitResult> {\r\n const account = privateKeyToAccount(params.operatorPrivateKey)\r\n const deadline = BigInt(Math.floor(Date.now() / 1000) + PERMIT_TTL_SECONDS)\r\n\r\n const signature = await account.signTypedData({\r\n domain: {\r\n ...EIP712_DOMAIN,\r\n chainId: params.chainId,\r\n verifyingContract: params.venueRegistryAddress,\r\n },\r\n types: CREATE_MARKET_PERMIT_TYPES,\r\n primaryType: 'CreateMarketPermit',\r\n message: {\r\n name: params.name,\r\n venueId: params.venueId,\r\n tradingStartTs: BigInt(params.tradingStartTs),\r\n tradingEndTs: BigInt(params.tradingEndTs),\r\n resolutionStartTs: BigInt(params.resolutionStartTs),\r\n resolutionEndTs: BigInt(params.resolutionEndTs),\r\n stakeToken: params.stakeToken,\r\n initialLiquidityBase: params.initialLiquidityBase,\r\n noMatchOutcome: params.noMatchOutcome,\r\n resolverType: params.resolverType,\r\n creator: params.creator,\r\n nonce: params.nonce,\r\n deadline,\r\n },\r\n })\r\n\r\n return { signature, signer: account.address, deadline }\r\n}\r\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["http_exports", "__export", "ApiError", "authedDelete", "authedPost", "get", "post", "request", "url", "options", "headers", "res", "body", "baseUrl", "path", "params", "key", "value", "authToken", "init_http", "__esmMin", "status", "init_http", "toWireRequest", "input", "fromWireResponse", "wire", "c", "previewRating", "partnersApiUrl", "post", "rateMarketDraft", "getEventRating", "contractAddress", "eventId", "get", "createCache", "config", "defaultTtl", "store", "key", "entry", "data", "ttlMs", "ttl", "prefix", "createPublicClient", "defineChain", "encodeFunctionData", "http", "VENUE_REGISTRY_ABI", "PROPHECY_CORE_ABI", "PROPHECY_SETTLEMENT_ABI", "createChainClient", "config", "chain", "client", "venueId", "user", "marketId", "core", "name", "yesPool", "noPool", "marketIds", "calls", "r", "createVenueAuth", "venueId", "apiKey", "createEventsNamespace", "partnersApiUrl", "venueAuth", "postEvent", "path", "body", "url", "res", "err", "ApiError", "wallet", "marketId", "init_http", "createEventsApiNamespace", "dataApiUrl", "cache", "params", "url", "s", "res", "ApiError", "data", "contractAddress", "eventId", "key", "cached", "result", "get", "init_http", "createFaucetNamespace", "partnersApiUrl", "venueId", "venueAuth", "wallet", "get", "authedPost", "init_http", "getPPLeaderboard", "partnersApiUrl", "params", "get", "getPnLLeaderboard", "dataApiUrl", "getVolumeLeaderboard", "init_http", "createMarketsNamespace", "dataApiUrl", "cache", "params", "url", "s", "res", "ApiError", "contractAddress", "marketId", "key", "cached", "result", "get", "init_http", "createSeasonNamespace", "partnersApiUrl", "cache", "key", "cached", "result", "get", "init_http", "createUserNamespace", "partnersApiUrl", "cache", "wallet", "params", "key", "cached", "result", "get", "post", "init_http", "createVenueNamespace", "partnersApiUrl", "cache", "venueId", "params", "key", "cached", "result", "get", "markets", "authToken", "authedPost", "contractAddress", "marketId", "authedDelete", "season", "createProphecyClient", "config", "cache", "createCache", "chain", "createChainClient", "venueAuth", "createVenueAuth", "noAuthEvents", "createMarketsNamespace", "createEventsApiNamespace", "createVenueNamespace", "createUserNamespace", "createSeasonNamespace", "params", "getPPLeaderboard", "getPnLLeaderboard", "getVolumeLeaderboard", "createFaucetNamespace", "createEventsNamespace", "input", "rateMarketDraft", "previewRating", "contractAddress", "eventId", "getEventRating", "init_http", "generateText", "z", "marketDefinitionSchema", "buildDefaultSystemPrompt", "createMarketDefinition", "input", "systemPrompt", "timeContext", "text", "CATEGORIES", "DEFAULT_CATEGORY", "ENTITY_TYPES", "VIRALITY_THRESHOLD", "RESOLUTION_CONFIDENCE_THRESHOLD", "SIMILARITY_THRESHOLD", "DEFAULT_DURATION_HOURS", "MIN_DURATION_HOURS", "MAX_DURATION_HOURS", "MIN_BINARY_PROBABILITY", "MAX_BINARY_PROBABILITY", "MIN_OPTION_PROBABILITY", "MAX_OPTION_PROBABILITY", "DEFAULT_LIQUIDITY", "DEFAULT_TRADING_START_BUFFER_SECONDS", "DEFAULT_RESOLUTION_HOURS", "ACTIVE_MARKET_CAP", "BANNED_DOMAINS", "DURATION_HINTS", "VIRALITY_RUBRIC", "RESOLUTION_CONFIDENCE_RUBRIC", "CONFIDENCE_TIERS", "LOW_CONFIDENCE_OVERRIDE", "PROBABILITY_CALIBRATION", "MARKET_DEFAULTS", "utcNow", "todayUtc", "bannedDomainsBlock", "domains", "categoryEnum", "cats", "buildMarketGenerationPrompt", "overrides", "cfg", "CATEGORIES", "BANNED_DOMAINS", "buildReframePrompt", "DURATION_HINTS", "durationHintStr", "k", "v", "VIRALITY_RUBRIC", "RESOLUTION_CONFIDENCE_RUBRIC", "buildGroupingPrompt", "buildResolutionEvalPrompt", "CONFIDENCE_TIERS", "LOW_CONFIDENCE_OVERRIDE", "tiers", "buildCarouselPrompt", "buildProbabilityEstimationPrompt", "PROBABILITY_CALIBRATION", "cal", "buildEntityExtractionPrompt", "ENTITY_TYPES", "buildNewsContextPrompt", "buildUrlGuidanceBlock", "clampDuration", "hours", "opts", "min", "max", "fallback", "n", "clampBinaryProbability", "p", "normalizeOptionProbabilities", "probs", "clamped", "sum", "a", "b", "isValidUrl", "url", "parsed", "isBannedDomain", "bannedList", "banned", "BANNED_DOMAINS", "hostname", "googleNewsFallbackUrl", "question", "terms", "parseLlmMarketJson", "responseText", "jsonStr", "fenceMatch", "braceStart", "lastBrace", "match", "market", "durationHours", "DEFAULT_CATEGORY", "privateKeyToAccount", "PERMIT_TTL_SECONDS", "EIP712_DOMAIN", "CREATE_MARKET_PERMIT_TYPES", "TRADE_PERMIT_TYPES", "signTradePermit", "params", "account", "deadline", "signCreateMarketPermit"]
|
|
7
7
|
}
|