opentool 0.19.0 → 0.19.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.
@@ -6,6 +6,9 @@ type NewsPropositionStatus = NewsPropositionAnswer | "no_matching_event";
6
6
  type NewsContinuationAction = "continue" | "skip" | "pause";
7
7
  type NewsPredictionMarketMatchedMarket = {
8
8
  marketId: string;
9
+ eventId?: string | null;
10
+ eventSlug?: string | null;
11
+ eventTitle?: string | null;
9
12
  conditionId?: string | null;
10
13
  title: string;
11
14
  slug?: string | null;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/adapters/news/signals.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["const DEFAULT_OPENPOND_GATEWAY_URL = \"https://gateway.openpond.dev\";\n\nexport type NewsEventState =\n | \"monitoring\"\n | \"escalation\"\n | \"de_escalation\"\n | \"resolved\"\n | \"contradiction\";\n\nexport type NewsSignalValue =\n | \"none\"\n | \"escalation\"\n | \"de_escalation\"\n | \"resolved\"\n | \"contradiction\";\n\nexport type NewsPropositionAnswer = \"yes\" | \"no\" | \"unclear\";\nexport type NewsPropositionStatus = NewsPropositionAnswer | \"no_matching_event\";\nexport type NewsContinuationAction = \"continue\" | \"skip\" | \"pause\";\n\nexport type NewsPredictionMarketMatchedMarket = {\n marketId: string;\n conditionId?: string | null;\n title: string;\n slug?: string | null;\n category?: string | null;\n yesProbability?: number | null;\n noProbability?: number | null;\n leadingOutcome?: string | null;\n leadingProbability?: number | null;\n volume?: number | null;\n liquidity?: number | null;\n openInterest?: number | null;\n probabilityDelta1h?: number | null;\n probabilityDelta24h?: number | null;\n fetchedAt: string;\n};\n\nexport type NewsPredictionMarketContext = {\n matchedMarkets: NewsPredictionMarketMatchedMarket[];\n consensusProbability?: number | null;\n probabilityDelta1h?: number | null;\n probabilityDelta24h?: number | null;\n liquidityWeightedScore?: number | null;\n predictionDisagreementScore?: number | null;\n dataAgeMs?: number | null;\n} | null;\n\nexport type NewsSignalEvidence = {\n articleId: string;\n sourceId: string;\n sourceName: string;\n title: string;\n canonicalUrl: string;\n claimType: string;\n claimPolarity: string;\n evidenceConfidence: number;\n evidenceAt: string;\n summary?: string | null;\n contentPreview?: string | null;\n};\n\nexport type NewsSignalConfidenceBreakdown = {\n baseScore: number;\n winningBucketScore: number;\n opposingPenalty: number;\n contradictionPenalty: number;\n stateBonus: number;\n finalScore: number;\n};\n\nexport type NewsEventSignalPolicy = {\n minConfidence: number;\n minIndependentSources: number;\n minTierASources: number;\n cooldownMinutes: number;\n allowedSourceIds?: string[];\n};\n\nexport type NewsEventSignal = {\n eventId: string;\n eventKey: string;\n title: string | null;\n eventState: NewsEventState;\n eventConfidence: number;\n confidenceBreakdown: NewsSignalConfidenceBreakdown;\n signal: NewsSignalValue;\n triggerPassed: boolean;\n policyRisk: \"low\" | \"medium\" | \"high\";\n effectivePolicy: NewsEventSignalPolicy;\n whyNotTriggered: string | null;\n warnings: string[];\n contradictionCount: number;\n supportingSourceCount: number;\n tierASourceCount: number;\n rebuttingSourceSummary: Array<{\n sourceId: string;\n sourceName: string;\n title: string;\n }>;\n evidence: NewsSignalEvidence[];\n dataAgeMs: number | null;\n predictionMarketContext: NewsPredictionMarketContext;\n};\n\nexport type NewsPropositionSignal = {\n question: string;\n query: string | null;\n propositionType: string | null;\n propositionStatus: NewsPropositionStatus;\n answer: NewsPropositionAnswer;\n propositionConfidence: number;\n reasoning: string;\n evidenceWindowSummary: string;\n resolvedEventId: string | null;\n resolvedEventKey: string | null;\n resolvedEventTitle: string | null;\n eventState: NewsEventState | null;\n eventConfidence: number | null;\n confidenceBreakdown: NewsSignalConfidenceBreakdown | null;\n supportingEvidence: NewsSignalEvidence[];\n rebuttingEvidence: NewsSignalEvidence[];\n supportingEvidenceArticleIds: string[];\n rebuttingEvidenceArticleIds: string[];\n operatorReviewRecommended: boolean;\n dataAgeMs: number | null;\n predictionMarketContext: NewsPredictionMarketContext;\n};\n\nexport type NewsEventSignalRequest = {\n gatewayBase?: string | null;\n fetchImplementation?: typeof fetch;\n query?: string;\n eventKey?: string;\n asOf?: string | Date | null;\n includePredictionMarkets?: boolean;\n ingestOnRequest?: boolean;\n maxAgeHours?: number;\n minConfidence?: number;\n minIndependentSources?: number;\n minTierASources?: number;\n};\n\nexport type NewsPropositionSignalRequest = {\n gatewayBase?: string | null;\n fetchImplementation?: typeof fetch;\n question: string;\n query?: string;\n eventKey?: string;\n propositionType?: string;\n asOf?: string | Date | null;\n includePredictionMarkets?: boolean;\n ingestOnRequest?: boolean;\n maxAgeHours?: number;\n candidateLimit?: number;\n};\n\nexport type NewsSignalClientConfig = {\n gatewayBase?: string | null;\n fetchImplementation?: typeof fetch;\n};\n\nexport type NewsEventContinuationGate = {\n mode: \"event\";\n minConfidence?: number;\n maxDataAgeMs?: number;\n minIndependentSources?: number;\n minTierASources?: number;\n requireTriggerPassed?: boolean;\n onBlocked?: Exclude<NewsContinuationAction, \"continue\">;\n};\n\nexport type NewsPropositionContinuationGate = {\n mode: \"proposition\";\n expectedAnswer?: NewsPropositionAnswer;\n minConfidence?: number;\n maxDataAgeMs?: number;\n requireResolvedEvent?: boolean;\n onBlocked?: Exclude<NewsContinuationAction, \"continue\">;\n};\n\nexport type NewsContinuationGate =\n | NewsEventContinuationGate\n | NewsPropositionContinuationGate;\n\nexport type NewsContinuationGateResult = {\n allowed: boolean;\n action: NewsContinuationAction;\n reason: string;\n matchedRule: NewsContinuationGate[\"mode\"];\n blockingFactors: string[];\n};\n\nfunction resolveFetchImplementation(override?: typeof fetch): typeof fetch {\n const fetchImplementation = override ?? globalThis.fetch;\n if (!fetchImplementation) {\n throw new Error(\n \"No fetch implementation available. Provide one via NewsSignalClientConfig.fetchImplementation.\",\n );\n }\n return fetchImplementation;\n}\n\nexport function resolveNewsGatewayBase(override?: string | null): string {\n const value = override ?? process.env.OPENPOND_GATEWAY_URL ?? DEFAULT_OPENPOND_GATEWAY_URL;\n if (typeof value !== \"string\") {\n throw new Error(\"OPENPOND_GATEWAY_URL is required.\");\n }\n const trimmed = value.trim();\n if (!trimmed) {\n throw new Error(\"OPENPOND_GATEWAY_URL is required.\");\n }\n return trimmed.replace(/\\/$/, \"\");\n}\n\nfunction normalizeAsOf(value?: string | Date | null): string | undefined {\n if (value == null) return undefined;\n const date = value instanceof Date ? value : new Date(value);\n if (Number.isNaN(date.getTime())) {\n throw new Error(\"asOf must be a valid ISO-8601 datetime or Date.\");\n }\n return date.toISOString();\n}\n\nasync function postGatewayJson<T>(params: {\n path: string;\n body: Record<string, unknown>;\n gatewayBase?: string | null | undefined;\n fetchImplementation?: typeof fetch | undefined;\n}): Promise<T> {\n const gatewayBase = resolveNewsGatewayBase(params.gatewayBase);\n const fetchImplementation = resolveFetchImplementation(params.fetchImplementation);\n const response = await fetchImplementation(`${gatewayBase}${params.path}`, {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify(params.body),\n });\n const text = await response.text().catch(() => \"\");\n let payload: unknown = null;\n try {\n payload = text ? (JSON.parse(text) as unknown) : null;\n } catch {\n payload = text;\n }\n if (!response.ok) {\n throw new Error(\n `Gateway request failed (${response.status}) for ${params.path}: ${\n typeof payload === \"string\" && payload ? payload : \"no_body\"\n }`,\n );\n }\n return payload as T;\n}\n\nexport async function fetchNewsEventSignal(\n params: NewsEventSignalRequest,\n): Promise<NewsEventSignal> {\n if (!params.query?.trim() && !params.eventKey?.trim()) {\n throw new Error(\"query or eventKey is required.\");\n }\n\n return postGatewayJson<NewsEventSignal>({\n path: \"/v1/news/event-signal\",\n gatewayBase: params.gatewayBase,\n fetchImplementation: params.fetchImplementation,\n body: {\n ...(params.query?.trim() ? { query: params.query.trim() } : {}),\n ...(params.eventKey?.trim() ? { eventKey: params.eventKey.trim() } : {}),\n ...(normalizeAsOf(params.asOf) ? { asOf: normalizeAsOf(params.asOf) } : {}),\n ...(typeof params.includePredictionMarkets === \"boolean\"\n ? { includePredictionMarkets: params.includePredictionMarkets }\n : {}),\n ...(typeof params.ingestOnRequest === \"boolean\"\n ? { ingestOnRequest: params.ingestOnRequest }\n : {}),\n ...(typeof params.maxAgeHours === \"number\" ? { maxAgeHours: params.maxAgeHours } : {}),\n policy: {\n ...(typeof params.minConfidence === \"number\"\n ? { minConfidence: params.minConfidence }\n : {}),\n ...(typeof params.minIndependentSources === \"number\"\n ? { minIndependentSources: params.minIndependentSources }\n : {}),\n ...(typeof params.minTierASources === \"number\"\n ? { minTierASources: params.minTierASources }\n : {}),\n },\n },\n });\n}\n\nexport async function fetchNewsPropositionSignal(\n params: NewsPropositionSignalRequest,\n): Promise<NewsPropositionSignal> {\n const question = params.question.trim();\n if (!question) {\n throw new Error(\"question is required.\");\n }\n\n return postGatewayJson<NewsPropositionSignal>({\n path: \"/v1/news/event-proposition-signal\",\n gatewayBase: params.gatewayBase,\n fetchImplementation: params.fetchImplementation,\n body: {\n question,\n ...(params.query?.trim() ? { query: params.query.trim() } : {}),\n ...(params.eventKey?.trim() ? { eventKey: params.eventKey.trim() } : {}),\n ...(params.propositionType?.trim()\n ? { propositionType: params.propositionType.trim() }\n : {}),\n ...(normalizeAsOf(params.asOf) ? { asOf: normalizeAsOf(params.asOf) } : {}),\n ...(typeof params.includePredictionMarkets === \"boolean\"\n ? { includePredictionMarkets: params.includePredictionMarkets }\n : {}),\n ...(typeof params.ingestOnRequest === \"boolean\"\n ? { ingestOnRequest: params.ingestOnRequest }\n : {}),\n ...(typeof params.maxAgeHours === \"number\" ? { maxAgeHours: params.maxAgeHours } : {}),\n ...(typeof params.candidateLimit === \"number\"\n ? { candidateLimit: params.candidateLimit }\n : {}),\n },\n });\n}\n\nexport function evaluateNewsContinuationGate(\n signal: NewsEventSignal | NewsPropositionSignal,\n gate: NewsContinuationGate,\n): NewsContinuationGateResult {\n const blockedAction = gate.onBlocked ?? \"skip\";\n const blockingFactors: string[] = [];\n\n if (gate.mode === \"event\") {\n const eventSignal = signal as NewsEventSignal;\n if (gate.requireTriggerPassed !== false && !eventSignal.triggerPassed) {\n blockingFactors.push(\"trigger_not_passed\");\n }\n if (\n typeof gate.minConfidence === \"number\" &&\n eventSignal.eventConfidence < gate.minConfidence\n ) {\n blockingFactors.push(\"confidence_below_threshold\");\n }\n if (\n typeof gate.maxDataAgeMs === \"number\" &&\n typeof eventSignal.dataAgeMs === \"number\" &&\n eventSignal.dataAgeMs > gate.maxDataAgeMs\n ) {\n blockingFactors.push(\"signal_too_stale\");\n }\n if (\n typeof gate.minIndependentSources === \"number\" &&\n eventSignal.supportingSourceCount < gate.minIndependentSources\n ) {\n blockingFactors.push(\"insufficient_supporting_sources\");\n }\n if (\n typeof gate.minTierASources === \"number\" &&\n eventSignal.tierASourceCount < gate.minTierASources\n ) {\n blockingFactors.push(\"insufficient_tier_a_sources\");\n }\n } else {\n const propositionSignal = signal as NewsPropositionSignal;\n if (\n gate.requireResolvedEvent !== false &&\n propositionSignal.propositionStatus === \"no_matching_event\"\n ) {\n blockingFactors.push(\"no_matching_event\");\n }\n if (\n gate.expectedAnswer &&\n propositionSignal.answer !== gate.expectedAnswer\n ) {\n blockingFactors.push(\"unexpected_answer\");\n }\n if (\n typeof gate.minConfidence === \"number\" &&\n propositionSignal.propositionConfidence < gate.minConfidence\n ) {\n blockingFactors.push(\"confidence_below_threshold\");\n }\n if (\n typeof gate.maxDataAgeMs === \"number\" &&\n typeof propositionSignal.dataAgeMs === \"number\" &&\n propositionSignal.dataAgeMs > gate.maxDataAgeMs\n ) {\n blockingFactors.push(\"signal_too_stale\");\n }\n }\n\n if (blockingFactors.length === 0) {\n return {\n allowed: true,\n action: \"continue\",\n reason: \"All continuation gate checks passed.\",\n matchedRule: gate.mode,\n blockingFactors: [],\n };\n }\n\n return {\n allowed: false,\n action: blockedAction,\n reason: `Blocked by continuation gate: ${blockingFactors.join(\", \")}.`,\n matchedRule: gate.mode,\n blockingFactors,\n };\n}\n\nexport class NewsSignalClient {\n private readonly gatewayBase: string;\n private readonly fetchImplementation: typeof fetch;\n\n constructor(config: NewsSignalClientConfig = {}) {\n this.gatewayBase = resolveNewsGatewayBase(config.gatewayBase);\n this.fetchImplementation = resolveFetchImplementation(config.fetchImplementation);\n }\n\n eventSignal(\n params: Omit<NewsEventSignalRequest, \"gatewayBase\" | \"fetchImplementation\">,\n ) {\n return fetchNewsEventSignal({\n ...params,\n gatewayBase: this.gatewayBase,\n fetchImplementation: this.fetchImplementation,\n });\n }\n\n propositionSignal(\n params: Omit<NewsPropositionSignalRequest, \"gatewayBase\" | \"fetchImplementation\">,\n ) {\n return fetchNewsPropositionSignal({\n ...params,\n gatewayBase: this.gatewayBase,\n fetchImplementation: this.fetchImplementation,\n });\n }\n}\n\nexport { DEFAULT_OPENPOND_GATEWAY_URL };\n"]}
