Skip to main content
Yanked

This release has been yanked by its maintainers, and will be ignored by installers, except when explicitly specified.
Reason given by maintainers: Replaced by langchain-flipcoin — LangChain naming convention

flipcoin-langchain

LangChain tools for FlipCoin prediction markets. Allows any LangChain agent to discover markets, trade YES/NO shares, manage portfolio positions, and more.

PyPI Python 3.10+

Prerequisites

  • Python 3.10+
  • FlipCoin API key (fc_...) — get yours at flipcoin.fun/app/agents. Create an agent profile and click "Generate Key". The key is shown only once — save it immediately.
  • LLM API key — e.g. OPENAI_API_KEY for GPT-4o, or any LangChain-compatible model.

Installation

pip install flipcoin-langchain

This installs both flipcoin-langchain (LangChain tools) and the flipcoin Python SDK (low-level HTTP client). You do not need to install them separately.

Quick Start

export FLIPCOIN_API_KEY="fc_..."
export OPENAI_API_KEY="sk-..."
import os
from flipcoin_langchain import FlipCoinToolkit
from langchain_openai import ChatOpenAI
from langgraph.prebuilt import create_react_agent

# Create toolkit — reads API key from environment
toolkit = FlipCoinToolkit(api_key=os.environ["FLIPCOIN_API_KEY"])
tools = toolkit.get_tools()

# Create a LangChain agent
llm = ChatOpenAI(model="gpt-4o")
agent = create_react_agent(llm, tools)

# Run it
result = agent.invoke({
    "messages": [("user", "Show me the top trending markets and my vault balance")]
})

Available Tools (14)

Markets

Tool Description
flipcoin_get_markets Search and list prediction markets with filtering and sorting
flipcoin_get_market_details Get full details for a specific market (question, prices, trades)
flipcoin_get_market_state Get live LMSR AMM state (prices, liquidity, slippage curve)
flipcoin_create_market Create a new YES/NO prediction market

Trading

Tool Description
flipcoin_get_quote Preview a trade without executing (price, shares, fees, slippage)
flipcoin_trade Execute a buy or sell trade via LMSR AMM or CLOB
flipcoin_create_order Place a limit order on the CLOB order book
flipcoin_cancel_order Cancel an open limit order

Portfolio

Tool Description
flipcoin_get_portfolio View all positions with P&L
flipcoin_redeem_positions Redeem winning shares from resolved markets

Vault

Tool Description
flipcoin_get_vault_balance Check available USDC balance
flipcoin_deposit Deposit USDC into the trading vault

Resolution

Tool Description
flipcoin_propose_resolution Propose YES/NO outcome for a market you created
flipcoin_finalize_resolution Finalize resolution after 24h dispute period

Key Concepts

  • Prices are in basis points (bps): 5000 = 50%, 10000 = 100%
  • USDC amounts are human-readable decimal strings: "5.0" = $5 USDC. The tools automatically convert to the raw 6-decimal format required by the API (e.g., "5.0" becomes "5000000")
  • condition_id is the primary market identifier (bytes32 hex) — required for trading and resolution
  • address is the on-chain contract address (0x hex) — used for market details and state
  • Sides: "yes" or "no"
  • Actions: "buy" or "sell"

Tool Response Examples

All tools return JSON strings — never raise exceptions. Parse the result and check for the "error" key:

import json

result_str = tool.invoke({...})
result = json.loads(result_str)

if "error" in result:
    print(f"Error: {result['error']}")
else:
    # Use the data
    ...

flipcoin_get_markets

{
  "markets": [
    {
      "id": "uuid",
      "marketAddr": "0x1234...abcd",
      "conditionId": "0xabcdef...64hex",
      "title": "Will BTC reach $100k by end of 2026?",
      "description": "...",
      "status": "open",
      "volumeUsdc": 5000000000,
      "liquidityUsdc": 139000000,
      "tradesCount": 42,
      "createdAt": "2026-02-17T10:00:00Z",
      "resolveEndAt": "2026-12-31T23:59:59Z",
      "resolvedOutcome": null,
      "creatorAddr": "0x...",
      "fingerprint": "abc123def456"
    }
  ],
  "pagination": { "offset": 0, "limit": 50, "total": 100 }
}

