@prophecy-dev/sdk 0.1.0
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/__tests__/chain.test.d.ts +2 -0
- package/dist/__tests__/chain.test.d.ts.map +1 -0
- package/dist/__tests__/market-creation.test.d.ts +2 -0
- package/dist/__tests__/market-creation.test.d.ts.map +1 -0
- package/dist/__tests__/permits.test.d.ts +2 -0
- package/dist/__tests__/permits.test.d.ts.map +1 -0
- package/dist/arbiter.d.ts +39 -0
- package/dist/arbiter.d.ts.map +1 -0
- package/dist/auth.d.ts +13 -0
- package/dist/auth.d.ts.map +1 -0
- package/dist/cache.d.ts +19 -0
- package/dist/cache.d.ts.map +1 -0
- package/dist/chain.d.ts +59 -0
- package/dist/chain.d.ts.map +1 -0
- package/dist/client.d.ts +102 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/events-api.d.ts +133 -0
- package/dist/events-api.d.ts.map +1 -0
- package/dist/events.d.ts +22 -0
- package/dist/events.d.ts.map +1 -0
- package/dist/faucet.d.ts +30 -0
- package/dist/faucet.d.ts.map +1 -0
- package/dist/http.d.ts +14 -0
- package/dist/http.d.ts.map +1 -0
- package/dist/identity.d.ts +32 -0
- package/dist/identity.d.ts.map +1 -0
- package/dist/index.cjs +27 -0
- package/dist/index.cjs.map +7 -0
- package/dist/index.d.ts +18 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +27 -0
- package/dist/index.js.map +7 -0
- package/dist/leaderboard.d.ts +62 -0
- package/dist/leaderboard.d.ts.map +1 -0
- package/dist/llm.d.ts +22 -0
- package/dist/llm.d.ts.map +1 -0
- package/dist/market-creation.d.ts +68 -0
- package/dist/market-creation.d.ts.map +1 -0
- package/dist/markets.d.ts +42 -0
- package/dist/markets.d.ts.map +1 -0
- package/dist/permits.d.ts +44 -0
- package/dist/permits.d.ts.map +1 -0
- package/dist/points.d.ts +38 -0
- package/dist/points.d.ts.map +1 -0
- package/dist/season.d.ts +31 -0
- package/dist/season.d.ts.map +1 -0
- package/dist/user.d.ts +91 -0
- package/dist/user.d.ts.map +1 -0
- package/dist/venue.d.ts +56 -0
- package/dist/venue.d.ts.map +1 -0
- package/package.json +62 -0
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/http.ts", "../src/index.ts", "../src/arbiter.ts", "../src/chain.ts", "../src/auth.ts", "../src/cache.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/market-creation.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", "// 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", "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", "/**\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", "index_exports", "__export", "ApiError", "createChainClient", "createEventsApiNamespace", "createMarketDefinition", "createProphecyClient", "getPPLeaderboard", "getPnLLeaderboard", "getVolumeLeaderboard", "marketDefinitionSchema", "rateMarketDraft", "signCreateMarketPermit", "signTradePermit", "__toCommonJS", "init_http", "toWireRequest", "input", "fromWireResponse", "wire", "c", "rateMarketDraft", "arbiterUrl", "post", "import_viem", "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", "createCache", "config", "defaultTtl", "store", "key", "entry", "data", "ttlMs", "ttl", "prefix", "createEventsNamespace", "partnersApiUrl", "venueAuth", "postEvent", "path", "body", "url", "res", "err", "ApiError", "wallet", "marketId", "init_http", "createEventsApiNamespace", "dataApiUrl", "cache", "params", "url", "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", "init_http", "import_ai", "import_zod", "marketDefinitionSchema", "buildDefaultSystemPrompt", "createMarketDefinition", "input", "systemPrompt", "timeContext", "text", "import_accounts", "PERMIT_TTL_SECONDS", "EIP712_DOMAIN", "CREATE_MARKET_PERMIT_TYPES", "TRADE_PERMIT_TYPES", "signTradePermit", "params", "account", "deadline", "signCreateMarketPermit"]
|
|
7
|
+
}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export { type ArbiterCriterion, type ArbiterRating, type ArbiterRatingBand, type ArbiterRatingRequest, rateMarketDraft, } from './arbiter';
|
|
2
|
+
export type { VenueAuth } from './auth';
|
|
3
|
+
export type { CacheConfig } from './cache';
|
|
4
|
+
export { type ChainClient, type ChainConfig, createChainClient, type MarketCore, type SharePosition, } from './chain';
|
|
5
|
+
export { createProphecyClient, type ProphecyClient, type ProphecyClientConfig, } from './client';
|
|
6
|
+
export type { EventResult, EventsNamespace } from './events';
|
|
7
|
+
export { createEventsApiNamespace, type EventContracts, type EventData, type EventMarketData, type EventMarketPrice, type EventMarketStats, type EventResolution, type EventResolver, type EventStats, type EventsApiNamespace, type EventToken, type SearchEventsParams, } from './events-api';
|
|
8
|
+
export type { FaucetClaimResult, FaucetEligibility, FaucetNamespace, } from './faucet';
|
|
9
|
+
export { ApiError } from './http';
|
|
10
|
+
export { getPnLLeaderboard, getPPLeaderboard, getVolumeLeaderboard, type PnLLeaderboardEntry, type PnLLeaderboardParams, type PPLeaderboardEntry, type PPLeaderboardParams, type VolumeLeaderboardEntry, type VolumeLeaderboardParams, } from './leaderboard';
|
|
11
|
+
export type { LanguageModel } from './llm';
|
|
12
|
+
export { createMarketDefinition, type MarketDefinition, type MarketDefinitionInput, marketDefinitionSchema, } from './market-creation';
|
|
13
|
+
export type { MarketData, MarketsNamespace, SearchMarketsParams, } from './markets';
|
|
14
|
+
export { signCreateMarketPermit, signTradePermit } from './permits';
|
|
15
|
+
export type { SeasonConfig, SeasonInfo, SeasonNamespace, } from './season';
|
|
16
|
+
export type { ActivityBreakdown, LinkedWallet, LinkWalletParams, MultiplierBreakdown, PointsBalance, RecentActivity, UserDashboard, UserNamespace, VenueBreakdown, WalletIdentity, } from './user';
|
|
17
|
+
export type { AddMarketParams, VenueMarketEntry, VenueMarketsNamespace, VenueNamespace, VenueStats, } from './venue';
|
|
18
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,KAAK,gBAAgB,EACrB,KAAK,aAAa,EAClB,KAAK,iBAAiB,EACtB,KAAK,oBAAoB,EACzB,eAAe,GAChB,MAAM,WAAW,CAAA;AAGlB,YAAY,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAA;AAGvC,YAAY,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AAE1C,OAAO,EACL,KAAK,WAAW,EAChB,KAAK,WAAW,EAChB,iBAAiB,EACjB,KAAK,UAAU,EACf,KAAK,aAAa,GACnB,MAAM,SAAS,CAAA;AAChB,OAAO,EACL,oBAAoB,EACpB,KAAK,cAAc,EACnB,KAAK,oBAAoB,GAC1B,MAAM,UAAU,CAAA;AAGjB,YAAY,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,UAAU,CAAA;AAG5D,OAAO,EACL,wBAAwB,EACxB,KAAK,cAAc,EACnB,KAAK,SAAS,EACd,KAAK,eAAe,EACpB,KAAK,gBAAgB,EACrB,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACpB,KAAK,aAAa,EAClB,KAAK,UAAU,EACf,KAAK,kBAAkB,EACvB,KAAK,UAAU,EACf,KAAK,kBAAkB,GACxB,MAAM,cAAc,CAAA;AAGrB,YAAY,EACV,iBAAiB,EACjB,iBAAiB,EACjB,eAAe,GAChB,MAAM,UAAU,CAAA;AAIjB,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAA;AAGjC,OAAO,EACL,iBAAiB,EACjB,gBAAgB,EAChB,oBAAoB,EACpB,KAAK,mBAAmB,EACxB,KAAK,oBAAoB,EACzB,KAAK,kBAAkB,EACvB,KAAK,mBAAmB,EACxB,KAAK,sBAAsB,EAC3B,KAAK,uBAAuB,GAC7B,MAAM,eAAe,CAAA;AAGtB,YAAY,EAAE,aAAa,EAAE,MAAM,OAAO,CAAA;AAG1C,OAAO,EACL,sBAAsB,EACtB,KAAK,gBAAgB,EACrB,KAAK,qBAAqB,EAC1B,sBAAsB,GACvB,MAAM,mBAAmB,CAAA;AAG1B,YAAY,EACV,UAAU,EACV,gBAAgB,EAChB,mBAAmB,GACpB,MAAM,WAAW,CAAA;AAGlB,OAAO,EAAE,sBAAsB,EAAE,eAAe,EAAE,MAAM,WAAW,CAAA;AAGnE,YAAY,EACV,YAAY,EACZ,UAAU,EACV,eAAe,GAChB,MAAM,UAAU,CAAA;AAGjB,YAAY,EACV,iBAAiB,EACjB,YAAY,EACZ,gBAAgB,EAChB,mBAAmB,EACnB,aAAa,EACb,cAAc,EACd,aAAa,EACb,aAAa,EACb,cAAc,EACd,cAAc,GACf,MAAM,QAAQ,CAAA;AAGf,YAAY,EACV,eAAe,EACf,gBAAgB,EAChB,qBAAqB,EACrB,cAAc,EACd,UAAU,GACX,MAAM,SAAS,CAAA"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
var U=Object.defineProperty;var B=(e,n)=>()=>(e&&(n=e(e=0)),n);var $=(e,n)=>{for(var t in n)U(e,t,{get:n[t],enumerable:!0})};var f={};$(f,{ApiError:()=>d,authedDelete:()=>b,authedPost:()=>p,get:()=>o,post:()=>l});async function g(e,n={}){let t={"Content-Type":"application/json",...n.headers},r=await fetch(e,{method:n.method??"GET",headers:t,body:n.body?JSON.stringify(n.body):void 0});if(!r.ok){let a=await r.json().catch(()=>null);throw new d(r.status,a)}return r.json()}function o(e,n,t){let r=new URL(n,e);if(t)for(let[a,i]of Object.entries(t))i!==void 0&&r.searchParams.set(a,String(i));return g(r)}function l(e,n,t){return g(new URL(n,e),{method:"POST",body:t})}function p(e,n,t,r){return g(new URL(n,e),{method:"POST",body:t,headers:{Authorization:`Bearer ${r}`}})}function b(e,n,t){return g(new URL(n,e),{method:"DELETE",headers:{Authorization:`Bearer ${t}`}})}var d,c=B(()=>{"use strict";d=class extends Error{constructor(t,r){super(`API error ${t}`);this.status=t;this.body=r;this.name="ApiError"}}});c();function q(e){return{prompt:e.prompt,answer_type:e.answerType,source_urls:e.sourceUrls,min_agreement:e.minAgreement,trading_start:e.tradingStart,trading_end:e.tradingEnd,resolution_start:e.resolutionStart,resolution_end:e.resolutionEnd}}function O(e){return{ratedAt:e.rated_at,finalScore:e.final_score,ratingBand:{rating:e.rating_band.rating,minScore:e.rating_band.min_score,maxScore:e.rating_band.max_score,definition:e.rating_band.definition},criteria:e.criteria.map(n=>({key:n.key,name:n.name,criterionType:n.criterion_type,evaluation:n.evaluation,status:n.status,summary:n.summary,weight:n.weight,score:n.score,weightedScore:n.weighted_score}))}}async function v(e,n){let t=await l(e,"/v0/ratings/markets",q(n));return O(t)}import{createPublicClient as W,defineChain as F,encodeFunctionData as j,http as K}from"viem";var H=[{inputs:[{internalType:"uint256",name:"venueId",type:"uint256"},{internalType:"address",name:"user",type:"address"}],name:"getNonce",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"}],y=[{inputs:[{internalType:"uint256",name:"marketId",type:"uint256"},{internalType:"address",name:"user",type:"address"}],name:"getUserPosition",outputs:[{components:[{internalType:"uint256",name:"yes",type:"uint256"},{internalType:"uint256",name:"no",type:"uint256"},{internalType:"bool",name:"claimed",type:"bool"}],internalType:"struct IProphecyCore.SharePosition",name:"",type:"tuple"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"uint256",name:"marketId",type:"uint256"}],name:"getMarketCore",outputs:[{components:[{internalType:"uint256",name:"tradingStartTs",type:"uint256"},{internalType:"uint256",name:"tradingEndTs",type:"uint256"},{internalType:"uint256",name:"resolutionStartTs",type:"uint256"},{internalType:"uint256",name:"resolutionEndTs",type:"uint256"},{internalType:"address",name:"creator",type:"address"},{internalType:"address",name:"resolver",type:"address"},{internalType:"address",name:"stakeToken",type:"address"},{internalType:"bool",name:"resolved",type:"bool"},{internalType:"uint8",name:"outcome",type:"uint8"},{internalType:"uint256",name:"totalYesShares",type:"uint256"},{internalType:"uint256",name:"totalNoShares",type:"uint256"},{internalType:"uint256",name:"totalShares",type:"uint256"},{internalType:"uint256",name:"participantCount",type:"uint256"},{internalType:"uint256",name:"initialLiquidityBase",type:"uint256"},{internalType:"uint256",name:"feeBps",type:"uint256"}],internalType:"struct IProphecyCore.MarketCore",name:"core",type:"tuple"},{internalType:"string",name:"name",type:"string"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"uint256",name:"marketId",type:"uint256"}],name:"getCurrentReserves",outputs:[{internalType:"uint256",name:"yesPool",type:"uint256"},{internalType:"uint256",name:"noPool",type:"uint256"}],stateMutability:"view",type:"function"}],Y=[{inputs:[{internalType:"uint256",name:"marketId",type:"uint256"}],name:"claimSettlement",outputs:[{internalType:"uint256",name:"payout",type:"uint256"}],stateMutability:"nonpayable",type:"function"}];function h(e){let n=F({id:e.chainId,name:`Somnia (${e.chainId})`,nativeCurrency:{name:"STT",symbol:"STT",decimals:18},rpcUrls:{default:{http:[e.rpcUrl]}}}),t=W({chain:n,transport:K(e.rpcUrl)});return{async getVenueNonce(r,a){return t.readContract({address:e.venueRegistryAddress,abi:H,functionName:"getNonce",args:[r,a]})},async getMarketCore(r){let[a,i]=await t.readContract({address:e.prophecyCoreAddress,abi:y,functionName:"getMarketCore",args:[r]});return{core:a,name:i}},async getReserves(r){let[a,i]=await t.readContract({address:e.prophecyCoreAddress,abi:y,functionName:"getCurrentReserves",args:[r]});return{yesPool:a,noPool:i}},async getUserPosition(r,a){return await t.readContract({address:e.prophecyCoreAddress,abi:y,functionName:"getUserPosition",args:[r,a]})},async getUserPositions(r,a){if(r.length===0)return[];let i=r.map(m=>({address:e.prophecyCoreAddress,abi:y,functionName:"getUserPosition",args:[m,a]}));return(await t.multicall({contracts:i})).map(m=>m.status!=="success"?null:m.result)},encodeClaimSettlement(r){if(!e.prophecySettlementAddress)throw new Error("prophecySettlementAddress is required in ChainConfig for claim operations");return{to:e.prophecySettlementAddress,data:j({abi:Y,functionName:"claimSettlement",args:[r]})}}}}function A(e,n){return{venueId:e,getAuthHeader:()=>`Bearer ${n}`}}function x(e={}){let n=e.defaultTtlMs??15e3,t=new Map;return{get(r){if(n===0)return;let a=t.get(r);if(a){if(Date.now()>a.expiresAt){t.delete(r);return}return a.data}},set(r,a,i){let s=i??n;s!==0&&t.set(r,{data:a,expiresAt:Date.now()+s})},invalidate(r){for(let a of t.keys())a.startsWith(r)&&t.delete(a)},clear(){t.clear()}}}function w(e,n){async function t(r,a){let i=new URL(`/v1/events${r}`,e),s=await fetch(i,{method:"POST",headers:{"Content-Type":"application/json",Authorization:n.getAuthHeader()},body:JSON.stringify(a)});if(!s.ok){let m=await s.json().catch(()=>null),{ApiError:V}=await Promise.resolve().then(()=>(c(),f));throw new V(s.status,m)}return s.json()}return{socialShare:(r,a)=>t("/social-share",{wallet:r,marketId:a}),receiptInspect:(r,a)=>t("/receipt-inspect",{wallet:r,marketId:a}),dailyChallenge:r=>t("/daily-challenge",{wallet:r})}}c();function P(e,n){return{async search(t){let r=new URL("/v0/events",e);if(t?.query&&r.searchParams.set("q",t.query),t?.venue&&r.searchParams.set("venue",t.venue),t?.tag&&r.searchParams.set("tag",t.tag),t?.createdBy&&r.searchParams.set("created_by",t.createdBy),t?.sort&&r.searchParams.set("sort",t.sort),t?.order&&r.searchParams.set("order",t.order),t?.limit&&r.searchParams.set("limit",String(t.limit)),t?.cursor&&r.searchParams.set("cursor",t.cursor),t?.status)for(let s of t.status)r.searchParams.append("status",s);let a=await fetch(r,{headers:{"Content-Type":"application/json"}});if(!a.ok)throw new d(a.status,await a.json().catch(()=>null));let i=await a.json();return{items:i.items,hasMore:i.has_more,nextCursor:i.next_cursor}},async get(t,r){let a=`event:${t}:${r}`,i=n.get(a);if(i)return i;let s=await o(e,`/v0/events/${t}/${r}`);return n.set(a,s),s}}}c();function S(e,n,t){return{async eligibility(r){return o(e,`/v1/faucet/eligibility?wallet=${r.toLowerCase()}&venue=${n}`)},async claim(r){return t?p(e,"/v1/faucet/claim",{wallet:r.toLowerCase()},t.getAuthHeader()):{success:!1,error:"venueId and venueApiKey required for faucet claims"}}}}c();async function k(e,n){return o(e,"/v1/stats/top-traders",{venue:n?.venue,limit:n?.limit})}async function T(e,n){return o(e,"/v0/leaderboard/pnl",{venue:n?.venue,period:n?.period,limit:n?.limit,cursor:n?.cursor})}async function C(e,n){return o(e,"/v0/leaderboard/volume",{venue:n?.venue,period:n?.period,limit:n?.limit,cursor:n?.cursor})}c();function M(e,n){return{async search(t){let r=new URL("/v0/markets",e);if(t?.query&&r.searchParams.set("q",t.query),t?.venue&&r.searchParams.set("venue",t.venue),t?.sort&&r.searchParams.set("sort",t.sort),t?.order&&r.searchParams.set("order",t.order),t?.limit&&r.searchParams.set("limit",String(t.limit)),t?.cursor&&r.searchParams.set("cursor",t.cursor),t?.status)for(let i of t.status)r.searchParams.append("status",i);let a=await fetch(r,{headers:{"Content-Type":"application/json"}});if(!a.ok){let{ApiError:i}=await Promise.resolve().then(()=>(c(),f));throw new i(a.status,await a.json().catch(()=>null))}return a.json()},async get(t,r){let a=`market:${t}:${r}`,i=n.get(a);if(i)return i;let s=await o(e,`/v0/markets/${t}/${r}`);return n.set(a,s),s}}}c();function R(e,n){return{async active(){let t="season:active",r=n.get(t);if(r!==void 0)return r;let a=await o(e,"/v1/seasons/active").catch(()=>null);return n.set(t,a,6e4),a},async config(){let t="season:config",r=n.get(t);if(r!==void 0)return r;let a=await o(e,"/v1/seasons/active/config").catch(()=>null);return n.set(t,a,6e4),a}}}c();function _(e,n){return{async points(t,r){let a=`user:${t}:points:${r?.season??"current"}`,i=n.get(a);if(i)return i;let s=await o(e,`/v1/points/${t}`,r?.season?{season:r.season}:void 0);return n.set(a,s),s},async dashboard(t,r){let a=`user:${t}:dashboard:${r?.venue??"all"}`,i=n.get(a);if(i)return i;let s=await o(e,`/v1/users/${t}/dashboard`,r?.venue?{venue:r.venue}:void 0);return n.set(a,s),s},linkWallet:t=>l(e,"/v1/identity/link",t),linkedWallets:t=>o(e,`/v1/identity/${t}`)}}c();function I(e,n){return{markets:{async list(t,r){let a=`venue:${t}:markets:${r?.status??"all"}`,i=n.get(a);if(i)return i;let s=await o(e,`/v1/venues/${t}/markets`,{status:r?.status});return n.set(a,s),s},async add(t,r,a){let i=await p(e,`/v1/venues/${t}/markets`,{markets:r},a);return n.invalidate(`venue:${t}`),i},async remove(t,r,a,i){let s=await b(e,`/v1/venues/${t}/markets/${r}/${a}`,i);return n.invalidate(`venue:${t}`),s}},async stats(t,r){let a=`venue:${t}:stats:${r??"current"}`,i=n.get(a);if(i)return i;let s=await o(e,`/v1/points/venue/${t}`,r?{season:r}:void 0);return n.set(a,s),s},invalidate:t=>n.invalidate(`venue:${t}`),clearCache:()=>n.invalidate("venue:")}}function z(e){let n=x(e.cache),t=h({chainId:e.chainId,rpcUrl:e.rpcUrl,venueRegistryAddress:e.venueRegistryAddress,prophecyCoreAddress:e.prophecyCoreAddress,prophecySettlementAddress:e.prophecySettlementAddress}),r=e.venueId&&e.venueApiKey?A(e.venueId,e.venueApiKey):null,a={socialShare:()=>Promise.reject(new Error("venueId and venueApiKey required for event reporting")),receiptInspect:()=>Promise.reject(new Error("venueId and venueApiKey required for event reporting")),dailyChallenge:()=>Promise.reject(new Error("venueId and venueApiKey required for event reporting"))};return{chain:t,markets:M(e.dataApiUrl,n),eventsApi:P(e.dataApiUrl,n),venue:I(e.partnersApiUrl,n),user:_(e.partnersApiUrl,n),season:R(e.partnersApiUrl,n),leaderboard:{pp:i=>k(e.partnersApiUrl,i),pnl:i=>T(e.dataApiUrl,i),volume:i=>C(e.dataApiUrl,i)},faucet:S(e.partnersApiUrl,e.venueId??"",r),events:r?w(e.partnersApiUrl,r):a,arbiter:e.arbiterUrl?{rate:i=>v(e.arbiterUrl,i)}:{rate:()=>Promise.reject(new Error("arbiterUrl is required in ProphecyClientConfig to rate markets"))},auth:r}}c();import{generateText as J}from"ai";import{z as u}from"zod";var E=u.object({type:u.enum(["ai","creator"]).describe("ai = verifiable from URL, creator = manual resolution"),name:u.string().describe("Market title \u2014 frames the specific prediction"),description:u.string().describe("What will be extracted / resolution criteria"),tradingStartTs:u.string().describe("ISO 8601 \u2014 when trading opens"),tradingEndTs:u.string().describe("ISO 8601 \u2014 when trading closes"),resolutionStartTs:u.string().describe("ISO 8601 \u2014 when resolution can begin"),resolutionEndTs:u.string().describe("ISO 8601 \u2014 resolution deadline"),extractionPrompt:u.string().optional().describe("Prompt used to extract the answer from sources"),urls:u.array(u.string()).optional().describe("Credible source URLs (2-4 recommended)"),options:u.array(u.string()).optional().describe("Possible outcomes for string extractions"),expectedOutcome:u.string().optional().describe("The user's prediction \u2014 inferred from the question"),resultType:u.enum(["string","number"]).optional().describe("Type of extraction result")});function G(){return`You are a prediction market configurator. Given a user's question or prediction, create a structured market definition.
|
|
2
|
+
|
|
3
|
+
Today's date (UTC) is: ${new Date().toISOString().split("T")[0]}
|
|
4
|
+
|
|
5
|
+
Determine whether this market can be AI-resolved (outcome verifiable from public URLs) or needs creator resolution (subjective/manual).
|
|
6
|
+
|
|
7
|
+
For AI-resolved markets:
|
|
8
|
+
- Provide 2-4 credible, authoritative source URLs
|
|
9
|
+
- Write a clear extraction prompt for future data extraction
|
|
10
|
+
- Set the expected outcome (the user's prediction) inferred from their question
|
|
11
|
+
- Frame the market name to include the specific prediction (e.g., "England to win Euro 2024", NOT "Winner of Euro 2024")
|
|
12
|
+
- Choose string or number result type based on the outcome
|
|
13
|
+
|
|
14
|
+
For creator-resolved markets:
|
|
15
|
+
- Write a clear market name as a question
|
|
16
|
+
- Provide context and resolution criteria
|
|
17
|
+
|
|
18
|
+
Set appropriate timestamps:
|
|
19
|
+
- tradingStartTs: when trading opens (usually now or soon)
|
|
20
|
+
- tradingEndTs: when trading closes (usually just before the event)
|
|
21
|
+
- resolutionStartTs: when the outcome can be checked (usually when event concludes)
|
|
22
|
+
- resolutionEndTs: deadline for resolution (usually hours/days after event)`}async function Z(e){let n=e.systemPrompt??G(),t=e.userTimeZone?`
|
|
23
|
+
User timezone: ${e.userTimeZone}. Interpret relative dates accordingly.`:"",{text:r}=await J({model:e.model,system:`${n}
|
|
24
|
+
|
|
25
|
+
Respond ONLY with valid JSON matching this schema. No markdown, no explanation.
|
|
26
|
+
Schema: ${JSON.stringify(E.shape)}`,prompt:`Create a prediction market for: "${e.question}"${t}`});return E.parse(JSON.parse(r))}import{privateKeyToAccount as L}from"viem/accounts";var N=60,D={name:"VenueRegistry",version:"1"},Q={CreateMarketPermit:[{name:"name",type:"string"},{name:"venueId",type:"uint256"},{name:"tradingStartTs",type:"uint256"},{name:"tradingEndTs",type:"uint256"},{name:"resolutionStartTs",type:"uint256"},{name:"resolutionEndTs",type:"uint256"},{name:"stakeToken",type:"address"},{name:"initialLiquidityBase",type:"uint256"},{name:"noMatchOutcome",type:"uint8"},{name:"resolverType",type:"uint8"},{name:"creator",type:"address"},{name:"nonce",type:"uint256"},{name:"deadline",type:"uint256"}]},X={TradePermit:[{name:"marketId",type:"uint256"},{name:"venueId",type:"uint256"},{name:"user",type:"address"},{name:"amount",type:"uint256"},{name:"action",type:"uint8"},{name:"nonce",type:"uint256"},{name:"deadline",type:"uint256"}]};async function ee(e){let n=L(e.operatorPrivateKey),t=BigInt(Math.floor(Date.now()/1e3)+N);return{signature:await n.signTypedData({domain:{...D,chainId:e.chainId,verifyingContract:e.venueRegistryAddress},types:X,primaryType:"TradePermit",message:{marketId:e.marketId,venueId:e.venueId,user:e.user,amount:e.amount,action:e.action,nonce:e.nonce,deadline:t}}),signer:n.address,deadline:t}}async function te(e){let n=L(e.operatorPrivateKey),t=BigInt(Math.floor(Date.now()/1e3)+N);return{signature:await n.signTypedData({domain:{...D,chainId:e.chainId,verifyingContract:e.venueRegistryAddress},types:Q,primaryType:"CreateMarketPermit",message:{name:e.name,venueId:e.venueId,tradingStartTs:BigInt(e.tradingStartTs),tradingEndTs:BigInt(e.tradingEndTs),resolutionStartTs:BigInt(e.resolutionStartTs),resolutionEndTs:BigInt(e.resolutionEndTs),stakeToken:e.stakeToken,initialLiquidityBase:e.initialLiquidityBase,noMatchOutcome:e.noMatchOutcome,resolverType:e.resolverType,creator:e.creator,nonce:e.nonce,deadline:t}}),signer:n.address,deadline:t}}export{d as ApiError,h as createChainClient,P as createEventsApiNamespace,Z as createMarketDefinition,z as createProphecyClient,k as getPPLeaderboard,T as getPnLLeaderboard,C as getVolumeLeaderboard,E as marketDefinitionSchema,v as rateMarketDraft,te as signCreateMarketPermit,ee as signTradePermit};
|
|
27
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/http.ts", "../src/arbiter.ts", "../src/chain.ts", "../src/auth.ts", "../src/cache.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/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 { 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", "rateMarketDraft", "arbiterUrl", "post", "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", "createCache", "config", "defaultTtl", "store", "key", "entry", "data", "ttlMs", "ttl", "prefix", "createEventsNamespace", "partnersApiUrl", "venueAuth", "postEvent", "path", "body", "url", "res", "err", "ApiError", "wallet", "marketId", "init_http", "createEventsApiNamespace", "dataApiUrl", "cache", "params", "url", "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", "init_http", "generateText", "z", "marketDefinitionSchema", "buildDefaultSystemPrompt", "createMarketDefinition", "input", "systemPrompt", "timeContext", "text", "privateKeyToAccount", "PERMIT_TTL_SECONDS", "EIP712_DOMAIN", "CREATE_MARKET_PERMIT_TYPES", "TRADE_PERMIT_TYPES", "signTradePermit", "params", "account", "deadline", "signCreateMarketPermit"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Leaderboard queries.
|
|
3
|
+
* PP leaderboard: Partners API (available now).
|
|
4
|
+
* PnL leaderboard: Data API (pending Go endpoint implementation).
|
|
5
|
+
*/
|
|
6
|
+
export interface PPLeaderboardEntry {
|
|
7
|
+
wallet: string;
|
|
8
|
+
totalPP: number;
|
|
9
|
+
totalEvents: number;
|
|
10
|
+
}
|
|
11
|
+
export interface PPLeaderboardParams {
|
|
12
|
+
venue?: string;
|
|
13
|
+
limit?: number;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Get top traders ranked by Prophecy Points.
|
|
17
|
+
*/
|
|
18
|
+
export declare function getPPLeaderboard(partnersApiUrl: string, params?: PPLeaderboardParams): Promise<{
|
|
19
|
+
traders: PPLeaderboardEntry[];
|
|
20
|
+
}>;
|
|
21
|
+
export interface PnLLeaderboardEntry {
|
|
22
|
+
wallet: string;
|
|
23
|
+
pnl: string;
|
|
24
|
+
tradeCount: number;
|
|
25
|
+
winRate: number;
|
|
26
|
+
marketsTraded: number;
|
|
27
|
+
}
|
|
28
|
+
export interface PnLLeaderboardParams {
|
|
29
|
+
venue?: string;
|
|
30
|
+
period?: '7d' | '30d' | 'season' | 'all';
|
|
31
|
+
limit?: number;
|
|
32
|
+
cursor?: string;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Get top traders ranked by PnL.
|
|
36
|
+
* Requires the Go Data API leaderboard endpoint (pending implementation).
|
|
37
|
+
*/
|
|
38
|
+
export declare function getPnLLeaderboard(dataApiUrl: string, params?: PnLLeaderboardParams): Promise<{
|
|
39
|
+
traders: PnLLeaderboardEntry[];
|
|
40
|
+
nextCursor?: string;
|
|
41
|
+
}>;
|
|
42
|
+
export interface VolumeLeaderboardEntry {
|
|
43
|
+
wallet: string;
|
|
44
|
+
totalVolume: string;
|
|
45
|
+
tradeCount: number;
|
|
46
|
+
marketsTraded: number;
|
|
47
|
+
}
|
|
48
|
+
export interface VolumeLeaderboardParams {
|
|
49
|
+
venue?: string;
|
|
50
|
+
period?: '7d' | '30d' | 'season' | 'all';
|
|
51
|
+
limit?: number;
|
|
52
|
+
cursor?: string;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Get top traders ranked by trading volume.
|
|
56
|
+
* Requires the Go Data API leaderboard endpoint (pending implementation).
|
|
57
|
+
*/
|
|
58
|
+
export declare function getVolumeLeaderboard(dataApiUrl: string, params?: VolumeLeaderboardParams): Promise<{
|
|
59
|
+
traders: VolumeLeaderboardEntry[];
|
|
60
|
+
nextCursor?: string;
|
|
61
|
+
}>;
|
|
62
|
+
//# sourceMappingURL=leaderboard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"leaderboard.d.ts","sourceRoot":"","sources":["../src/leaderboard.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,MAAM,CAAA;IACf,WAAW,EAAE,MAAM,CAAA;CACpB;AAED,MAAM,WAAW,mBAAmB;IAClC,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CACpC,cAAc,EAAE,MAAM,EACtB,MAAM,CAAC,EAAE,mBAAmB,GAC3B,OAAO,CAAC;IAAE,OAAO,EAAE,kBAAkB,EAAE,CAAA;CAAE,CAAC,CAK5C;AAID,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,CAAA;IACd,GAAG,EAAE,MAAM,CAAA;IACX,UAAU,EAAE,MAAM,CAAA;IAClB,OAAO,EAAE,MAAM,CAAA;IACf,aAAa,EAAE,MAAM,CAAA;CACtB;AAED,MAAM,WAAW,oBAAoB;IACnC,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,IAAI,GAAG,KAAK,GAAG,QAAQ,GAAG,KAAK,CAAA;IACxC,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,CACrC,UAAU,EAAE,MAAM,EAClB,MAAM,CAAC,EAAE,oBAAoB,GAC5B,OAAO,CAAC;IAAE,OAAO,EAAE,mBAAmB,EAAE,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAWlE;AAID,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,MAAM,CAAA;IACd,WAAW,EAAE,MAAM,CAAA;IACnB,UAAU,EAAE,MAAM,CAAA;IAClB,aAAa,EAAE,MAAM,CAAA;CACtB;AAED,MAAM,WAAW,uBAAuB;IACtC,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,IAAI,GAAG,KAAK,GAAG,QAAQ,GAAG,KAAK,CAAA;IACxC,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED;;;GAGG;AACH,wBAAsB,oBAAoB,CACxC,UAAU,EAAE,MAAM,EAClB,MAAM,CAAC,EAAE,uBAAuB,GAC/B,OAAO,CAAC;IAAE,OAAO,EAAE,sBAAsB,EAAE,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAWrE"}
|
package/dist/llm.d.ts
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LLM types for the SDK.
|
|
3
|
+
* Provider-agnostic — partners pass in any Vercel AI SDK model instance.
|
|
4
|
+
* The SDK uses the `ai` package's LanguageModel interface; it doesn't import
|
|
5
|
+
* any specific provider. Partners install their preferred @ai-sdk/* package.
|
|
6
|
+
*
|
|
7
|
+
* Recommended models (licensing-friendly):
|
|
8
|
+
* - GLM-5 (Zhipu) via @ai-sdk/google-vertex
|
|
9
|
+
* - Kimi 2.5 (Moonshot) via @ai-sdk/google-vertex
|
|
10
|
+
* - Grok (xAI) via @ai-sdk/google-vertex
|
|
11
|
+
*
|
|
12
|
+
* Alternatives (partner's choice):
|
|
13
|
+
* - @ai-sdk/openai (GPT-4o, etc.)
|
|
14
|
+
* - @ai-sdk/anthropic (Claude)
|
|
15
|
+
* - @ai-sdk/google (Gemini)
|
|
16
|
+
*
|
|
17
|
+
* Usage:
|
|
18
|
+
* import { vertex } from '@ai-sdk/google-vertex'
|
|
19
|
+
* const result = await createMarketDefinition({ question: '...', model: vertex('glm-5') })
|
|
20
|
+
*/
|
|
21
|
+
export type { LanguageModel } from 'ai';
|
|
22
|
+
//# sourceMappingURL=llm.d.ts.map
|