@prophecy-dev/sdk 0.1.1 → 0.1.2

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/index.js CHANGED
@@ -1,4 +1,4 @@
1
- var se=Object.defineProperty;var ce=(e,t)=>()=>(e&&(t=e(e=0)),t);var ue=(e,t)=>{for(var r in t)se(e,r,{get:t[r],enumerable:!0})};var A={};ue(A,{ApiError:()=>m,authedDelete:()=>E,authedPost:()=>g,get:()=>s,post:()=>p});async function f(e,t={}){let r={"Content-Type":"application/json",...t.headers},n=await fetch(e,{method:t.method??"GET",headers:r,body:t.body?JSON.stringify(t.body):void 0});if(!n.ok){let i=await n.json().catch(()=>null);throw new m(n.status,i)}return n.json()}function s(e,t,r){let n=new URL(t,e);if(r)for(let[i,a]of Object.entries(r))a!==void 0&&n.searchParams.set(i,String(a));return f(n)}function p(e,t,r){return f(new URL(t,e),{method:"POST",body:r})}function g(e,t,r,n){return f(new URL(t,e),{method:"POST",body:r,headers:{Authorization:`Bearer ${n}`}})}function E(e,t,r){return f(new URL(t,e),{method:"DELETE",headers:{Authorization:`Bearer ${r}`}})}var m,u=ce(()=>{"use strict";m=class extends Error{constructor(r,n){super(`API error ${r}`);this.status=r;this.body=n;this.name="ApiError"}}});u();function V(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 le(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(t=>({key:t.key,name:t.name,criterionType:t.criterion_type,evaluation:t.evaluation,status:t.status,summary:t.summary,weight:t.weight,score:t.score,weightedScore:t.weighted_score}))}}async function I(e,t){return p(e,"/v1/arbiter/preview",V(t))}async function R(e,t){let r=await p(e,"/v1/arbiter/preview",V(t));return le(r)}async function x(e,t,r){return s(e,`/v1/arbiter/events/${t}/${r}`)}function k(e={}){let t=e.defaultTtlMs??15e3,r=new Map;return{get(n){if(t===0)return;let i=r.get(n);if(i){if(Date.now()>i.expiresAt){r.delete(n);return}return i.data}},set(n,i,a){let o=a??t;o!==0&&r.set(n,{data:i,expiresAt:Date.now()+o})},invalidate(n){for(let i of r.keys())i.startsWith(n)&&r.delete(i)},clear(){r.clear()}}}import{createPublicClient as de,defineChain as me,encodeFunctionData as pe,http as ge}from"viem";var ye=[{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"}],b=[{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"}],he=[{inputs:[{internalType:"uint256",name:"marketId",type:"uint256"}],name:"claimSettlement",outputs:[{internalType:"uint256",name:"payout",type:"uint256"}],stateMutability:"nonpayable",type:"function"}];function C(e){let t=me({id:e.chainId,name:`Somnia (${e.chainId})`,nativeCurrency:{name:"STT",symbol:"STT",decimals:18},rpcUrls:{default:{http:[e.rpcUrl]}}}),r=de({chain:t,transport:ge(e.rpcUrl)});return{async getVenueNonce(n,i){return r.readContract({address:e.venueRegistryAddress,abi:ye,functionName:"getNonce",args:[n,i]})},async getMarketCore(n){let[i,a]=await r.readContract({address:e.prophecyCoreAddress,abi:b,functionName:"getMarketCore",args:[n]});return{core:i,name:a}},async getReserves(n){let[i,a]=await r.readContract({address:e.prophecyCoreAddress,abi:b,functionName:"getCurrentReserves",args:[n]});return{yesPool:i,noPool:a}},async getUserPosition(n,i){return await r.readContract({address:e.prophecyCoreAddress,abi:b,functionName:"getUserPosition",args:[n,i]})},async getUserPositions(n,i){if(n.length===0)return[];let a=n.map(l=>({address:e.prophecyCoreAddress,abi:b,functionName:"getUserPosition",args:[l,i]}));return(await r.multicall({contracts:a})).map(l=>l.status!=="success"?null:l.result)},encodeClaimSettlement(n){if(!e.prophecySettlementAddress)throw new Error("prophecySettlementAddress is required in ChainConfig for claim operations");return{to:e.prophecySettlementAddress,data:pe({abi:he,functionName:"claimSettlement",args:[n]})}}}}function q(e,t){return{venueId:e,getAuthHeader:()=>`Bearer ${t}`}}function H(e,t){async function r(n,i){let a=new URL(`/v1/events${n}`,e),o=await fetch(a,{method:"POST",headers:{"Content-Type":"application/json",Authorization:t.getAuthHeader()},body:JSON.stringify(i)});if(!o.ok){let l=await o.json().catch(()=>null),{ApiError:oe}=await Promise.resolve().then(()=>(u(),A));throw new oe(o.status,l)}return o.json()}return{socialShare:(n,i)=>r("/social-share",{wallet:n,marketId:i}),receiptInspect:(n,i)=>r("/receipt-inspect",{wallet:n,marketId:i}),dailyChallenge:n=>r("/daily-challenge",{wallet:n})}}u();function _(e,t){return{async search(r){let n=new URL("/v0/events",e);if(r?.q&&n.searchParams.set("q",r.q),r?.venue&&n.searchParams.set("venue",r.venue),r?.tag&&n.searchParams.set("tag",r.tag),r?.created_by&&n.searchParams.set("created_by",r.created_by),r?.sort&&n.searchParams.set("sort",r.sort),r?.order&&n.searchParams.set("order",r.order),r?.limit&&n.searchParams.set("limit",String(r.limit)),r?.cursor&&n.searchParams.set("cursor",r.cursor),r?.status)for(let o of r.status)n.searchParams.append("status",o);let i=await fetch(n,{headers:{"Content-Type":"application/json"}});if(!i.ok)throw new m(i.status,await i.json().catch(()=>null));let a=await i.json();return{items:a.items,hasMore:a.has_more,nextCursor:a.next_cursor}},async get(r,n){let i=`event:${r}:${n}`,a=t.get(i);if(a)return a;let o=await s(e,`/v0/events/${r}/${n}`);return t.set(i,o),o}}}u();function W(e,t,r){return{async eligibility(n){return s(e,`/v1/faucet/eligibility?wallet=${n.toLowerCase()}&venue=${t}`)},async claim(n){return r?g(e,"/v1/faucet/claim",{wallet:n.toLowerCase()},r.getAuthHeader()):{success:!1,error:"venueId and venueApiKey required for faucet claims"}}}}u();async function N(e,t){return s(e,"/v1/stats/top-traders",{venue:t?.venue,limit:t?.limit})}async function S(e,t){return s(e,"/v0/leaderboard/pnl",{venue:t?.venue,period:t?.period,limit:t?.limit,cursor:t?.cursor})}async function O(e,t){return s(e,"/v0/leaderboard/volume",{venue:t?.venue,period:t?.period,limit:t?.limit,cursor:t?.cursor})}u();function G(e,t){return{async search(r){let n=new URL("/v0/markets",e);if(r?.q&&n.searchParams.set("q",r.q),r?.venue&&n.searchParams.set("venue",r.venue),r?.sort&&n.searchParams.set("sort",r.sort),r?.order&&n.searchParams.set("order",r.order),r?.limit&&n.searchParams.set("limit",String(r.limit)),r?.cursor&&n.searchParams.set("cursor",r.cursor),r?.status)for(let a of r.status)n.searchParams.append("status",a);let i=await fetch(n,{headers:{"Content-Type":"application/json"}});if(!i.ok){let{ApiError:a}=await Promise.resolve().then(()=>(u(),A));throw new a(i.status,await i.json().catch(()=>null))}return i.json()},async get(r,n){let i=`market:${r}:${n}`,a=t.get(i);if(a)return a;let o=await s(e,`/v0/markets/${r}/${n}`);return t.set(i,o),o}}}u();function j(e,t){return{async active(){let r="season:active",n=t.get(r);if(n!==void 0)return n;let i=await s(e,"/v1/seasons/active").catch(()=>null);return t.set(r,i,6e4),i},async config(){let r="season:config",n=t.get(r);if(n!==void 0)return n;let i=await s(e,"/v1/seasons/active/config").catch(()=>null);return t.set(r,i,6e4),i}}}u();function K(e,t){return{async points(r,n){let i=`user:${r}:points:${n?.season??"current"}`,a=t.get(i);if(a)return a;let o=await s(e,`/v1/points/${r}`,n?.season?{season:n.season}:void 0);return t.set(i,o),o},async dashboard(r,n){let i=`user:${r}:dashboard:${n?.venue??"all"}`,a=t.get(i);if(a)return a;let o=await s(e,`/v1/users/${r}/dashboard`,n?.venue?{venue:n.venue}:void 0);return t.set(i,o),o},linkWallet:r=>p(e,"/v1/identity/link",r),linkedWallets:r=>s(e,`/v1/identity/${r}`)}}u();function J(e,t){return{markets:{async list(r,n){let i=`venue:${r}:markets:${n?.status??"all"}`,a=t.get(i);if(a)return a;let o=await s(e,`/v1/venues/${r}/markets`,{status:n?.status});return t.set(i,o),o},async add(r,n,i){let a=await g(e,`/v1/venues/${r}/markets`,{markets:n},i);return t.invalidate(`venue:${r}`),a},async remove(r,n,i,a){let o=await E(e,`/v1/venues/${r}/markets/${n}/${i}`,a);return t.invalidate(`venue:${r}`),o}},async stats(r,n){let i=`venue:${r}:stats:${n??"current"}`,a=t.get(i);if(a)return a;let o=await s(e,`/v1/points/venue/${r}`,n?{season:n}:void 0);return t.set(i,o),o},invalidate:r=>t.invalidate(`venue:${r}`),clearCache:()=>t.invalidate("venue:")}}function fe(e){let t=k(e.cache),r=C({chainId:e.chainId,rpcUrl:e.rpcUrl,venueRegistryAddress:e.venueRegistryAddress,prophecyCoreAddress:e.prophecyCoreAddress,prophecySettlementAddress:e.prophecySettlementAddress}),n=e.venueId&&e.venueApiKey?q(e.venueId,e.venueApiKey):null,i={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:r,markets:G(e.dataApiUrl,t),eventsApi:_(e.dataApiUrl,t),venue:J(e.partnersApiUrl,t),user:K(e.partnersApiUrl,t),season:j(e.partnersApiUrl,t),leaderboard:{pp:a=>N(e.partnersApiUrl,a),pnl:a=>S(e.dataApiUrl,a),volume:a=>O(e.dataApiUrl,a)},faucet:W(e.partnersApiUrl,e.venueId??"",n),events:n?H(e.partnersApiUrl,n):i,arbiter:{rate:a=>R(e.partnersApiUrl,a),preview:a=>I(e.partnersApiUrl,a),eventRating:(a,o)=>x(e.partnersApiUrl,a,o)},auth:n}}u();import{generateText as be}from"ai";import{z as c}from"zod";var L=c.object({type:c.enum(["ai","creator"]).describe("ai = verifiable from URL, creator = manual resolution"),name:c.string().describe("Market title \u2014 frames the specific prediction"),description:c.string().describe("What will be extracted / resolution criteria"),tradingStartTs:c.string().describe("ISO 8601 \u2014 when trading opens"),tradingEndTs:c.string().describe("ISO 8601 \u2014 when trading closes"),resolutionStartTs:c.string().describe("ISO 8601 \u2014 when resolution can begin"),resolutionEndTs:c.string().describe("ISO 8601 \u2014 resolution deadline"),extractionPrompt:c.string().optional().describe("Prompt used to extract the answer from sources"),urls:c.array(c.string()).optional().describe("Credible source URLs (2-4 recommended)"),options:c.array(c.string()).optional().describe("Possible outcomes for string extractions"),expectedOutcome:c.string().optional().describe("The user's prediction \u2014 inferred from the question"),resultType:c.enum(["string","number"]).optional().describe("Type of extraction result")});function ve(){return`You are a prediction market configurator. Given a user's question or prediction, create a structured market definition.
1
+ var oe=Object.defineProperty;var ce=(e,t)=>()=>(e&&(t=e(e=0)),t);var ue=(e,t)=>{for(var r in t)oe(e,r,{get:t[r],enumerable:!0})};var I={};ue(I,{ApiError:()=>m,authedDelete:()=>A,authedPost:()=>g,get:()=>o,post:()=>p});async function f(e,t={}){let r={"Content-Type":"application/json",...t.headers},n=await fetch(e,{method:t.method??"GET",headers:r,body:t.body?JSON.stringify(t.body):void 0});if(!n.ok){let i=await n.json().catch(()=>null);throw new m(n.status,i)}return n.json()}function o(e,t,r){let n=new URL(t,e);if(r)for(let[i,a]of Object.entries(r))a!==void 0&&n.searchParams.set(i,String(a));return f(n)}function p(e,t,r){return f(new URL(t,e),{method:"POST",body:r})}function g(e,t,r,n){return f(new URL(t,e),{method:"POST",body:r,headers:{Authorization:`Bearer ${n}`}})}function A(e,t,r){return f(new URL(t,e),{method:"DELETE",headers:{Authorization:`Bearer ${r}`}})}var m,u=ce(()=>{"use strict";m=class extends Error{constructor(r,n){super(`API error ${r}`);this.status=r;this.body=n;this.name="ApiError"}}});u();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 le(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(t=>({key:t.key,name:t.name,criterionType:t.criterion_type,evaluation:t.evaluation,status:t.status,summary:t.summary,weight:t.weight,score:t.score,weightedScore:t.weighted_score}))}}async function R(e,t){return p(e,"/v1/arbiter/preview",q(t))}async function x(e,t){let r=await p(e,"/v1/arbiter/preview",q(t));return le(r)}async function k(e,t,r){return o(e,`/v1/arbiter/events/${t}/${r}`)}function _(e={}){let t=e.defaultTtlMs??15e3,r=new Map;return{get(n){if(t===0)return;let i=r.get(n);if(i){if(Date.now()>i.expiresAt){r.delete(n);return}return i.data}},set(n,i,a){let s=a??t;s!==0&&r.set(n,{data:i,expiresAt:Date.now()+s})},invalidate(n){for(let i of r.keys())i.startsWith(n)&&r.delete(i)},clear(){r.clear()}}}import{createPublicClient as de,defineChain as me,encodeFunctionData as pe,http as ge}from"viem";var he=[{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"}],b=[{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"}],ye=[{inputs:[{internalType:"uint256",name:"marketId",type:"uint256"}],name:"claimSettlement",outputs:[{internalType:"uint256",name:"payout",type:"uint256"}],stateMutability:"nonpayable",type:"function"}];function C(e){let t=me({id:e.chainId,name:`Somnia (${e.chainId})`,nativeCurrency:{name:"STT",symbol:"STT",decimals:18},rpcUrls:{default:{http:[e.rpcUrl]}}}),r=de({chain:t,transport:ge(e.rpcUrl)});return{async getVenueNonce(n,i){return r.readContract({address:e.venueRegistryAddress,abi:he,functionName:"getNonce",args:[n,i]})},async getMarketCore(n){let[i,a]=await r.readContract({address:e.prophecyCoreAddress,abi:b,functionName:"getMarketCore",args:[n]});return{core:i,name:a}},async getReserves(n){let[i,a]=await r.readContract({address:e.prophecyCoreAddress,abi:b,functionName:"getCurrentReserves",args:[n]});return{yesPool:i,noPool:a}},async getUserPosition(n,i){return await r.readContract({address:e.prophecyCoreAddress,abi:b,functionName:"getUserPosition",args:[n,i]})},async getUserPositions(n,i){if(n.length===0)return[];let a=n.map(l=>({address:e.prophecyCoreAddress,abi:b,functionName:"getUserPosition",args:[l,i]}));return(await r.multicall({contracts:a})).map(l=>l.status!=="success"?null:l.result)},encodeClaimSettlement(n){if(!e.prophecySettlementAddress)throw new Error("prophecySettlementAddress is required in ChainConfig for claim operations");return{to:e.prophecySettlementAddress,data:pe({abi:ye,functionName:"claimSettlement",args:[n]})}}}}function H(e,t){return{venueId:e,getAuthHeader:()=>`Bearer ${t}`}}function W(e,t){async function r(n,i){let a=new URL(`/v1/events${n}`,e),s=await fetch(a,{method:"POST",headers:{"Content-Type":"application/json",Authorization:t.getAuthHeader()},body:JSON.stringify(i)});if(!s.ok){let l=await s.json().catch(()=>null),{ApiError:se}=await Promise.resolve().then(()=>(u(),I));throw new se(s.status,l)}return s.json()}return{socialShare:(n,i)=>r("/social-share",{wallet:n,marketId:i}),receiptInspect:(n,i)=>r("/receipt-inspect",{wallet:n,marketId:i}),dailyChallenge:n=>r("/daily-challenge",{wallet:n})}}u();function N(e,t){return{async search(r){let n=new URL("/v0/events",e);if(r?.q&&n.searchParams.set("q",r.q),r?.venue&&n.searchParams.set("venue",r.venue),r?.tag&&n.searchParams.set("tag",r.tag),r?.created_by&&n.searchParams.set("created_by",r.created_by),r?.sort&&n.searchParams.set("sort",r.sort),r?.order&&n.searchParams.set("order",r.order),r?.limit&&n.searchParams.set("limit",String(r.limit)),r?.cursor&&n.searchParams.set("cursor",r.cursor),r?.status)for(let s of r.status)n.searchParams.append("status",s);let i=await fetch(n,{headers:{"Content-Type":"application/json"}});if(!i.ok)throw new m(i.status,await i.json().catch(()=>null));let a=await i.json();return{items:a.items,hasMore:a.has_more,nextCursor:a.next_cursor}},async get(r,n){let i=`event:${r}:${n}`,a=t.get(i);if(a)return a;let s=await o(e,`/v0/events/${r}/${n}`);return t.set(i,s),s}}}u();function G(e,t,r){return{async eligibility(n){return o(e,`/v1/faucet/eligibility?wallet=${n.toLowerCase()}&venue=${t}`)},async claim(n){return r?g(e,"/v1/faucet/claim",{wallet:n.toLowerCase()},r.getAuthHeader()):{success:!1,error:"venueId and venueApiKey required for faucet claims"}}}}u();async function S(e,t){return o(e,"/v1/stats/top-traders",{venue:t?.venue,limit:t?.limit})}async function O(e,t){return o(e,"/v0/leaderboard/pnl",{venue:t?.venue,period:t?.period,limit:t?.limit,cursor:t?.cursor})}async function L(e,t){return o(e,"/v0/leaderboard/volume",{venue:t?.venue,period:t?.period,limit:t?.limit,cursor:t?.cursor})}u();function j(e,t){return{async search(r){let n=new URL("/v0/markets",e);if(r?.q&&n.searchParams.set("q",r.q),r?.venue&&n.searchParams.set("venue",r.venue),r?.sort&&n.searchParams.set("sort",r.sort),r?.order&&n.searchParams.set("order",r.order),r?.limit&&n.searchParams.set("limit",String(r.limit)),r?.cursor&&n.searchParams.set("cursor",r.cursor),r?.status)for(let a of r.status)n.searchParams.append("status",a);let i=await fetch(n,{headers:{"Content-Type":"application/json"}});if(!i.ok){let{ApiError:a}=await Promise.resolve().then(()=>(u(),I));throw new a(i.status,await i.json().catch(()=>null))}return i.json()},async get(r,n){let i=`market:${r}:${n}`,a=t.get(i);if(a)return a;let s=await o(e,`/v0/markets/${r}/${n}`);return t.set(i,s),s}}}u();function K(e,t){return{async active(){let r="season:active",n=t.get(r);if(n!==void 0)return n;let i=await o(e,"/v1/seasons/active").catch(()=>null);return t.set(r,i,6e4),i},async config(){let r="season:config",n=t.get(r);if(n!==void 0)return n;let i=await o(e,"/v1/seasons/active/config").catch(()=>null);return t.set(r,i,6e4),i}}}u();function J(e,t){return{async points(r,n){let i=`user:${r}:points:${n?.season??"current"}`,a=t.get(i);if(a)return a;let s=await o(e,`/v1/points/${r}`,n?.season?{season:n.season}:void 0);return t.set(i,s),s},async dashboard(r,n){let i=`user:${r}:dashboard:${n?.venue??"all"}`,a=t.get(i);if(a)return a;let s=await o(e,`/v1/users/${r}/dashboard`,n?.venue?{venue:n.venue}:void 0);return t.set(i,s),s},linkWallet:r=>p(e,"/v1/identity/link",r),linkedWallets:r=>o(e,`/v1/identity/${r}`)}}u();function X(e,t){return{markets:{async list(r,n){let i=`venue:${r}:markets:${n?.status??"all"}`,a=t.get(i);if(a)return a;let s=await o(e,`/v1/venues/${r}/markets`,{status:n?.status});return t.set(i,s),s},async add(r,n,i){let a=await g(e,`/v1/venues/${r}/markets`,{markets:n},i);return t.invalidate(`venue:${r}`),a},async remove(r,n,i,a){let s=await A(e,`/v1/venues/${r}/markets/${n}/${i}`,a);return t.invalidate(`venue:${r}`),s}},async stats(r,n){let i=`venue:${r}:stats:${n??"current"}`,a=t.get(i);if(a)return a;let s=await o(e,`/v1/points/venue/${r}`,n?{season:n}:void 0);return t.set(i,s),s},invalidate:r=>t.invalidate(`venue:${r}`),clearCache:()=>t.invalidate("venue:")}}function fe(e){let t=_(e.cache),r=C({chainId:e.chainId,rpcUrl:e.rpcUrl,venueRegistryAddress:e.venueRegistryAddress,prophecyCoreAddress:e.prophecyCoreAddress,prophecySettlementAddress:e.prophecySettlementAddress}),n=e.venueId&&e.venueApiKey?H(e.venueId,e.venueApiKey):null,i={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:r,markets:j(e.dataApiUrl,t),eventsApi:N(e.dataApiUrl,t),venue:X(e.partnersApiUrl,t),user:J(e.partnersApiUrl,t),season:K(e.partnersApiUrl,t),leaderboard:{pp:a=>S(e.partnersApiUrl,a),pnl:a=>O(e.dataApiUrl,a),volume:a=>L(e.dataApiUrl,a)},faucet:G(e.partnersApiUrl,e.venueId??"",n),events:n?W(e.partnersApiUrl,n):i,arbiter:{rate:a=>x(e.partnersApiUrl,a),preview:a=>R(e.partnersApiUrl,a),eventRating:(a,s)=>k(e.partnersApiUrl,a,s)},auth:n}}u();import{generateText as be}from"ai";import{z as c}from"zod";var U=c.object({type:c.enum(["ai","creator"]).describe("ai = verifiable from URL, creator = manual resolution"),name:c.string().describe("Market title \u2014 frames the specific prediction"),description:c.string().describe("What will be extracted / resolution criteria"),tradingStartTs:c.string().describe("ISO 8601 \u2014 when trading opens"),tradingEndTs:c.string().describe("ISO 8601 \u2014 when trading closes"),resolutionStartTs:c.string().describe("ISO 8601 \u2014 when resolution can begin"),resolutionEndTs:c.string().describe("ISO 8601 \u2014 resolution deadline"),extractionPrompt:c.string().optional().describe("Prompt used to extract the answer from sources"),urls:c.array(c.string()).optional().describe("Credible source URLs (2-4 recommended)"),options:c.array(c.string()).optional().describe("Possible outcomes for string extractions"),expectedOutcome:c.string().optional().describe("The user's prediction \u2014 inferred from the question"),resultType:c.enum(["string","number"]).optional().describe("Type of extraction result")});function ve(){return`You are a prediction market configurator. Given a user's question or prediction, create a structured market definition.
2
2
 
3
3
  Today's date (UTC) is: ${new Date().toISOString().split("T")[0]}
4
4
 
@@ -17,15 +17,15 @@ For creator-resolved markets:
17
17
 
18
18
  Set appropriate timestamps:
19
19
  - tradingStartTs: when trading opens (usually now or soon)
20
- - tradingEndTs: when trading closes (usually just before the event)
20
+ - tradingEndTs: when trading closes \u2014 CRITICAL: if the user mentions a specific date (e.g. "before April 22"), use that date. Do not estimate a duration that falls short of the stated deadline.
21
21
  - resolutionStartTs: when the outcome can be checked (usually when event concludes)
22
22
  - resolutionEndTs: deadline for resolution (usually hours/days after event)`}async function we(e){let t=e.systemPrompt??ve(),r=e.userTimeZone?`
23
23
  User timezone: ${e.userTimeZone}. Interpret relative dates accordingly.`:"",{text:n}=await be({model:e.model,system:`${t}
24
24
 
25
25
  Respond ONLY with valid JSON matching this schema. No markdown, no explanation.
26
- Schema: ${JSON.stringify(L.shape)}`,prompt:`Create a prediction market for: "${e.question}"${r}`});return L.parse(JSON.parse(n))}var y=["crypto","sport","pop_culture","technology","politics","science","entertainment"],v="politics",w=["country","person","company","team","crypto","topic"],Pe=6,Te=4,Ee=.85,h=168,U=1,D=720,M=.05,B=.95,$=.02,F=.95,Ae="100",Ie=60,Re=1,xe=5e3,d=["x.com","twitter.com","charts.spotify.com","xtracker.polymarket.com","www.youtube.com","youtube.com","www.espncricinfo.com","espncricinfo.com","liquipedia.net","www.dotabuff.com","dotabuff.com","www.premierleague.com","premierleague.com","gol.gg","www.gol.gg"],P={crypto:"1-4h",sport:"4-12h",news:"18-24h",politics:"18-24h"},X={"9-10":"massive global interest (Super Bowl, elections)","7-8":"mainstream (top-20 crypto, major sports leagues, significant news)","5-6":"niche interest","1-4":"very low interest"},z={"9-10":"URL always contains the answer (CoinGecko, ESPN scoreboard)","7-8":"URL very likely has the answer (major news, official standings)","4-6":"uncertain (general news, social media)","1-3":"unlikely to have a clear answer"},Q={explicit:{min:.9,max:1,label:"URL explicitly states the outcome"},strong:{min:.5,max:.8,label:"Strong but indirect evidence"},tangential:{min:.1,max:.4,label:"Tangentially related content"},none:{min:0,max:.1,label:"No relevant information \u2014 UNKNOWN"}},T=.6,Z={frontrunner:{min:.1,max:.3},midfield:{min:.02,max:.08},backmarker:{min:.002,max:.02}},ke={categories:y,defaultCategory:v,entityTypes:w,viralityThreshold:6,resolutionConfidenceThreshold:4,similarityThreshold:.85,defaultDurationHours:168,minDurationHours:1,maxDurationHours:720,minBinaryProbability:.05,maxBinaryProbability:.95,minOptionProbability:.02,maxOptionProbability:.95,defaultLiquidity:"100",defaultTradingStartBufferSeconds:60,defaultResolutionHours:1,activeMarketCap:5e3,bannedDomains:d,durationHints:P,lowConfidenceOverride:T};function ee(){return new Date().toUTCString()}function Ce(){return new Date().toISOString().slice(0,10)}function Y(e){return`BANNED RESOLUTION DOMAINS (JS-rendered/auth-walled): ${e.join(", ")}. Use alternatives or set confidence \u2264 2.`}function te(e){return e.join("|")}function _e(e){let t={categories:y,defaultDurationHours:168,bannedDomains:d,...e};return`You are a prediction market designer for Prophecy, a blockchain-based prediction market platform. Given a user's natural language prompt, generate a complete, well-structured prediction market.
26
+ Schema: ${JSON.stringify(U.shape)}`,prompt:`Create a prediction market for: "${e.question}"${r}`});return U.parse(JSON.parse(n))}var h=["crypto","sport","pop_culture","technology","politics","science","entertainment"],v="politics",w=["country","person","company","team","crypto","topic"],Te=6,Pe=4,Ee=.85,y=168,D=1,M=720,B=.05,$=.95,F=.02,Y=.95,Ae="100",Ie=60,Re=1,xe=5e3,d=["x.com","twitter.com","charts.spotify.com","xtracker.polymarket.com","www.youtube.com","youtube.com","www.espncricinfo.com","espncricinfo.com","liquipedia.net","www.dotabuff.com","dotabuff.com","www.premierleague.com","premierleague.com","gol.gg","www.gol.gg"],T={crypto:"1-4h",sport:"4-12h",news:"18-24h",politics:"18-24h"},z={"9-10":"massive global interest (Super Bowl, elections)","7-8":"mainstream (top-20 crypto, major sports leagues, significant news)","5-6":"niche interest","1-4":"very low interest"},Q={"9-10":"URL always contains the answer (CoinGecko, ESPN scoreboard)","7-8":"URL very likely has the answer (major news, official standings)","4-6":"uncertain (general news, social media)","1-3":"unlikely to have a clear answer"},Z={explicit:{min:.9,max:1,label:"URL explicitly states the outcome"},strong:{min:.5,max:.8,label:"Strong but indirect evidence"},tangential:{min:.1,max:.4,label:"Tangentially related content"},none:{min:0,max:.1,label:"No relevant information \u2014 UNKNOWN"}},P=.6,ee={frontrunner:{min:.1,max:.3},midfield:{min:.02,max:.08},backmarker:{min:.002,max:.02}},ke={categories:h,defaultCategory:v,entityTypes:w,viralityThreshold:6,resolutionConfidenceThreshold:4,similarityThreshold:.85,defaultDurationHours:168,minDurationHours:1,maxDurationHours:720,minBinaryProbability:.05,maxBinaryProbability:.95,minOptionProbability:.02,maxOptionProbability:.95,defaultLiquidity:"100",defaultTradingStartBufferSeconds:60,defaultResolutionHours:1,activeMarketCap:5e3,bannedDomains:d,durationHints:T,lowConfidenceOverride:P};function te(){return new Date().toUTCString()}function _e(){return new Date().toISOString().slice(0,10)}function V(e){return`BANNED RESOLUTION DOMAINS (JS-rendered/auth-walled): ${e.join(", ")}. Use alternatives or set confidence \u2264 2.`}function re(e){return e.join("|")}function Ce(e){let t={categories:h,defaultDurationHours:168,bannedDomains:d,...e};return`You are a prediction market designer for Prophecy, a blockchain-based prediction market platform. Given a user's natural language prompt, generate a complete, well-structured prediction market.
27
27
 
28
- CURRENT DATE/TIME: ${ee()}
28
+ CURRENT DATE/TIME: ${te()}
29
29
 
30
30
  Return ONLY valid JSON (no markdown, no code fences) with this exact structure:
31
31
  {
@@ -35,9 +35,10 @@ Return ONLY valid JSON (no markdown, no code fences) with this exact structure:
35
35
  "prompt": "Instructions for the AI resolver: what to look for on the resolution page and how to determine YES or NO",
36
36
  "options": ["YES", "NO"],
37
37
  "expected_result": "YES",
38
- "category": "${te(t.categories)}",
38
+ "category": "${re(t.categories)}",
39
39
  "subcategory": "a more specific subcategory",
40
40
  "tags": ["relevant", "tags", "for", "discovery"],
41
+ "trading_end_time": "ISO 8601 UTC timestamp when trading should close",
41
42
  "suggested_duration_hours": ${t.defaultDurationHours},
42
43
  "source_references": ["https://relevant-source.com/specific-page"],
43
44
  "news_context": [{"title": "Article headline", "url": "https://source.com/article", "source": "Publication Name"}]
@@ -57,7 +58,8 @@ Rules:
57
58
  - If the user specifies custom options (not yes/no), use those options instead
58
59
  - For multi-option markets (e.g. "who will win"), use web search to verify the options are CURRENT participants. For sports, use the current season's roster/entry list \u2014 not last year's. For elections, use confirmed candidates. Always include an "Other" option as the last choice.
59
60
  - expected_result should be one of the options
60
- - suggested_duration_hours should be reasonable for the question (1-720 hours). The market MUST end BEFORE the event resolves \u2014 set duration so trading closes just before the event starts/result is announced.
61
+ - trading_end_time (PREFERRED): When the user mentions a specific date or the event has a known deadline, set trading_end_time to an ISO 8601 UTC timestamp. This is more precise than suggested_duration_hours. Example: "before April 22" \u2192 set trading_end_time to "2026-04-22T00:00:00Z".
62
+ - suggested_duration_hours: Fallback when no specific date is mentioned (1-720 hours). The market MUST end BEFORE the event resolves \u2014 set duration so trading closes just before the event starts/result is announced.
61
63
  - source_references should be real, relevant websites that could help verify the outcome \u2014 use FULL URLs to specific pages, not just domains
62
64
  - Do NOT guess URL path segments you are unsure about (e.g., race numbers, event IDs). Use stable hub/event pages instead.
63
65
  - The prompt field is what the AI resolver will see when resolving the market \u2014 make it a clear, answerable question
@@ -67,7 +69,7 @@ ${t.urlGuidance?`
67
69
  ${t.urlGuidance}`:""}
68
70
  ${t.extraInstructions?`
69
71
  ${t.extraInstructions}`:""}
70
- ${Y(t.bannedDomains)}`}function Ne(e){let t={categories:y,durationHints:P,bannedDomains:d,...e},r=Object.entries(t.durationHints).map(([n,i])=>`${n} ${i}`).join(", ");return`You are a prediction market designer for Prophecy, a blockchain-based prediction market platform. Reframe market candidates as SHORT-DURATION prediction markets with clear, near-term resolution.
72
+ ${V(t.bannedDomains)}`}function Ne(e){let t={categories:h,durationHints:T,bannedDomains:d,...e},r=Object.entries(t.durationHints).map(([n,i])=>`${n} ${i}`).join(", ");return`You are a prediction market designer for Prophecy, a blockchain-based prediction market platform. Reframe market candidates as SHORT-DURATION prediction markets with clear, near-term resolution.
71
73
 
72
74
  MARKET FORMAT:
73
75
 
@@ -84,7 +86,7 @@ Do NOT convert genuinely binary questions: price targets, policy decisions, weat
84
86
  When converting, include 4-8 realistic contenders plus "Other".
85
87
 
86
88
  Return ONLY valid JSON (no markdown, no code fences):
87
- {"question":"...", "description":"2-3 sentences", "resolution_criteria":"...", "prompt":"AI resolver instructions", "options":["YES","NO"], "expected_result":"YES", "category":"${te(t.categories)}", "subcategory":"...", "tags":["lowercase"], "suggested_duration_hours":24, "trading_end_time":"ISO 8601 UTC (optional)", "source_references":["full URL"], "virality_score":7, "resolution_url_confidence":8, "is_already_decided":false, "already_decided_reason":"", "yes_probability":0.55, "option_probabilities":null, "news_context":[{"title":"...", "url":"...", "source":"..."}]}
89
+ {"question":"...", "description":"2-3 sentences", "resolution_criteria":"...", "prompt":"AI resolver instructions", "options":["YES","NO"], "expected_result":"YES", "category":"${re(t.categories)}", "subcategory":"...", "tags":["lowercase"], "suggested_duration_hours":24, "trading_end_time":"ISO 8601 UTC (optional)", "source_references":["full URL"], "virality_score":7, "resolution_url_confidence":8, "is_already_decided":false, "already_decided_reason":"", "yes_probability":0.55, "option_probabilities":null, "news_context":[{"title":"...", "url":"...", "source":"..."}]}
88
90
 
89
91
  FIELD GUIDANCE:
90
92
  - prompt: Binary \u2192 tell agent what to check and YES/NO criteria. Multi-outcome \u2192 tell agent which option won, returning exact option string.
@@ -100,8 +102,8 @@ QUESTION NAMING \u2014 be SPECIFIC:
100
102
  Always include teams/competitors + competition, price thresholds + timeframe, specific event/award names, who + what + when. A reader must understand the question without additional context.
101
103
 
102
104
  SCORING:
103
- - virality_score (1-10): ${Object.entries(X).map(([n,i])=>`${n} ${i}`).join(", ")}.
104
- - resolution_url_confidence (1-10): ${Object.entries(z).map(([n,i])=>`${n} ${i}`).join(", ")}.
105
+ - virality_score (1-10): ${Object.entries(z).map(([n,i])=>`${n} ${i}`).join(", ")}.
106
+ - resolution_url_confidence (1-10): ${Object.entries(Q).map(([n,i])=>`${n} ${i}`).join(", ")}.
105
107
 
106
108
  SOURCE-SPECIFIC RULES:
107
109
  - Crypto: Use CoinGecko coin pages, confidence 9-10, duration 1-6h.
@@ -109,7 +111,7 @@ SOURCE-SPECIFIC RULES:
109
111
  - News: Find specific data-rich pages. For search-based: use news.google.com/search?q=... URLs.
110
112
  - Polymarket: Keep same trading_end_time, proposition, deadline, threshold. Use outcomePrices for probabilities. EXCEPTION: convert hidden multi-outcome as above.
111
113
 
112
- ${Y(t.bannedDomains)}
114
+ ${V(t.bannedDomains)}
113
115
 
114
116
  source_references[0] is the URL the AI resolver visits. Must be a FULL URL to a specific page with relevant data. The "prompt" field tells the resolver exactly what to look for on that page.
115
117
  ${t.extraInstructions?`
@@ -136,7 +138,7 @@ Return ONLY valid JSON (no markdown, no code fences):
136
138
 
137
139
  If no candidates should be grouped, return: { "groups": [] }
138
140
  ${t.extraInstructions?`
139
- ${t.extraInstructions}`:""}`}function Oe(e){let t={confidenceTiers:Q,lowConfidenceOverride:T,...e},r=t.confidenceTiers;return`You are evaluating whether a prediction market resolved correctly. You will be given the market question, resolution criteria, and content from a resolution URL. Your job is to determine the outcome based SOLELY on evidence found in the URL content.
141
+ ${t.extraInstructions}`:""}`}function Oe(e){let t={confidenceTiers:Z,lowConfidenceOverride:P,...e},r=t.confidenceTiers;return`You are evaluating whether a prediction market resolved correctly. You will be given the market question, resolution criteria, and content from a resolution URL. Your job is to determine the outcome based SOLELY on evidence found in the URL content.
140
142
 
141
143
  EVIDENCE RULES:
142
144
  - Your ONLY source of truth is the provided URL content. Nothing else.
@@ -152,7 +154,7 @@ CONFIDENCE RULES:
152
154
  - ${r.tangential.min}-${r.tangential.max}: ${r.tangential.label}.
153
155
  - ${r.none.min}-${r.none.max}: ${r.none.label}. You MUST return UNKNOWN in this case.
154
156
 
155
- Current date/time: ${ee()}
157
+ Current date/time: ${te()}
156
158
 
157
159
  Respond with ONLY valid JSON (no markdown, no code fences):
158
160
  {
@@ -175,9 +177,9 @@ ${t.extraCriteria?`7. ${t.extraCriteria}`:""}
175
177
  ONLY select from candidate event ids. Return ONLY raw JSON:
176
178
  {"selected_event_ids": [123, 456, ...], "reasoning": "Brief explanation"}
177
179
  ${t.extraInstructions?`
178
- ${t.extraInstructions}`:""}`}function Ue(e){let t={calibration:Z,...e},r=t.calibration;return`You are a world-class probability estimation expert with deep domain knowledge. Given a group of mutually exclusive outcomes, estimate realistic probabilities that each will occur. Your probabilities MUST sum to exactly 1.0.
180
+ ${t.extraInstructions}`:""}`}function Ue(e){let t={calibration:ee,...e},r=t.calibration;return`You are a world-class probability estimation expert with deep domain knowledge. Given a group of mutually exclusive outcomes, estimate realistic probabilities that each will occur. Your probabilities MUST sum to exactly 1.0.
179
181
 
180
- Current date: ${Ce()}
182
+ Current date: ${_e()}
181
183
 
182
184
  CALIBRATION RULES \u2014 critical for realistic odds:
183
185
  - Frontrunners/favorites should get MUCH higher probabilities than underdogs
@@ -252,8 +254,8 @@ Source-specific URL guidance:
252
254
  - News: Find the most specific, data-rich page possible. For search-based resolution: Use Google News search URLs like https://news.google.com/search?q=specific+search+terms.
253
255
  - Pop culture / entertainment: Use official announcement pages or news search URLs.
254
256
 
255
- ${Y(t.bannedDomains)}
257
+ ${V(t.bannedDomains)}
256
258
  If the only resolution URL for a market would be a banned domain, either find an alternative or set resolution_url_confidence to 2 or below.
257
259
  ${t.extraGuidance?`
258
- ${t.extraGuidance}`:""}`}function re(e,t){let r=t?.min??1,n=t?.max??720,i=t?.fallback??168,a=typeof e=="number"&&Number.isFinite(e)?e:i;return Math.min(n,Math.max(r,a))}function $e(e,t){let r=t?.min??.05,n=t?.max??.95;return Math.min(n,Math.max(r,e))}function Fe(e,t){let r=t?.min??.02,n=t?.max??.95,i=e.map(o=>Math.min(n,Math.max(r,o))),a=i.reduce((o,l)=>o+l,0);return a===0?e.map(()=>1/e.length):i.map(o=>o/a)}function Ye(e){try{let t=new URL(e);return t.protocol==="http:"||t.protocol==="https:"}catch{return!1}}function Ve(e,t){let r=new Set(t??d);try{let n=new URL(e).hostname;return r.has(n)||r.has(n.replace(/^www\./,""))}catch{return!1}}function qe(e){let t=e.replace(/[?!.,;:'"]/g,"").split(/\s+/).slice(0,10).join("+");return`https://news.google.com/search?q=${encodeURIComponent(t)}`}function He(e){let t=e.trim();if(t.includes("```")){let a=t.match(/```(?:json)?\s*([\s\S]*?)```/);a?.[1]&&(t=a[1].trim())}if(!t.startsWith("{")){let a=t.indexOf("{");a!==-1&&(t=t.slice(a))}if(t.includes("}")){let a=t.lastIndexOf("}");t=t.slice(0,a+1)}t=t.replace(/"(?:[^"\\]|\\.)*"/g,a=>a.replace(/\n/g,"\\n").replace(/\r/g,"\\r")),t=t.replace(/,\s*([}\]])/g,"$1");let r;try{r=JSON.parse(t)}catch{throw new Error("Failed to parse LLM response as JSON. Please try again.")}let n=r;if(typeof n.question!="string"||!n.question)throw new Error("Generated market is missing a question");if(!Array.isArray(n.options)||n.options.length<2)throw new Error("Generated market must have at least 2 options");let i=re(n.suggested_duration_hours);return{question:n.question,description:n.description||"",resolution_criteria:n.resolution_criteria||"",prompt:n.prompt||n.question,options:n.options,expected_result:n.expected_result||n.options[0]||"",category:n.category||v,subcategory:n.subcategory||"",tags:Array.isArray(n.tags)?n.tags:[],suggested_duration_hours:i,source_references:Array.isArray(n.source_references)?n.source_references:[],_raw:n}}import{privateKeyToAccount as ne}from"viem/accounts";var ie=60,ae={name:"VenueRegistry",version:"1"},We={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"}]},Ge={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 je(e){let t=ne(e.operatorPrivateKey),r=BigInt(Math.floor(Date.now()/1e3)+ie);return{signature:await t.signTypedData({domain:{...ae,chainId:e.chainId,verifyingContract:e.venueRegistryAddress},types:Ge,primaryType:"TradePermit",message:{marketId:e.marketId,venueId:e.venueId,user:e.user,amount:e.amount,action:e.action,nonce:e.nonce,deadline:r}}),signer:t.address,deadline:r}}async function Ke(e){let t=ne(e.operatorPrivateKey),r=BigInt(Math.floor(Date.now()/1e3)+ie);return{signature:await t.signTypedData({domain:{...ae,chainId:e.chainId,verifyingContract:e.venueRegistryAddress},types:We,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:r}}),signer:t.address,deadline:r}}export{xe as ACTIVE_MARKET_CAP,m as ApiError,d as BANNED_DOMAINS,y as CATEGORIES,v as DEFAULT_CATEGORY,h as DEFAULT_DURATION_HOURS,Ae as DEFAULT_LIQUIDITY,Re as DEFAULT_RESOLUTION_HOURS,Ie as DEFAULT_TRADING_START_BUFFER_SECONDS,P as DURATION_HINTS,w as ENTITY_TYPES,T as LOW_CONFIDENCE_OVERRIDE,ke as MARKET_DEFAULTS,B as MAX_BINARY_PROBABILITY,D as MAX_DURATION_HOURS,F as MAX_OPTION_PROBABILITY,M as MIN_BINARY_PROBABILITY,U as MIN_DURATION_HOURS,$ as MIN_OPTION_PROBABILITY,Te as RESOLUTION_CONFIDENCE_THRESHOLD,Ee as SIMILARITY_THRESHOLD,Pe as VIRALITY_THRESHOLD,Le as buildCarouselPrompt,De as buildEntityExtractionPrompt,Se as buildGroupingPrompt,_e as buildMarketGenerationPrompt,Me as buildNewsContextPrompt,Ue as buildProbabilityEstimationPrompt,Ne as buildReframePrompt,Oe as buildResolutionEvalPrompt,Be as buildUrlGuidanceBlock,$e as clampBinaryProbability,re as clampDuration,k as createCache,C as createChainClient,_ as createEventsApiNamespace,we as createMarketDefinition,fe as createProphecyClient,x as getEventRating,N as getPPLeaderboard,S as getPnLLeaderboard,O as getVolumeLeaderboard,qe as googleNewsFallbackUrl,Ve as isBannedDomain,Ye as isValidUrl,L as marketDefinitionSchema,Fe as normalizeOptionProbabilities,He as parseLlmMarketJson,I as previewRating,R as rateMarketDraft,Ke as signCreateMarketPermit,je as signTradePermit};
260
+ ${t.extraGuidance}`:""}`}function E(e,t){let r=t?.min??1,n=t?.max??720,i=t?.fallback??168,a=typeof e=="number"&&Number.isFinite(e)?e:i;return Math.min(n,Math.max(r,a))}function $e(e,t){let r=t?.min??.05,n=t?.max??.95;return Math.min(n,Math.max(r,e))}function Fe(e,t){let r=t?.min??.02,n=t?.max??.95,i=e.map(s=>Math.min(n,Math.max(r,s))),a=i.reduce((s,l)=>s+l,0);return a===0?e.map(()=>1/e.length):i.map(s=>s/a)}function Ye(e){try{let t=new URL(e);return t.protocol==="http:"||t.protocol==="https:"}catch{return!1}}function Ve(e,t){let r=new Set(t??d);try{let n=new URL(e).hostname;return r.has(n)||r.has(n.replace(/^www\./,""))}catch{return!1}}function qe(e){let t=e.replace(/[?!.,;:'"]/g,"").split(/\s+/).slice(0,10).join("+");return`https://news.google.com/search?q=${encodeURIComponent(t)}`}function He(e){let t=e.trim();if(t.includes("```")){let a=t.match(/```(?:json)?\s*([\s\S]*?)```/);a?.[1]&&(t=a[1].trim())}if(!t.startsWith("{")){let a=t.indexOf("{");a!==-1&&(t=t.slice(a))}if(t.includes("}")){let a=t.lastIndexOf("}");t=t.slice(0,a+1)}t=t.replace(/"(?:[^"\\]|\\.)*"/g,a=>a.replace(/\n/g,"\\n").replace(/\r/g,"\\r")),t=t.replace(/,\s*([}\]])/g,"$1");let r;try{r=JSON.parse(t)}catch{throw new Error("Failed to parse LLM response as JSON. Please try again.")}let n=r;if(typeof n.question!="string"||!n.question)throw new Error("Generated market is missing a question");if(!Array.isArray(n.options)||n.options.length<2)throw new Error("Generated market must have at least 2 options");let i;if(typeof n.trading_end_time=="string"&&n.trading_end_time){let a=new Date(n.trading_end_time),s=Date.now();!Number.isNaN(a.getTime())&&a.getTime()>s?i=E((a.getTime()-s)/36e5):i=E(n.suggested_duration_hours)}else i=E(n.suggested_duration_hours);return{question:n.question,description:n.description||"",resolution_criteria:n.resolution_criteria||"",prompt:n.prompt||n.question,options:n.options,expected_result:n.expected_result||n.options[0]||"",category:n.category||v,subcategory:n.subcategory||"",tags:Array.isArray(n.tags)?n.tags:[],suggested_duration_hours:i,source_references:Array.isArray(n.source_references)?n.source_references:[],_raw:n}}import{privateKeyToAccount as ne}from"viem/accounts";var ie=60,ae={name:"VenueRegistry",version:"1"},We={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"}]},Ge={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 je(e){let t=ne(e.operatorPrivateKey),r=BigInt(Math.floor(Date.now()/1e3)+ie);return{signature:await t.signTypedData({domain:{...ae,chainId:e.chainId,verifyingContract:e.venueRegistryAddress},types:Ge,primaryType:"TradePermit",message:{marketId:e.marketId,venueId:e.venueId,user:e.user,amount:e.amount,action:e.action,nonce:e.nonce,deadline:r}}),signer:t.address,deadline:r}}async function Ke(e){let t=ne(e.operatorPrivateKey),r=BigInt(Math.floor(Date.now()/1e3)+ie);return{signature:await t.signTypedData({domain:{...ae,chainId:e.chainId,verifyingContract:e.venueRegistryAddress},types:We,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:r}}),signer:t.address,deadline:r}}export{xe as ACTIVE_MARKET_CAP,m as ApiError,d as BANNED_DOMAINS,h as CATEGORIES,v as DEFAULT_CATEGORY,y as DEFAULT_DURATION_HOURS,Ae as DEFAULT_LIQUIDITY,Re as DEFAULT_RESOLUTION_HOURS,Ie as DEFAULT_TRADING_START_BUFFER_SECONDS,T as DURATION_HINTS,w as ENTITY_TYPES,P as LOW_CONFIDENCE_OVERRIDE,ke as MARKET_DEFAULTS,$ as MAX_BINARY_PROBABILITY,M as MAX_DURATION_HOURS,Y as MAX_OPTION_PROBABILITY,B as MIN_BINARY_PROBABILITY,D as MIN_DURATION_HOURS,F as MIN_OPTION_PROBABILITY,Pe as RESOLUTION_CONFIDENCE_THRESHOLD,Ee as SIMILARITY_THRESHOLD,Te as VIRALITY_THRESHOLD,Le as buildCarouselPrompt,De as buildEntityExtractionPrompt,Se as buildGroupingPrompt,Ce as buildMarketGenerationPrompt,Me as buildNewsContextPrompt,Ue as buildProbabilityEstimationPrompt,Ne as buildReframePrompt,Oe as buildResolutionEvalPrompt,Be as buildUrlGuidanceBlock,$e as clampBinaryProbability,E as clampDuration,_ as createCache,C as createChainClient,N as createEventsApiNamespace,we as createMarketDefinition,fe as createProphecyClient,k as getEventRating,S as getPPLeaderboard,O as getPnLLeaderboard,L as getVolumeLeaderboard,qe as googleNewsFallbackUrl,Ve as isBannedDomain,Ye as isValidUrl,U as marketDefinitionSchema,Fe as normalizeOptionProbabilities,He as parseLlmMarketJson,R as previewRating,x as rateMarketDraft,Ke as signCreateMarketPermit,je as signTradePermit};
259
261
  //# sourceMappingURL=index.js.map