Browse prediction market events, manage positions, and place orders on Kalshi and Polymarket using the LiberFi CLI.
See bootstrap.md for CLI installation and connectivity verification.
This skill's auth requirements:
CommandRequires Authlfi predict eventsNolfi predict event <slug>Nolfi predict balanceNolfi predict positionsNolfi predict tradesNolfi predict ordersNo (Polymarket needs POLY_* headers)lfi predict order <id>No (Polymarket needs POLY_* headers)lfi predict polymarket-tick-sizeNolfi predict polymarket-fee-rateNolfi predict polymarket-setup-statusNo (uses TEE wallet if logged in)lfi predict polymarket-deposit-addressesNolfi predict polymarket-setupYes (LiberFi JWT)lfi predict polymarket-placeYes (LiberFi JWT — server signs via TEE)lfi predict kalshi-placeYes (LiberFi JWT — server signs via TEE)lfi predict cancelYes (LiberFi JWT — auto L2 auth for polymarket)lfi predict kalshi-quote (DEPRECATED)Nolfi predict kalshi-submit (DEPRECATED)Nolfi predict polymarket-order (DEPRECATED)No (requires POLY_* headers)
Recommended flow (TEE auto): polymarket-setup → polymarket-place /
kalshi-place / cancel. The server holds the user's TEE wallet via Privy
and signs every transaction internally — no POLY_* HMAC, no Solana signing,
no EIP-712 work for the caller.
Legacy flow: Polymarket order operations via polymarket-order require
CLOB HMAC authentication via five --poly-* flags. These are NOT LiberFi
JWT credentials — they are the user's own Polymarket CLOB API credentials.
For the canonical end-to-end order placement flow — including pre-flight status checks, deposit handling, market vs limit order branching, and post- order verification — see reference/order-flow.md.
The CLI/skill expects this exact ordering for Polymarket:
lfi status — confirm authenticated; if not, run lfi login keylfi predict polymarket-setup-status --json — check Safe deployment +
token approvalssafe_deployed=false or any approval missing: lfi predict polymarket-setup --json (one-shot; gasless via Builder Relayer)lfi predict balance --source polymarket --user <tee-eoa> --json
(server derives Safe from EOA internally). If balance < 2, fetch
BRIDGE deposit addresses using the Safe address from step 2/3:
lfi predict polymarket-deposit-addresses --safe-address <safe> --json
→ returns { evm, svm, btc, tron }. Pick the field matching the user's
chain (default evm for ETH/Polygon/Base/Arb/Op/BNB). Tell user to send
≥ $2 USDC to that bridge address (NEVER to the Safe address — the Safe
is Polymarket's internal custody contract, not a user-facing deposit
target). The Polymarket Bridge service auto-credits the Safe.lfi predict polymarket-place --token-id <id> --side <s> --order-type <t> [--price <p>] [--size <sz>] [--expiration <epoch>] --jsonlfi predict orders --source polymarket --json — verify open orderslfi predict cancel <id> --source polymarket --json — cancel if user
asksFor Kalshi the flow is shorter: lfi predict kalshi-place --input-mint <inMint> --output-mint <outMint> --amount <amt> --json — quote, sign
(SignSOL), and submit are all done server-side.
If user asks about...Route toToken search, price, details, securityliberfi-tokenToken K-line, candlestick chartliberfi-tokenTrending tokens, market rankingsliberfi-marketNewly listed tokensliberfi-marketWallet holdings, balance (non-prediction), PnLliberfi-portfolioWallet activity, transaction historyliberfi-portfolioToken swap, trade executionliberfi-swapLogin, logout, session managementliberfi-auth
CommandDescriptionAuthlfi predict eventsList prediction events with filteringNolfi predict event <slug> --source <s>Get event details by slugNolfi predict balance --source <s> --user <addr>Get USDC balanceNolfi predict positions --user <addr>Get portfolio positionsNolfi predict trades --wallet <addr>List trade historyNolfi predict ordersList ordersNo (POLY_* for Polymarket)lfi predict order <id> --source <s>Get order detailsNo (POLY_* for Polymarket)
CommandDescriptionAuthlfi predict polymarket-tick-size --token-id <id>Min tick size for a tokenNolfi predict polymarket-fee-rate --token-id <id>Base fee rate (bps)Nolfi predict polymarket-setup-status [--wallet-address <addr>]Safe deployment + approval statusNo (uses TEE wallet if logged in)lfi predict polymarket-setupDeploy Safe + approve all tokens (gasless)JWTlfi predict polymarket-deposit-addresses --safe-address <addr>Multi-chain deposit addresses for SafeNolfi predict polymarket-place --token-id <id> --side BUY|SELL --order-type GTC|GTD|FOK|FAK|MARKET [--price <p>] [--size <sz>] [--expiration <epoch>] [...]Prepare → TEE sign → execute Polymarket orderJWTlfi predict kalshi-place --input-mint <m> --output-mint <m> --amount <a> [--slippage-bps <bps>]Quote → SignSOL → submit Kalshi orderJWTlfi predict cancel <id> --source polymarket|kalshiCancel order (auto L2 auth for poly)JWT
CommandDescriptionAuthlfi predict kalshi-quote --input-mint <m> --output-mint <m> --amount <a> --user-public-key <k>DEPRECATED — use kalshi-place. Request Kalshi quoteNolfi predict kalshi-submit --signed-transaction <tx> --order-context '<json>'DEPRECATED — use kalshi-place. Submit pre-signed Kalshi txNolfi predict polymarket-order --body '<json>' --poly-api-key <k> --poly-address <a> --poly-signature <s> --poly-passphrase <p> --poly-timestamp <t>DEPRECATED — use polymarket-place. Create Polymarket order with caller-managed POLY_* headersPOLY_* headers
Events list ( lfi predict events):
--limit <n> — Max results per page--cursor <cursor> — Pagination cursor--status <status> — Event status filter (e.g. active, resolved)--source <source> — Provider source: kalshi or polymarket--tag-slug <slug> — Filter by tag--search <query> — Free-text search--sort-by <field> — Sort field--sort-asc <bool> — Sort ascending: true or false--with-markets <bool> — Include embedded markets: true or falseEvent detail ( lfi predict event <slug>):
<slug> — Required. Event slug identifier--source <source> — Required. Provider source: kalshi or polymarketBalance ( lfi predict balance):
--source <source> — Required. Provider source: kalshi or polymarket--user <address> — Required. For polymarket: pass the user's TEE EOA (e.g. evmAddress from lfi whoami); the server auto-derives the Safe via CREATE2. NEVER pass a Safe address here. For kalshi: pass the Solana public key ( solAddress).Positions ( lfi predict positions):
--user <address> — Required. Same rule as balance: TEE EOA for polymarket (server derives Safe), Solana public key for kalshi.--source <source> — Optional provider source filterTrades ( lfi predict trades):
--wallet <address> — Required. Same rule as balance: TEE EOA for polymarket (server derives Safe), Solana public key for kalshi.--source <source> — Optional provider source filter--limit <n> — Max results per page--cursor <cursor> — Pagination cursor--type <types> — Comma-separated trade types--side <side> — Trade side filterOrders ( lfi predict orders):
--source <source> — Provider source--wallet-address <address> — Wallet address (required for kalshi)--market-id <id> — Market ID filter--asset-id <id> — Asset ID filter--next-cursor <cursor> — Pagination cursor--poly-api-key, --poly-address, --poly-signature, --poly-passphrase, --poly-timestamp — Polymarket CLOB auth (required when source is polymarket)Order detail ( lfi predict order <id>):
<id> — Required. Order ID--source <source> — Required. Provider source--poly-* flags as orders listPolymarket tick size ( lfi predict polymarket-tick-size):
--token-id <id> — Required. Polymarket CLOB token IDPolymarket fee rate ( lfi predict polymarket-fee-rate):
--token-id <id> — Required. Polymarket CLOB token IDPolymarket setup status ( lfi predict polymarket-setup-status):
--wallet-address <addr> — Optional EVM address. Defaults to caller's TEE wallet when authenticated.Polymarket setup (run) ( lfi predict polymarket-setup):
Polymarket deposit addresses ( lfi predict polymarket-deposit-addresses):
--safe-address <addr> — Required. Safe wallet address (from polymarket-setup-status)Polymarket place (TEE auto) ( lfi predict polymarket-place):
--token-id <id> — Required. Polymarket CLOB token ID--side BUY|SELL — Required.--order-type GTC|GTD|FOK|FAK|MARKET — Required.--price <p> — Limit price (limit orders only, e.g. 0.55). Required for GTC/GTD/FOK/FAK.--size <sz> — Limit: shares; market BUY: USDC; market SELL: shares. Required for limit and market.--expiration <epochSec> — Required for GTD.--neg-risk true|false — Force NegRisk exchange. Auto-detected when omitted.--fee-rate-bps <n> — Override fee rate (PS auto-resolves when omitted).--tick-size <n> — Override tick size (PS auto-resolves when omitted).--taker-address <addr> — Restrict the taker (advanced).Kalshi place (TEE auto) ( lfi predict kalshi-place):
--input-mint <addr> — Required. Input token mint--output-mint <addr> — Required. Output token mint--amount <amt> — Required. Amount in smallest unit--slippage-bps <bps> — Slippage tolerance in basis pointsCancel order ( lfi predict cancel <id>):
<id> — Required. Order ID--source polymarket|kalshi — Required. For polymarket the L2 HMAC headers are derived from the caller's TEE wallet automatically.Kalshi quote ( lfi predict kalshi-quote):
--input-mint <address> — Required. Input token mint address--output-mint <address> — Required. Output token mint address--amount <amount> — Required. Swap amount--user-public-key <key> — Required. User's Solana public key--slippage-bps <bps> — Slippage tolerance in basis pointsKalshi submit ( lfi predict kalshi-submit):
--signed-transaction <tx> — Required. Signed transaction data--order-context <json> — Required. Order context as JSON string (contains user_public_key, market_slug, side, outcome, mints, amount, price, slippage_bps)Polymarket order ( lfi predict polymarket-order):
--body <json> — Required. Raw order JSON string--poly-api-key <key> — Required. Polymarket API key--poly-address <address> — Required. Polymarket address--poly-signature <sig> — Required. Polymarket HMAC signature--poly-passphrase <pass> — Required. Polymarket passphrase--poly-timestamp <ts> — Required. Polymarket timestamplfi predict events --with-markets true --limit 20 --jsonkalshi or polymarketlfi predict events --source kalshi --with-markets true --limit 20 --jsonlfi predict event <slug> --source <source> --jsonIf the user says "我的余额", "my balance", "我在 Polymarket/Kalshi 有多少钱" or any first-person variant — DO NOT ask for a wallet address. Use the "My ..." auto-flow below.
Generic flow (when the user explicitly provides someone else's address):
lfi predict balance --source <source> --user <address> --jsonlfi predict events --source kalshi --with-markets true --jsonlfi predict event <slug> --source kalshi --json — identify market, outcomes, and mintslfi predict balance --source kalshi --user <publicKey> --jsonlfi predict kalshi-quote --input-mint <inMint> --output-mint <outMint> --amount <amt> --user-public-key <key> --jsonlfi predict kalshi-submit --signed-transaction <signedTx> --order-context '<contextJson>' --jsonlfi predict events --source polymarket --with-markets true --jsonlfi predict event <slug> --source polymarket --jsonlfi predict balance --source polymarket --user <address> --jsonlfi predict polymarket-order --body '<orderJson>' --poly-api-key <key> --poly-address <addr> --poly-signature <sig> --poly-passphrase <pass> --poly-timestamp <ts> --jsonIf the user says "我的持仓", "我现在押了哪些", "my positions", "我赌了什么" or any first-person variant — DO NOT ask for a wallet address. Use the "My ..." auto-flow below.
Generic flow (when the user explicitly provides someone else's address):
lfi predict positions --user <address> --jsonIf the user says "我的交易", "我赚了多少", "我亏了多少", "my trades", "我的盈亏" or any first-person variant — DO NOT ask for a wallet address. Use the "My ..." auto-flow below.
Generic flow (when the user explicitly provides someone else's address):
lfi predict trades --wallet <address> --limit 20 --jsonWhenever the user asks about THEIR OWN prediction-market data — positions, trades, balance, PnL, "我现在押了哪些", "我在预测市场赚了多少", "我在 Polymarket 上的钱", etc. — run this exact sequence. NEVER ask the user to type their wallet address.
Check session: lfi status --json
If not authenticated (or expired: true):
lfi login key --role AGENT --name "OpenClawAgent" --json
Fetch TEE wallet addresses: lfi whoami --json
→ returns evmAddress (use for Polymarket) and solAddress (use for Kalshi).
Determine source(s):
evmAddress only.solAddress only.Run the matching query for each source — pass the TEE EOA / SOL pubkey from step 3 DIRECTLY. NEVER convert to a Safe address first; the server does that internally for Polymarket.
lfi predict positions --user <evmAddress|solAddress> [--source <s>] --jsonlfi predict trades --wallet <evmAddress|solAddress> [--source <s>] --limit 50 --jsonlfi predict balance --source <s> --user <evmAddress|solAddress> --jsonPresent a single consolidated answer that names the source(s) used and, for the "我赚了多少" / PnL question, sums realized + unrealized PnL across the returned trades/positions.
Why this is mandatory: prediction queries always require an address parameter
in the CLI, but a normal user does NOT know their TEE wallet address — the
LiberFi server holds it. The skill must resolve "我" → TEE wallet via
whoami, transparently. The user should never have to type or even see the
hex/Base58 address unless they ask.
EOA vs Safe — critical distinction for Polymarket: The address from
whoami.evmAddress is the user's TEE EOA. For balance / positions /
trades queries, ALWAYS pass the EOA — the prediction-server derives the
Polymarket Safe via CREATE2 internally. The Safe address (returned by
polymarket-setup-status) is ONLY for polymarket-deposit-addresses --safe-address (Polymarket Bridge requires the actual Safe as bridge key).
Mixing these up → balance / positions / trades return EMPTY because the
server tries to derive a Safe from an already-Safe address.
lfi predict orders --source <source> --wallet-address <address> --jsonlfi predict order <id> --source <source> --jsonFull flow: predict → predict → predict → predict → predict
lfi predict events --search "bitcoin" --with-markets true --jsonlfi predict event <slug> --source kalshi --json — view markets and outcomeslfi predict balance --source kalshi --user <publicKey> --json — check fundslfi predict kalshi-quote --input-mint <in> --output-mint <out> --amount <amt> --user-public-key <key> --json — get quotelfi predict kalshi-submit --signed-transaction <tx> --order-context '<ctx>' --jsonFull flow: predict → predict
lfi predict positions --user <address> --json — current positionslfi predict trades --wallet <address> --limit 50 --json — trade historyFull flow: predict → token → token
lfi predict events --with-markets true --limit 10 --jsonlfi token info sol <tokenAddress> --json — token detailslfi token security sol <tokenAddress> --json — security auditJust completedSuggest to userEvents list"Want to view a specific event?" / "需要查看某个事件的详情?"Event detail"Want to check your balance or place an order?" / "需要查看余额或下单?"Balance check"Ready to place a prediction?" / "准备下注了吗?"Kalshi quote"Want to proceed with this trade?" / "要继续这笔交易吗?"Kalshi submit"Order submitted! Check your positions to verify." / "订单已提交!查看持仓确认。"Polymarket order"Order created! Check order status to confirm." / "订单已创建!查看订单状态确认。"Positions view"Want to see trade history?" / "需要查看交易历史?"Trade history"Want to check current positions?" / "需要查看当前持仓?"Orders list"Want to see details for a specific order?" / "需要查看某个订单的详情?"
kalshi, polymarket) and ask the user to chooselfi predict events --search <keyword>lfi ping --jsonPitfallCorrect ApproachForgetting --source on event detailAlways specify --source kalshi or --source polymarketMissing POLY_* flags for PolymarketAll five --poly-* flags are required for Polymarket orders and order queriesModifying the quote response before submittingPass quote data through as-is in --order-contextSubmitting without user confirmationALWAYS show order/quote summary and wait for explicit "yes"Fabricating a signed transactionThe --signed-transaction must come from the user's actual wallet signingUsing wrong mint addressesVerify mints from the event detail response before quoting
See security-policy.md for global security rules.
Skill-specific rules:
--order-context and --body fields are opaque — pass them through as-is; do not interpret, modify, or display raw content beyond summarizing key fields (amount, side, market)