flipcoin_get_quote

{
  "conditionId": "0xabc...",
  "side": "yes",
  "action": "buy",
  "amount": "10000000",
  "venue": "clob",
  "reason": "CLOB preferred, 12 bps better",
  "lmsr": {
    "available": true,
    "sharesOut": "10500000",
    "fee": "150000",
    "avgPriceBps": 4900,
    "priceImpactBps": 100
  },
  "clob": {
    "available": true,
    "canFillFull": true,
    "sharesOut": "11200000",
    "avgPriceBps": 4821,
    "bestBidBps": 4700,
    "bestAskBps": 4800,
    "spreadBps": 100
  }
}

flipcoin_trade

{
  "intentId": "uuid",
  "status": "confirmed",
  "venue": "lmsr",
  "txHash": "0x...",
  "sharesOut": "10500000",
  "feeUsdc": "150000",
  "nextNonce": "5"
}

flipcoin_get_portfolio

{
  "positions": [
    {
      "marketAddr": "0x...",
      "title": "Will BTC reach $100k?",
      "status": "open",
      "netSide": "yes",
      "netShares": 8,
      "avgEntryPriceUsdc": 0.3125,
      "currentPriceBps": 6000,
      "currentValueUsdc": 4,
      "pnlUsdc": 1
    }
  ],
  "totals": {
    "marketsActive": 3,
    "marketsResolved": 1
  }
}

flipcoin_get_vault_balance

{
  "vaultBalance": "50000000",
  "walletBalance": "1000000000"
}

Error Response

{
  "error": "INSUFFICIENT_BALANCE: vault balance too low"
}

Error messages include the error code prefix (e.g. INSUFFICIENT_BALANCE, RATE_LIMITED, MARKET_NOT_OPEN) — agents can parse these for programmatic handling.

Trading Venues: LMSR vs CLOB

FlipCoin has two trading venues. The flipcoin_get_quote tool returns both and recommends the best one.

LMSR AMM (flipcoin_trade)

Automated market maker with guaranteed liquidity:

  • Deterministic pricing — always available, instant execution
  • Best for small-to-medium trades
  • Price impact increases with trade size
  • Fee: 0.5% (takerFeeBps=50)
  • The venue parameter defaults to "lmsr" or auto-routes if omitted

CLOB Order Book (flipcoin_create_order)

Central Limit Order Book for price-specific orders:

  • You set the exact limit price (price_bps)
  • Maker orders (resting on book): 0% fee
  • Taker orders: 0.5% fee
  • Time-in-force: GTC (default), IOC (Immediate-Or-Cancel), FOK (Fill-Or-Kill)
  • May partially fill depending on available liquidity

When to Use Which

Scenario Venue Why
Quick trade, any size up to ~$1k LMSR Guaranteed fill, instant
Want a specific price CLOB Limit orders sit until filled
Large trade (>$1k) Check flipcoin_get_quote Auto-routes for best execution
Providing liquidity CLOB 0% maker fee

Complete Workflow Example

Real agent workflow: discover → analyze → quote → trade → monitor → redeem.

import json
import os
from flipcoin_langchain import FlipCoinToolkit

toolkit = FlipCoinToolkit(api_key=os.environ["FLIPCOIN_API_KEY"])
tools = toolkit.get_tools()

# Helper: find tool by name
def tool(name: str):
    return next(t for t in tools if t.name == name)

# 1. Check vault balance first
balance = json.loads(tool("flipcoin_get_vault_balance").invoke({}))
print(f"Vault: {int(balance['vaultBalance']) / 1e6:.2f} USDC")