1
+ {"version":3,"sources":["../../../src/adapters/news/signals.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["const DEFAULT_OPENPOND_GATEWAY_URL = \"https://gateway.openpond.dev\";\n\nexport type NewsEventState =\n | \"monitoring\"\n | \"escalation\"\n | \"de_escalation\"\n | \"resolved\"\n | \"contradiction\";\n\nexport type NewsSignalValue =\n | \"none\"\n | \"escalation\"\n | \"de_escalation\"\n | \"resolved\"\n | \"contradiction\";\n\nexport type NewsPropositionAnswer = \"yes\" | \"no\" | \"unclear\";\nexport type NewsPropositionStatus = NewsPropositionAnswer | \"no_matching_event\";\nexport type NewsContinuationAction = \"continue\" | \"skip\" | \"pause\";\n\nexport type NewsPredictionMarketMatchedMarket = {\n marketId: string;\n eventId?: string | null;\n eventSlug?: string | null;\n eventTitle?: string | null;\n conditionId?: string | null;\n title: string;\n slug?: string | null;\n category?: string | null;\n yesProbability?: number | null;\n noProbability?: number | null;\n leadingOutcome?: string | null;\n leadingProbability?: number | null;\n volume?: number | null;\n liquidity?: number | null;\n openInterest?: number | null;\n probabilityDelta1h?: number | null;\n probabilityDelta24h?: number | null;\n fetchedAt: string;\n};\n\nexport type NewsPredictionMarketContext = {\n matchedMarkets: NewsPredictionMarketMatchedMarket[];\n consensusProbability?: number | null;\n probabilityDelta1h?: number | null;\n probabilityDelta24h?: number | null;\n liquidityWeightedScore?: number | null;\n predictionDisagreementScore?: number | null;\n dataAgeMs?: number | null;\n} | null;\n\nexport type NewsSignalEvidence = {\n articleId: string;\n sourceId: string;\n sourceName: string;\n title: string;\n canonicalUrl: string;\n claimType: string;\n claimPolarity: string;\n evidenceConfidence: number;\n evidenceAt: string;\n summary?: string | null;\n contentPreview?: string | null;\n};\n\nexport type NewsSignalConfidenceBreakdown = {\n baseScore: number;\n winningBucketScore: number;\n opposingPenalty: number;\n contradictionPenalty: number;\n stateBonus: number;\n finalScore: number;\n};\n\nexport type NewsEventSignalPolicy = {\n minConfidence: number;\n minIndependentSources: number;\n minTierASources: number;\n cooldownMinutes: number;\n allowedSourceIds?: string[];\n};\n\nexport type NewsEventSignal = {\n eventId: string;\n eventKey: string;\n title: string | null;\n eventState: NewsEventState;\n eventConfidence: number;\n confidenceBreakdown: NewsSignalConfidenceBreakdown;\n signal: NewsSignalValue;\n triggerPassed: boolean;\n policyRisk: \"low\" | \"medium\" | \"high\";\n effectivePolicy: NewsEventSignalPolicy;\n whyNotTriggered: string | null;\n warnings: string[];\n contradictionCount: number;\n supportingSourceCount: number;\n tierASourceCount: number;\n rebuttingSourceSummary: Array<{\n sourceId: string;\n sourceName: string;\n title: string;\n }>;\n evidence: NewsSignalEvidence[];\n dataAgeMs: number | null;\n predictionMarketContext: NewsPredictionMarketContext;\n};\n\nexport type NewsPropositionSignal = {\n question: string;\n query: string | null;\n propositionType: string | null;\n propositionStatus: NewsPropositionStatus;\n answer: NewsPropositionAnswer;\n propositionConfidence: number;\n reasoning: string;\n evidenceWindowSummary: string;\n resolvedEventId: string | null;\n resolvedEventKey: string | null;\n resolvedEventTitle: string | null;\n eventState: NewsEventState | null;\n eventConfidence: number | null;\n confidenceBreakdown: NewsSignalConfidenceBreakdown | null;\n supportingEvidence: NewsSignalEvidence[];\n rebuttingEvidence: NewsSignalEvidence[];\n supportingEvidenceArticleIds: string[];\n rebuttingEvidenceArticleIds: string[];\n operatorReviewRecommended: boolean;\n dataAgeMs: number | null;\n predictionMarketContext: NewsPredictionMarketContext;\n};\n\nexport type NewsEventSignalRequest = {\n gatewayBase?: string | null;\n fetchImplementation?: typeof fetch;\n query?: string;\n eventKey?: string;\n asOf?: string | Date | null;\n includePredictionMarkets?: boolean;\n ingestOnRequest?: boolean;\n maxAgeHours?: number;\n minConfidence?: number;\n minIndependentSources?: number;\n minTierASources?: number;\n};\n\nexport type NewsPropositionSignalRequest = {\n gatewayBase?: string | null;\n fetchImplementation?: typeof fetch;\n question: string;\n query?: string;\n eventKey?: string;\n propositionType?: string;\n asOf?: string | Date | null;\n includePredictionMarkets?: boolean;\n ingestOnRequest?: boolean;\n maxAgeHours?: number;\n candidateLimit?: number;\n};\n\nexport type NewsSignalClientConfig = {\n gatewayBase?: string | null;\n fetchImplementation?: typeof fetch;\n};\n\nexport type NewsEventContinuationGate = {\n mode: \"event\";\n minConfidence?: number;\n maxDataAgeMs?: number;\n minIndependentSources?: number;\n minTierASources?: number;\n requireTriggerPassed?: boolean;\n onBlocked?: Exclude<NewsContinuationAction, \"continue\">;\n};\n\nexport type NewsPropositionContinuationGate = {\n mode: \"proposition\";\n expectedAnswer?: NewsPropositionAnswer;\n minConfidence?: number;\n maxDataAgeMs?: number;\n requireResolvedEvent?: boolean;\n onBlocked?: Exclude<NewsContinuationAction, \"continue\">;\n};\n\nexport type NewsContinuationGate = NewsEventContinuationGate | NewsPropositionContinuationGate;\n\nexport type NewsContinuationGateResult = {\n allowed: boolean;\n action: NewsContinuationAction;\n reason: string;\n matchedRule: NewsContinuationGate[\"mode\"];\n blockingFactors: string[];\n};\n\nfunction resolveFetchImplementation(override?: typeof fetch): typeof fetch {\n const fetchImplementation = override ?? globalThis.fetch;\n if (!fetchImplementation) {\n throw new Error(\n \"No fetch implementation available. Provide one via NewsSignalClientConfig.fetchImplementation.\",\n );\n }\n return fetchImplementation;\n}\n\nexport function resolveNewsGatewayBase(override?: string | null): string {\n const value = override ?? process.env.OPENPOND_GATEWAY_URL ?? DEFAULT_OPENPOND_GATEWAY_URL;\n if (typeof value !== \"string\") {\n throw new Error(\"OPENPOND_GATEWAY_URL is required.\");\n }\n const trimmed = value.trim();\n if (!trimmed) {\n throw new Error(\"OPENPOND_GATEWAY_URL is required.\");\n }\n return trimmed.replace(/\\/$/, \"\");\n}\n\nfunction normalizeAsOf(value?: string | Date | null): string | undefined {\n if (value == null) return undefined;\n const date = value instanceof Date ? value : new Date(value);\n if (Number.isNaN(date.getTime())) {\n throw new Error(\"asOf must be a valid ISO-8601 datetime or Date.\");\n }\n return date.toISOString();\n}\n\nasync function postGatewayJson<T>(params: {\n path: string;\n body: Record<string, unknown>;\n gatewayBase?: string | null | undefined;\n fetchImplementation?: typeof fetch | undefined;\n}): Promise<T> {\n const gatewayBase = resolveNewsGatewayBase(params.gatewayBase);\n const fetchImplementation = resolveFetchImplementation(params.fetchImplementation);\n const response = await fetchImplementation(`${gatewayBase}${params.path}`, {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify(params.body),\n });\n const text = await response.text().catch(() => \"\");\n let payload: unknown = null;\n try {\n payload = text ? (JSON.parse(text) as unknown) : null;\n } catch {\n payload = text;\n }\n if (!response.ok) {\n throw new Error(\n `Gateway request failed (${response.status}) for ${params.path}: ${\n typeof payload === \"string\" && payload ? payload : \"no_body\"\n }`,\n );\n }\n return payload as T;\n}\n\nexport async function fetchNewsEventSignal(\n params: NewsEventSignalRequest,\n): Promise<NewsEventSignal> {\n if (!params.query?.trim() && !params.eventKey?.trim()) {\n throw new Error(\"query or eventKey is required.\");\n }\n\n return postGatewayJson<NewsEventSignal>({\n path: \"/v1/news/event-signal\",\n gatewayBase: params.gatewayBase,\n fetchImplementation: params.fetchImplementation,\n body: {\n ...(params.query?.trim() ? { query: params.query.trim() } : {}),\n ...(params.eventKey?.trim() ? { eventKey: params.eventKey.trim() } : {}),\n ...(normalizeAsOf(params.asOf) ? { asOf: normalizeAsOf(params.asOf) } : {}),\n ...(typeof params.includePredictionMarkets === \"boolean\"\n ? { includePredictionMarkets: params.includePredictionMarkets }\n : {}),\n ...(typeof params.ingestOnRequest === \"boolean\"\n ? { ingestOnRequest: params.ingestOnRequest }\n : {}),\n ...(typeof params.maxAgeHours === \"number\" ? { maxAgeHours: params.maxAgeHours } : {}),\n policy: {\n ...(typeof params.minConfidence === \"number\"\n ? { minConfidence: params.minConfidence }\n : {}),\n ...(typeof params.minIndependentSources === \"number\"\n ? { minIndependentSources: params.minIndependentSources }\n : {}),\n ...(typeof params.minTierASources === \"number\"\n ? { minTierASources: params.minTierASources }\n : {}),\n },\n },\n });\n}\n\nexport async function fetchNewsPropositionSignal(\n params: NewsPropositionSignalRequest,\n): Promise<NewsPropositionSignal> {\n const question = params.question.trim();\n if (!question) {\n throw new Error(\"question is required.\");\n }\n\n return postGatewayJson<NewsPropositionSignal>({\n path: \"/v1/news/event-proposition-signal\",\n gatewayBase: params.gatewayBase,\n fetchImplementation: params.fetchImplementation,\n body: {\n question,\n ...(params.query?.trim() ? { query: params.query.trim() } : {}),\n ...(params.eventKey?.trim() ? { eventKey: params.eventKey.trim() } : {}),\n ...(params.propositionType?.trim() ? { propositionType: params.propositionType.trim() } : {}),\n ...(normalizeAsOf(params.asOf) ? { asOf: normalizeAsOf(params.asOf) } : {}),\n ...(typeof params.includePredictionMarkets === \"boolean\"\n ? { includePredictionMarkets: params.includePredictionMarkets }\n : {}),\n ...(typeof params.ingestOnRequest === \"boolean\"\n ? { ingestOnRequest: params.ingestOnRequest }\n : {}),\n ...(typeof params.maxAgeHours === \"number\" ? { maxAgeHours: params.maxAgeHours } : {}),\n ...(typeof params.candidateLimit === \"number\"\n ? { candidateLimit: params.candidateLimit }\n : {}),\n },\n });\n}\n\nexport function evaluateNewsContinuationGate(\n signal: NewsEventSignal | NewsPropositionSignal,\n gate: NewsContinuationGate,\n): NewsContinuationGateResult {\n const blockedAction = gate.onBlocked ?? \"skip\";\n const blockingFactors: string[] = [];\n\n if (gate.mode === \"event\") {\n const eventSignal = signal as NewsEventSignal;\n if (gate.requireTriggerPassed !== false && !eventSignal.triggerPassed) {\n blockingFactors.push(\"trigger_not_passed\");\n }\n if (\n typeof gate.minConfidence === \"number\" &&\n eventSignal.eventConfidence < gate.minConfidence\n ) {\n blockingFactors.push(\"confidence_below_threshold\");\n }\n if (\n typeof gate.maxDataAgeMs === \"number\" &&\n typeof eventSignal.dataAgeMs === \"number\" &&\n eventSignal.dataAgeMs > gate.maxDataAgeMs\n ) {\n blockingFactors.push(\"signal_too_stale\");\n }\n if (\n typeof gate.minIndependentSources === \"number\" &&\n eventSignal.supportingSourceCount < gate.minIndependentSources\n ) {\n blockingFactors.push(\"insufficient_supporting_sources\");\n }\n if (\n typeof gate.minTierASources === \"number\" &&\n eventSignal.tierASourceCount < gate.minTierASources\n ) {\n blockingFactors.push(\"insufficient_tier_a_sources\");\n }\n } else {\n const propositionSignal = signal as NewsPropositionSignal;\n if (\n gate.requireResolvedEvent !== false &&\n propositionSignal.propositionStatus === \"no_matching_event\"\n ) {\n blockingFactors.push(\"no_matching_event\");\n }\n if (gate.expectedAnswer && propositionSignal.answer !== gate.expectedAnswer) {\n blockingFactors.push(\"unexpected_answer\");\n }\n if (\n typeof gate.minConfidence === \"number\" &&\n propositionSignal.propositionConfidence < gate.minConfidence\n ) {\n blockingFactors.push(\"confidence_below_threshold\");\n }\n if (\n typeof gate.maxDataAgeMs === \"number\" &&\n typeof propositionSignal.dataAgeMs === \"number\" &&\n propositionSignal.dataAgeMs > gate.maxDataAgeMs\n ) {\n blockingFactors.push(\"signal_too_stale\");\n }\n }\n\n if (blockingFactors.length === 0) {\n return {\n allowed: true,\n action: \"continue\",\n reason: \"All continuation gate checks passed.\",\n matchedRule: gate.mode,\n blockingFactors: [],\n };\n }\n\n return {\n allowed: false,\n action: blockedAction,\n reason: `Blocked by continuation gate: ${blockingFactors.join(\", \")}.`,\n matchedRule: gate.mode,\n blockingFactors,\n };\n}\n\nexport class NewsSignalClient {\n private readonly gatewayBase: string;\n private readonly fetchImplementation: typeof fetch;\n\n constructor(config: NewsSignalClientConfig = {}) {\n this.gatewayBase = resolveNewsGatewayBase(config.gatewayBase);\n this.fetchImplementation = resolveFetchImplementation(config.fetchImplementation);\n }\n\n eventSignal(params: Omit<NewsEventSignalRequest, \"gatewayBase\" | \"fetchImplementation\">) {\n return fetchNewsEventSignal({\n ...params,\n gatewayBase: this.gatewayBase,\n fetchImplementation: this.fetchImplementation,\n });\n }\n\n propositionSignal(\n params: Omit<NewsPropositionSignalRequest, \"gatewayBase\" | \"fetchImplementation\">,\n ) {\n return fetchNewsPropositionSignal({\n ...params,\n gatewayBase: this.gatewayBase,\n fetchImplementation: this.fetchImplementation,\n });\n }\n}\n\nexport { DEFAULT_OPENPOND_GATEWAY_URL };\n"]}
@@ -1,5 +1,5 @@
1
1
  import { h as WalletFullContext } from '../../types-BaTmu0gS.js';
