import { SimpleFunctions } from "@spfunctions/sdk"
const sf = new SimpleFunctions({
baseUrl: "https://simplefunctions.dev",
apiKey: process.env.SF_API_KEY,
})
type OrderPlan = {
venue?: "kalshi" | "polymarket"
ticker: string
tokenId?: string
title: string
quantity: number
limitPrice: number
rationale: string
jurisdiction?: string
}
async function placeGuarded(plan: OrderPlan) {
const maxOrderCostCents = 300
const cost = plan.quantity * plan.limitPrice
if (plan.quantity < 1) throw new Error("quantity must be positive")
if (plan.limitPrice < 1 || plan.limitPrice > 99) throw new Error("limitPrice must be 1-99 cents")
if (cost > maxOrderCostCents) throw new Error(`order cost ${cost}c exceeds ${maxOrderCostCents}c`)
if (!plan.rationale) throw new Error("rationale is required")
const runtime = await sf.runtime.ensure({
mode: "auto",
startIfNeeded: true,
timeoutMs: 90_000,
})
if (!runtime.ok) throw new Error("runtime did not become usable")
const portfolio = await sf.portfolio.state()
if (portfolio?.lastReconcileStatus && portfolio.lastReconcileStatus !== "ok") {
throw new Error(`portfolio reconcile status is ${portfolio.lastReconcileStatus}`)
}
const baseOrder = {
title: plan.title,
action: "buy" as const,
direction: "yes" as const,
quantity: plan.quantity,
limitPrice: plan.limitPrice,
rationale: plan.rationale,
runtime: { mode: "auto" as const, startIfNeeded: false },
}
if (plan.venue === "polymarket") {
return sf.execution.place({
...baseOrder,
venue: "polymarket",
tokenId: plan.tokenId ?? plan.ticker,
jurisdiction: plan.jurisdiction,
})
}
return sf.execution.place({
...baseOrder,
venue: "kalshi",
ticker: plan.ticker,
})
}