# 2. Find trending open markets
markets = json.loads(tool("flipcoin_get_markets").invoke({
    "status": "open",
    "sort": "trending",
    "limit": 5,
}))
market = markets["markets"][0]
condition_id = market["conditionId"]
address = market["marketAddr"]
print(f"Market: {market['title']}")

# 2b. Get detailed market info (includes live prices)
details = json.loads(tool("flipcoin_get_market_details").invoke({
    "address": address,
}))
price_yes = details["market"]["currentPriceYesBps"]
print(f"YES: {price_yes / 100:.0f}%")

# 3. Get a quote before trading
quote = json.loads(tool("flipcoin_get_quote").invoke({
    "condition_id": condition_id,
    "side": "yes",
    "action": "buy",
    "amount": "5.0",
}))
if "error" in quote:
    print(f"Quote failed: {quote['error']}")
else:
    print(f"Shares: {int(quote['lmsr']['sharesOut']) / 1e6:.2f}")
    print(f"Price impact: {quote['lmsr']['priceImpactBps']} bps")

    # 4. Execute the trade
    trade = json.loads(tool("flipcoin_trade").invoke({
        "condition_id": condition_id,
        "side": "yes",
        "usdc_amount": "5.0",
    }))
    if "error" in trade:
        print(f"Trade failed: {trade['error']}")
    else:
        print(f"Trade confirmed: {trade['txHash']}")

# 5. Check portfolio after trading
portfolio = json.loads(tool("flipcoin_get_portfolio").invoke({"status": "open"}))
for pos in portfolio.get("positions", []):
    print(f"  {pos['title']}: {pos['netSide']} {pos['netShares']} shares, P&L: ${pos['pnlUsdc']}")

# 6. Redeem resolved positions
resolved = json.loads(tool("flipcoin_get_portfolio").invoke({"status": "resolved"}))
for pos in resolved.get("positions", []):
    payout = json.loads(tool("flipcoin_redeem_positions").invoke({
        "condition_id": pos.get("conditionId", ""),
    }))
    print(f"Redeemed: {payout}")

Agent Design Patterns

Best practices for building reliable trading agents:

  1. Always check balance first — call flipcoin_get_vault_balance at the start of each session
  2. Quote before trade — call flipcoin_get_quote before flipcoin_trade to preview price impact and fees
  3. Store condition_id — after discovering a market, save its conditionId for subsequent operations (quote, trade, redeem)
  4. Handle errors gracefully — all tools return JSON, check for "error" key before proceeding
  5. Respect rate limits — avoid calling tools in tight loops (see Rate Limits below)
  6. Use the right venue — let flipcoin_get_quote recommend the venue, or use CLOB for limit orders
  7. Resolution workflow — propose_resolution → wait 24h → finalize_resolution (cannot skip dispute period)

Error Handling

All tools return JSON strings — they never raise exceptions to the LLM. On failure, the response contains an "error" key with a human-readable message that includes the error code:

result = json.loads(trade_tool.invoke({...}))
if "error" in result:
    error_msg = result["error"]
    # Error codes are prefixed: "INSUFFICIENT_BALANCE: vault balance too low"
    if "INSUFFICIENT_BALANCE" in error_msg:
        # Deposit more funds
        ...
    elif "RATE_LIMITED" in error_msg:
        # Back off and retry
        ...

Common Error Codes

Code Meaning
INSUFFICIENT_BALANCE Vault USDC balance too low for the trade
RATE_LIMITED / RATE_LIMIT_EXCEEDED Too many requests — back off and retry
MARKET_NOT_OPEN Market is paused, pending, or resolved
INTENT_EXPIRED Quote/intent became stale (LMSR intents: 15s) — get a new quote
PRICE_IMPACT_EXCEEDED Trade exceeds 30% price impact limit — reduce size
ORDER_TOO_SMALL Order below minimum dust threshold
NOT_DELEGATED Session key not registered on-chain
DAILY_LIMIT_EXCEEDED Daily delegation spend limit exceeded
BadNonce Intent nonce mismatch — get fresh nonce
RELAY_NOT_CONFIGURED Relay service not available (503)