2
- import 'viem';
2
+ import { PublicClient } from 'viem';
3
3
  import 'viem/accounts';
4
4
 
5
5
  type PolymarketEnvironment = "mainnet" | "testnet";
@@ -200,6 +200,7 @@ declare function createOrDerivePolymarketApiKey(args: PolymarketApiKeyRequestArg
200
200
  declare function placePolymarketOrder(args: {
201
201
  wallet: WalletFullContext;
202
202
  credentials?: PolymarketApiCredentials;
203
+ apiKeyNonce?: number;
203
204
  order: PolymarketOrderIntent;
204
205
  orderType?: PolymarketOrderType;
205
206
  environment?: PolymarketEnvironment;
@@ -209,6 +210,7 @@ declare function cancelPolymarketOrder(args: {
209
210
  wallet?: WalletFullContext;
210
211
  walletAddress?: `0x${string}`;
211
212
  credentials?: PolymarketApiCredentials;
213
+ apiKeyNonce?: number;
212
214
  environment?: PolymarketEnvironment;
213
215
  }): Promise<Record<string, unknown>>;
214
216
  declare function cancelPolymarketOrders(args: {
@@ -216,12 +218,14 @@ declare function cancelPolymarketOrders(args: {
216
218
  wallet?: WalletFullContext;
217
219
  walletAddress?: `0x${string}`;
218
220
  credentials?: PolymarketApiCredentials;
221
+ apiKeyNonce?: number;
219
222
  environment?: PolymarketEnvironment;
220
223
  }): Promise<Record<string, unknown>>;
221
224
  declare function cancelAllPolymarketOrders(args: {
222
225
  wallet?: WalletFullContext;
223
226
  walletAddress?: `0x${string}`;
224
227
  credentials?: PolymarketApiCredentials;
228
+ apiKeyNonce?: number;
225
229
  environment?: PolymarketEnvironment;
226
230
  }): Promise<Record<string, unknown>>;
227
231
  declare function cancelMarketPolymarketOrders(args: {
@@ -229,16 +233,19 @@ declare function cancelMarketPolymarketOrders(args: {
229
233
  wallet?: WalletFullContext;
230
234
  walletAddress?: `0x${string}`;
231
235
  credentials?: PolymarketApiCredentials;
236
+ apiKeyNonce?: number;
232
237
  environment?: PolymarketEnvironment;
233
238
  }): Promise<Record<string, unknown>>;
234
239
  declare class PolymarketExchangeClient {
235
240
  private readonly wallet;
236
241
  private readonly credentials;
242
+ private readonly apiKeyNonce;
237
243
  private readonly environment;
238
244
  private cachedCredentials;
239
245
  constructor(args: {
240
246
  wallet: WalletFullContext;
241
247
  credentials?: PolymarketApiCredentials;
248
+ apiKeyNonce?: number;
242
249
  environment?: PolymarketEnvironment;
243
250
  });
244
251
  private getCredentials;
@@ -456,4 +463,69 @@ declare function fetchPolymarketPublicProfile(params: {
456
463
  environment?: PolymarketEnvironment;
457
464
  }): Promise<PolymarketPublicProfile | null>;
458
465
 
459
- export { POLYMARKET_CHAIN_ID, POLYMARKET_CLOB_AUTH_DOMAIN, POLYMARKET_CLOB_DOMAIN, POLYMARKET_ENDPOINTS, POLYMARKET_EXCHANGE_ADDRESSES, type PolymarketActivityType, type PolymarketApiCredentials, PolymarketApiError, type PolymarketApiKeyResponse, PolymarketAuthError, type PolymarketClosedPosition, type PolymarketClosedPositionParams, type PolymarketEnvironment, PolymarketExchangeClient, PolymarketInfoClient, type PolymarketMarket, type PolymarketOrderIntent, type PolymarketOrderType, type PolymarketOrderbook, type PolymarketPlaceOrderResponse, type PolymarketPositionValue, type PolymarketPositionValueParams, type PolymarketPriceHistoryPoint, type PolymarketPublicProfile, type PolymarketPublicProfileUser, type PolymarketSide, type PolymarketSignatureType, type PolymarketSignedOrderPayload, type PolymarketUserActivity, type PolymarketUserActivityParams, type PolymarketUserPosition, type PolymarketUserPositionParams, buildHmacSignature, buildL1Headers, buildL2Headers, buildPolymarketOrderAmounts, buildSignedOrderPayload, cancelAllPolymarketOrders, cancelMarketPolymarketOrders, cancelPolymarketOrder, cancelPolymarketOrders, createOrDerivePolymarketApiKey, createPolymarketApiKey, derivePolymarketApiKey, fetchPolymarketActivity, fetchPolymarketClosedPositions, fetchPolymarketMarket, fetchPolymarketMarkets, fetchPolymarketMidpoint, fetchPolymarketOrderbook, fetchPolymarketPositionValue, fetchPolymarketPositions, fetchPolymarketPrice, fetchPolymarketPriceHistory, fetchPolymarketPublicProfile, normalizeNumberArrayish, normalizeStringArrayish, placePolymarketOrder, resolveExchangeAddress, resolvePolymarketBaseUrl };
466
+ interface PolymarketBootstrapContracts {
467
+ usdc: `0x${string}`;
468
+ ctf: `0x${string}`;
469
+ negRiskAdapter: `0x${string}`;
470
+ safeFactory: `0x${string}`;
471
+ safeMultisend: `0x${string}`;
472
+ relayerUrl: string;
473
+ bridgeUrl: string;
474
+ }
475
+ interface PolymarketBootstrapTransaction {
476
+ to: `0x${string}`;
477
+ data: `0x${string}`;
478
+ value: string;
479
+ description: string;
480
+ }
481
+ interface PolymarketDepositAddressSet {
482
+ evm?: string | null;
483
+ svm?: string | null;
484
+ btc?: string | null;
485
+ sol?: string | null;
486
+ [key: string]: unknown;
487
+ }
488
+ interface PolymarketDepositAddressesResponse {
489
+ address?: PolymarketDepositAddressSet | null;
490
+ note?: string | null;
491
+ [key: string]: unknown;
492
+ }
493
+ interface PolymarketApprovalState {
494
+ funder: `0x${string}`;
495
+ usdcAllowance: bigint;
496
+ usdcApproved: boolean;
497
+ ctfExchangeApproved: boolean;
498
+ negRiskExchangeApproved: boolean;
499
+ approvalsReady: boolean;
500
+ }
501
+ declare function resolvePolymarketBootstrapContracts(environment: PolymarketEnvironment): PolymarketBootstrapContracts;
502
+ declare function buildPolymarketUsdcApprovalTransaction(args?: {
503
+ environment?: PolymarketEnvironment;
504
+ amount?: bigint;
505
+ }): PolymarketBootstrapTransaction;
506
+ declare function buildPolymarketOutcomeTokenApprovalTransactions(args?: {
507
+ environment?: PolymarketEnvironment;
508
+ includeNegRisk?: boolean;
509
+ }): PolymarketBootstrapTransaction[];
510
+ declare function buildPolymarketApprovalTransactions(args?: {
511
+ environment?: PolymarketEnvironment;
512
+ amount?: bigint;
513
+ includeNegRisk?: boolean;
514
+ }): PolymarketBootstrapTransaction[];
515
+ declare function fetchPolymarketApprovalState(args: {
516
+ publicClient: Pick<PublicClient, "readContract">;
517
+ funder: `0x${string}`;
518
+ environment?: PolymarketEnvironment;
519
+ includeNegRisk?: boolean;
520
+ }): Promise<PolymarketApprovalState>;
521
+ declare function fetchPolymarketDepositAddresses(args: {
522
+ address: string;
523
+ environment?: PolymarketEnvironment;
524
+ }): Promise<PolymarketDepositAddressesResponse>;
525
+ declare function decodePolymarketBootstrapTransaction(transaction: PolymarketBootstrapTransaction): {
526
+ to: `0x${string}`;
527
+ functionName: string;
528
+ args: readonly unknown[];
529
+ };
530
+
531
+ export { POLYMARKET_CHAIN_ID, POLYMARKET_CLOB_AUTH_DOMAIN, POLYMARKET_CLOB_DOMAIN, POLYMARKET_ENDPOINTS, POLYMARKET_EXCHANGE_ADDRESSES, type PolymarketActivityType, type PolymarketApiCredentials, PolymarketApiError, type PolymarketApiKeyResponse, type PolymarketApprovalState, PolymarketAuthError, type PolymarketBootstrapContracts, type PolymarketBootstrapTransaction, type PolymarketClosedPosition, type PolymarketClosedPositionParams, type PolymarketDepositAddressSet, type PolymarketDepositAddressesResponse, type PolymarketEnvironment, PolymarketExchangeClient, PolymarketInfoClient, type PolymarketMarket, type PolymarketOrderIntent, type PolymarketOrderType, type PolymarketOrderbook, type PolymarketPlaceOrderResponse, type PolymarketPositionValue, type PolymarketPositionValueParams, type PolymarketPriceHistoryPoint, type PolymarketPublicProfile, type PolymarketPublicProfileUser, type PolymarketSide, type PolymarketSignatureType, type PolymarketSignedOrderPayload, type PolymarketUserActivity, type PolymarketUserActivityParams, type PolymarketUserPosition, type PolymarketUserPositionParams, buildHmacSignature, buildL1Headers, buildL2Headers, buildPolymarketApprovalTransactions, buildPolymarketOrderAmounts, buildPolymarketOutcomeTokenApprovalTransactions, buildPolymarketUsdcApprovalTransaction, buildSignedOrderPayload, cancelAllPolymarketOrders, cancelMarketPolymarketOrders, cancelPolymarketOrder, cancelPolymarketOrders, createOrDerivePolymarketApiKey, createPolymarketApiKey, decodePolymarketBootstrapTransaction, derivePolymarketApiKey, fetchPolymarketActivity, fetchPolymarketApprovalState, fetchPolymarketClosedPositions, fetchPolymarketDepositAddresses, fetchPolymarketMarket, fetchPolymarketMarkets, fetchPolymarketMidpoint, fetchPolymarketOrderbook, fetchPolymarketPositionValue, fetchPolymarketPositions, fetchPolymarketPrice, fetchPolymarketPriceHistory, fetchPolymarketPublicProfile, normalizeNumberArrayish, normalizeStringArrayish, placePolymarketOrder, resolveExchangeAddress, resolvePolymarketBaseUrl, resolvePolymarketBootstrapContracts };
@@ -1,5 +1,5 @@
1
1
  import { createHmac, randomBytes } from 'crypto';
2
- import { parseUnits } from 'viem';
2
+ import { parseUnits, encodeFunctionData, maxUint256, erc20Abi, decodeFunctionData } from 'viem';
3
3
 
4
4
  // src/adapters/polymarket/base.ts
5
5
  var PolymarketApiError = class extends Error {
@@ -159,7 +159,7 @@ async function buildL1Headers(args) {
159
159
  const nonce = args.nonce ?? Date.now();
160
160
  const chainId = POLYMARKET_CHAIN_ID[args.environment ?? "mainnet"];
161
161
  const address = args.wallet.address;
162
- const message = args.message ?? "Create or derive a Polymarket API key";
162
+ const message = args.message ?? "This message attests that I control the given wallet";
163
163
  const signature = await args.wallet.walletClient.signTypedData({
164
164
  account: args.wallet.account,
165
165
  domain: {
@@ -313,14 +313,32 @@ async function buildSignedOrderPayload(args) {
313
313
  }
314
314
 
315
315
  // src/adapters/polymarket/exchange.ts
316
+ function requireApiKeyNonce(nonce, message = "Polymarket API key operations require an explicit nonce.") {
317
+ if (!Number.isSafeInteger(nonce) || nonce == null || nonce < 0) {
318
+ throw new PolymarketAuthError(message);
319
+ }
320
+ return nonce;
321
+ }
316
322
  async function resolveAuthContext(args) {
317
323
  if (args.wallet) {
318
- const credentials = args.credentials ?? await createOrDerivePolymarketApiKey({
324
+ const credentials = args.credentials;
325
+ if (credentials) {
326
+ return {
327
+ credentials,
328
+ address: args.wallet.address
329
+ };
330
+ }
331
+ const apiKeyNonce = requireApiKeyNonce(
332
+ args.apiKeyNonce,
333
+ "Polymarket auto-auth requires apiKeyNonce when credentials are not provided."
334
+ );
335
+ const derivedCredentials = await derivePolymarketApiKey({
319
336
  wallet: args.wallet,
320
- ...args.environment ? { environment: args.environment } : {}
337
+ ...args.environment ? { environment: args.environment } : {},
338
+ nonce: apiKeyNonce
321
339
  });
322
340
  return {
323
- credentials,
341
+ credentials: derivedCredentials,
324
342
  address: args.wallet.address
325
343
  };
326
344
  }
@@ -366,11 +384,12 @@ async function requestPolymarketApiKey(args) {
366
384
  const environment = args.environment ?? "mainnet";
367
385
  const baseUrl = resolvePolymarketBaseUrl("clob", environment);
368
386
  const url = args.mode === "create" ? `${baseUrl}/auth/api-key` : `${baseUrl}/auth/derive-api-key`;
387
+ const nonce = requireApiKeyNonce(args.nonce);
369
388
  const headers = await buildL1Headers({
370
389
  wallet: args.wallet,
371
390
  environment,
372
391
  ...args.timestamp !== void 0 ? { timestamp: args.timestamp } : {},
373
- ...args.nonce !== void 0 ? { nonce: args.nonce } : {},
392
+ nonce,
374
393
  ...args.message !== void 0 ? { message: args.message } : {}
375
394
  });
376
395
  return await requestJson(url, {
@@ -401,13 +420,29 @@ async function derivePolymarketApiKey(args) {
401
420
  return normalized;
402
421
  }
403
422
  async function createOrDerivePolymarketApiKey(args) {
423
+ let deriveError;
424
+ try {
425
+ const derived = normalizeApiKeyResponse(
426
+ await requestPolymarketApiKey({ ...args, mode: "derive" })
427
+ );
428
+ if (derived) {
429
+ return derived;
430
+ }
431
+ } catch (error) {
432
+ deriveError = error;
433
+ }
404
434
  const created = normalizeApiKeyResponse(
405
435
  await requestPolymarketApiKey({ ...args, mode: "create" })
406
436
  );
407
437
  if (created) {
408
438
  return created;
409
439
  }
410
- return derivePolymarketApiKey(args);
440
+ if (deriveError) {
441
+ throw deriveError;
442
+ }
443
+ throw new PolymarketAuthError(
444
+ "Failed to derive or create Polymarket API key."
445
+ );
411
446
  }
412
447
  async function placePolymarketOrder(args) {
413
448
  const environment = args.environment ?? "mainnet";
@@ -421,7 +456,8 @@ async function placePolymarketOrder(args) {
421
456
  const auth = await resolveAuthContext({
422
457
  wallet: args.wallet,
423
458
  ...args.credentials ? { credentials: args.credentials } : {},
424
- environment
459
+ environment,
460
+ ...args.apiKeyNonce !== void 0 ? { apiKeyNonce: args.apiKeyNonce } : {}
425
461
  });
426
462
  const body = {
427
463
  order: signedOrder,
@@ -453,7 +489,8 @@ async function cancelPolymarketOrder(args) {
453
489
  ...args.wallet ? { wallet: args.wallet } : {},
454
490
  ...args.walletAddress ? { walletAddress: args.walletAddress } : {},
455
491
  ...args.credentials ? { credentials: args.credentials } : {},
456
- environment
492
+ environment,
493
+ ...args.apiKeyNonce !== void 0 ? { apiKeyNonce: args.apiKeyNonce } : {}
457
494
  });
458
495
  const headers = buildL2Headers({
459
496
  credentials: auth.credentials,
@@ -480,7 +517,8 @@ async function cancelPolymarketOrders(args) {
480
517
  ...args.wallet ? { wallet: args.wallet } : {},
481
518
  ...args.walletAddress ? { walletAddress: args.walletAddress } : {},
482
519
  ...args.credentials ? { credentials: args.credentials } : {},
483
- environment
520
+ environment,
521
+ ...args.apiKeyNonce !== void 0 ? { apiKeyNonce: args.apiKeyNonce } : {}
484
522
  });
485
523
  const headers = buildL2Headers({
486
524
  credentials: auth.credentials,
@@ -506,7 +544,8 @@ async function cancelAllPolymarketOrders(args) {
506
544
  ...args.wallet ? { wallet: args.wallet } : {},
507
545
  ...args.walletAddress ? { walletAddress: args.walletAddress } : {},
508
546
  ...args.credentials ? { credentials: args.credentials } : {},
509
- environment
547
+ environment,
548
+ ...args.apiKeyNonce !== void 0 ? { apiKeyNonce: args.apiKeyNonce } : {}
510
549
  });
511
550
  const headers = buildL2Headers({
512
551
  credentials: auth.credentials,
@@ -531,7 +570,8 @@ async function cancelMarketPolymarketOrders(args) {
531
570
  ...args.wallet ? { wallet: args.wallet } : {},
532
571
  ...args.walletAddress ? { walletAddress: args.walletAddress } : {},
533
572
  ...args.credentials ? { credentials: args.credentials } : {},
534
- environment
573
+ environment,
574
+ ...args.apiKeyNonce !== void 0 ? { apiKeyNonce: args.apiKeyNonce } : {}
535
575
  });
536
576
  const headers = buildL2Headers({
537
577
  credentials: auth.credentials,
@@ -553,6 +593,7 @@ var PolymarketExchangeClient = class {
553
593
  constructor(args) {
554
594
  this.wallet = args.wallet;
555
595
  this.credentials = args.credentials;
596
+ this.apiKeyNonce = args.apiKeyNonce;
556
597
  this.environment = args.environment ?? "mainnet";
557
598
  }
558
599
  async getCredentials() {
@@ -560,7 +601,8 @@ var PolymarketExchangeClient = class {
560
601
  const resolved = await resolveAuthContext({
561
602
  wallet: this.wallet,
562
603
  ...this.credentials ? { credentials: this.credentials } : {},
563
- environment: this.environment
604
+ environment: this.environment,
605
+ ...this.apiKeyNonce !== void 0 ? { apiKeyNonce: this.apiKeyNonce } : {}
564
606
  });
565
607
  this.cachedCredentials = resolved.credentials;
566
608
  return resolved.credentials;
@@ -1113,7 +1155,176 @@ async function fetchPolymarketPublicProfile(params) {
1113
1155
  const data = await requestJson2(url.toString());
1114
1156
  return normalizePublicProfile(data);
1115
1157
  }
1158
+ var POLYMARKET_SET_APPROVAL_FOR_ALL_ABI = [
1159
+ {
1160
+ inputs: [
1161
+ { name: "operator", type: "address" },
1162
+ { name: "approved", type: "bool" }
1163
+ ],
1164
+ name: "setApprovalForAll",
1165
+ outputs: [],
1166
+ stateMutability: "nonpayable",
1167
+ type: "function"
1168
+ },
1169
+ {
1170
+ inputs: [
1171
+ { name: "account", type: "address" },
1172
+ { name: "operator", type: "address" }
1173
+ ],
1174
+ name: "isApprovedForAll",
1175
+ outputs: [{ name: "", type: "bool" }],
1176
+ stateMutability: "view",
1177
+ type: "function"
1178
+ }
1179
+ ];
1180
+ var POLYMARKET_BOOTSTRAP_CONTRACTS_BY_ENV = {
1181
+ mainnet: {
1182
+ usdc: "0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174",
1183
+ ctf: "0x4D97DCd97eC945f40cF65F87097ACe5EA0476045",
1184
+ negRiskAdapter: "0xd91E80cF2E7be2e162c6513ceD06f1dD0dA35296",
1185
+ safeFactory: "0xaacFeEa03eb1561C4e67d661e40682Bd20E3541b",
1186
+ safeMultisend: "0xA238CBeb142c10Ef7Ad8442C6D1f9E89e07e7761",
1187
+ relayerUrl: "https://relayer-v2.polymarket.com",
1188
+ bridgeUrl: "https://bridge.polymarket.com"
1189
+ }
1190
+ };
1191
+ async function requestJson3(url, init) {
1192
+ const response = await fetch(url, init);
1193
+ const text = await response.text().catch(() => "");
1194
+ let data = null;
1195
+ try {
1196
+ data = text ? JSON.parse(text) : null;
1197
+ } catch {
1198
+ data = text;
1199
+ }
1200
+ if (!response.ok) {
1201
+ throw new PolymarketApiError(
1202
+ `Polymarket request failed (${response.status}).`,
1203
+ data ?? { status: response.status }
1204
+ );
1205
+ }
1206
+ return data;
1207
+ }
1208
+ function resolvePolymarketBootstrapContracts(environment) {
1209
+ const contracts = POLYMARKET_BOOTSTRAP_CONTRACTS_BY_ENV[environment];
1210
+ if (!contracts) {
1211
+ throw new Error(
1212
+ `Polymarket bootstrap contracts are not configured for ${environment}.`
1213
+ );
1214
+ }
1215
+ return contracts;
1216
+ }
1217
+ function buildPolymarketUsdcApprovalTransaction(args) {
1218
+ const environment = args?.environment ?? "mainnet";
1219
+ const contracts = resolvePolymarketBootstrapContracts(environment);
1220
+ return {
1221
+ to: contracts.usdc,
1222
+ data: encodeFunctionData({
1223
+ abi: erc20Abi,
1224
+ functionName: "approve",
1225
+ args: [contracts.ctf, args?.amount ?? maxUint256]
1226
+ }),
1227
+ value: "0",
1228
+ description: "Approve USDC.e for CTF"
1229
+ };
1230
+ }
1231
+ function buildPolymarketOutcomeTokenApprovalTransactions(args) {
1232
+ const environment = args?.environment ?? "mainnet";
1233
+ const includeNegRisk = args?.includeNegRisk ?? true;
1234
+ const contracts = resolvePolymarketBootstrapContracts(environment);
1235
+ const transactions = [
1236
+ {
1237
+ to: contracts.ctf,
1238
+ data: encodeFunctionData({
1239
+ abi: POLYMARKET_SET_APPROVAL_FOR_ALL_ABI,
1240
+ functionName: "setApprovalForAll",
1241
+ args: [POLYMARKET_EXCHANGE_ADDRESSES[environment].ctf, true]
1242
+ }),
1243
+ value: "0",
1244
+ description: "Approve outcome tokens for CTF Exchange"
1245
+ }
1246
+ ];
1247
+ if (includeNegRisk) {
1248
+ transactions.push({
1249
+ to: contracts.ctf,
1250
+ data: encodeFunctionData({
1251
+ abi: POLYMARKET_SET_APPROVAL_FOR_ALL_ABI,
1252
+ functionName: "setApprovalForAll",
1253
+ args: [POLYMARKET_EXCHANGE_ADDRESSES[environment].negRisk, true]
1254
+ }),
1255
+ value: "0",
1256
+ description: "Approve outcome tokens for Neg Risk Exchange"
1257
+ });
1258
+ }
1259
+ return transactions;
1260
+ }
1261
+ function buildPolymarketApprovalTransactions(args) {
1262
+ return [
1263
+ buildPolymarketUsdcApprovalTransaction(args),
1264
+ ...buildPolymarketOutcomeTokenApprovalTransactions(args)
1265
+ ];
1266
+ }
1267
+ async function fetchPolymarketApprovalState(args) {
1268
+ const environment = args.environment ?? "mainnet";
1269
+ const includeNegRisk = args.includeNegRisk ?? true;
1270
+ const contracts = resolvePolymarketBootstrapContracts(environment);
1271
+ const ctfExchange = POLYMARKET_EXCHANGE_ADDRESSES[environment].ctf;
1272
+ const negRiskExchange = POLYMARKET_EXCHANGE_ADDRESSES[environment].negRisk;
1273
+ const [allowance, ctfExchangeApproved, negRiskExchangeApproved] = await Promise.all([
1274
+ args.publicClient.readContract({
1275
+ address: contracts.usdc,
1276
+ abi: erc20Abi,
1277
+ functionName: "allowance",
1278
+ args: [args.funder, contracts.ctf]
1279
+ }),
1280
+ args.publicClient.readContract({
1281
+ address: contracts.ctf,
1282
+ abi: POLYMARKET_SET_APPROVAL_FOR_ALL_ABI,
1283
+ functionName: "isApprovedForAll",
1284
+ args: [args.funder, ctfExchange]
1285
+ }),
1286
+ includeNegRisk ? args.publicClient.readContract({
1287
+ address: contracts.ctf,
1288
+ abi: POLYMARKET_SET_APPROVAL_FOR_ALL_ABI,
1289
+ functionName: "isApprovedForAll",
1290
+ args: [args.funder, negRiskExchange]
1291
+ }) : Promise.resolve(true)
1292
+ ]);
1293
+ return {
1294
+ funder: args.funder,
1295
+ usdcAllowance: allowance,
1296
+ usdcApproved: allowance > 0n,
1297
+ ctfExchangeApproved,
1298
+ negRiskExchangeApproved,
1299
+ approvalsReady: allowance > 0n && ctfExchangeApproved && negRiskExchangeApproved
1300
+ };
1301
+ }
1302
+ async function fetchPolymarketDepositAddresses(args) {
1303
+ const environment = args.environment ?? "mainnet";
1304
+ const contracts = resolvePolymarketBootstrapContracts(environment);
1305
+ return await requestJson3(`${contracts.bridgeUrl}/deposit`, {
1306
+ method: "POST",
1307
+ headers: {
1308
+ "content-type": "application/json"
1309
+ },
1310
+ body: JSON.stringify({
1311
+ address: args.address
1312
+ })
1313
+ });
1314
+ }
1315
+ function decodePolymarketBootstrapTransaction(transaction) {
1316
+ const abi = transaction.to.toLowerCase() === resolvePolymarketBootstrapContracts("mainnet").usdc.toLowerCase() ? erc20Abi : POLYMARKET_SET_APPROVAL_FOR_ALL_ABI;
1317
+ const decoded = decodeFunctionData({
1318
+ abi,
1319
+ data: transaction.data
1320
+ });
1321
+ return {
1322
+ to: transaction.to,
1323
+ functionName: decoded.functionName,
1324
+ args: decoded.args ?? []
1325
+ };
1326
+ }
1116
1327
 
1117
- export { POLYMARKET_CHAIN_ID, POLYMARKET_CLOB_AUTH_DOMAIN, POLYMARKET_CLOB_DOMAIN, POLYMARKET_ENDPOINTS, POLYMARKET_EXCHANGE_ADDRESSES, PolymarketApiError, PolymarketAuthError, PolymarketExchangeClient, PolymarketInfoClient, buildHmacSignature, buildL1Headers, buildL2Headers, buildPolymarketOrderAmounts, buildSignedOrderPayload, cancelAllPolymarketOrders, cancelMarketPolymarketOrders, cancelPolymarketOrder, cancelPolymarketOrders, createOrDerivePolymarketApiKey, createPolymarketApiKey, derivePolymarketApiKey, fetchPolymarketActivity, fetchPolymarketClosedPositions, fetchPolymarketMarket, fetchPolymarketMarkets, fetchPolymarketMidpoint, fetchPolymarketOrderbook, fetchPolymarketPositionValue, fetchPolymarketPositions, fetchPolymarketPrice, fetchPolymarketPriceHistory, fetchPolymarketPublicProfile, normalizeNumberArrayish, normalizeStringArrayish, placePolymarketOrder, resolveExchangeAddress, resolvePolymarketBaseUrl };
1328
+ export { POLYMARKET_CHAIN_ID, POLYMARKET_CLOB_AUTH_DOMAIN, POLYMARKET_CLOB_DOMAIN, POLYMARKET_ENDPOINTS, POLYMARKET_EXCHANGE_ADDRESSES, PolymarketApiError, PolymarketAuthError, PolymarketExchangeClient, PolymarketInfoClient, buildHmacSignature, buildL1Headers, buildL2Headers, buildPolymarketApprovalTransactions, buildPolymarketOrderAmounts, buildPolymarketOutcomeTokenApprovalTransactions, buildPolymarketUsdcApprovalTransaction, buildSignedOrderPayload, cancelAllPolymarketOrders, cancelMarketPolymarketOrders, cancelPolymarketOrder, cancelPolymarketOrders, createOrDerivePolymarketApiKey, createPolymarketApiKey, decodePolymarketBootstrapTransaction, derivePolymarketApiKey, fetchPolymarketActivity, fetchPolymarketApprovalState, fetchPolymarketClosedPositions, fetchPolymarketDepositAddresses, fetchPolymarketMarket, fetchPolymarketMarkets, fetchPolymarketMidpoint, fetchPolymarketOrderbook, fetchPolymarketPositionValue, fetchPolymarketPositions, fetchPolymarketPrice, fetchPolymarketPriceHistory, fetchPolymarketPublicProfile, normalizeNumberArrayish, normalizeStringArrayish, placePolymarketOrder, resolveExchangeAddress, resolvePolymarketBaseUrl, resolvePolymarketBootstrapContracts };
1118
1329
  //# sourceMappingURL=index.js.map
1119
1330
  //# sourceMappingURL=index.js.map