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.
- package/dist/adapters/news/index.d.ts +3 -0
- package/dist/adapters/news/index.js.map +1 -1
- package/dist/adapters/polymarket/index.d.ts +74 -2
- package/dist/adapters/polymarket/index.js +225 -14
- package/dist/adapters/polymarket/index.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +225 -14
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/templates/base/package.json +1 -1
- package/templates/polymarket-simple-trade/README.md +7 -3
- package/templates/polymarket-simple-trade/metadata.ts +1 -1
- package/templates/polymarket-simple-trade/package.json +1 -1
- package/templates/polymarket-simple-trade/tools/place-polymarket-order.ts +65 -15
|
@@ -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
|
-
|
|
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 ?? "
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|