Rate Limits

The Agent API enforces rate limits per API key. Response headers include X-RateLimit-Remaining and Retry-After (on 429).

Class Limit Endpoints
Read 60 req/min (burst: 120/10s) get_markets, get_market_details, get_market_state, get_portfolio, get_vault_balance
Trade 120 req/hr (burst: 10/10s) trade, create_order, cancel_order, deposit
Create 20 req/hr, 50/day create_market

Note: flipcoin_get_quote calls the public quote endpoint which is IP-rate-limited (not counted against your API key quota). propose_resolution and finalize_resolution use the relay class (30 req/hr).

For autonomous agents, implement exponential backoff when you encounter RATE_LIMITED errors.

Using a Pre-built Client

If you need custom configuration, you can pass a pre-built flipcoin SDK client:

from flipcoin import FlipCoin
from flipcoin_langchain import FlipCoinToolkit

client = FlipCoin(api_key="fc_...", base_url="https://www.flipcoin.fun")
toolkit = FlipCoinToolkit(client=client)
tools = toolkit.get_tools()

Note: The flipcoin package (PyPI: flipcoin) is the low-level HTTP SDK. flipcoin-langchain wraps it as LangChain tools with input validation, USDC conversion, and error handling.

Using Individual Tools

from flipcoin import FlipCoin
from flipcoin_langchain import FlipCoinGetMarkets, FlipCoinTrade

client = FlipCoin(api_key="fc_...")

# Use tools individually
markets_tool = FlipCoinGetMarkets(client=client)
result = markets_tool.invoke({"status": "open", "sort": "trending"})

trade_tool = FlipCoinTrade(client=client)
result = trade_tool.invoke({
    "condition_id": "0x...",
    "side": "yes",
    "usdc_amount": "5.0",
})

Examples

See the examples/ directory:

  • langchain_agent.py — Complete LangChain ReAct agent with system prompt, tool loading, and conversation loop

Development

# Install dev dependencies
pip install -e ".[dev]"

# Run tests
pytest

# Run tests with coverage
pytest --cov=flipcoin_langchain

Links

License

MIT

Metadata

Release files for flipcoin-langchain 0.1.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for flipcoin-langchain 0.1.0
File Size Uploaded Provenance
flipcoin_langchain-0.1.0.tar.gz 29.8 kB Without provenance Details

Built distribution (wheel)

Table of built distributions (wheels) for flipcoin-langchain 0.1.0
File Interpreter ABI Platform
flipcoin_langchain-0.1.0-py3-none-any.whl Python 3 none any Details

Total release size: 51.3 kB

Release files / flipcoin_langchain-0.1.0.tar.gz

Download URL flipcoin_langchain-0.1.0.tar.gz
Size 29.8 kB
Tags Source
SHA-256 checksum
How to use checksums
937e64a5d1a702e389d2a7fea19e471a2d21ab6bf046ee28cfab0f95a624ac26
BLAKE2b-256 checksum
How to use checksums
a07eb1d3890a42911e354df36015eb914df083d2e71ca6e1f365dcd2d81ff759
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.12.1

Release files / flipcoin_langchain-0.1.0-py3-none-any.whl

Download URL flipcoin_langchain-0.1.0-py3-none-any.whl
Size 21.5 kB
Tags Python 3
SHA-256 checksum
How to use checksums
2b197d8898db5f9966791daf5a182b63652604faf5d5434b1d228f25fb52f91d
BLAKE2b-256 checksum
How to use checksums
09724c5eb1aae993053ef71a0ae7fc13168187d9b23b2415e3920d2e6078bd26
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.12.1

Security for flipcoin-langchain 0.1.0

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

Release history Release notifications | RSS feed

This release

0.1.0 This release

2 release files No provenance

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page