A Python SDK to help developers interface with the Predict.fun protocol
Project description
Predict SDK for Python
A Python SDK to help developers interface with the Predict.fun protocol.
Installation
pip install predict-sdk
Quick Start
from predict_sdk import (
OrderBuilder,
ChainId,
Side,
BuildOrderInput,
LimitHelperInput,
)
# Create an OrderBuilder without a signer (read-only)
builder = OrderBuilder.make(ChainId.BNB_MAINNET)
# Calculate order amounts for a LIMIT order
amounts = builder.get_limit_order_amounts(
LimitHelperInput(
side=Side.BUY,
price_per_share_wei=500000000000000000, # 0.5 USDT per share
quantity_wei=10000000000000000000, # 10 shares
)
)
print(f"Maker Amount: {amounts.maker_amount}")
print(f"Taker Amount: {amounts.taker_amount}")
# Build an order
order = builder.build_order(
"LIMIT",
BuildOrderInput(
side=Side.BUY,
token_id="YOUR_TOKEN_ID",
maker_amount=str(amounts.maker_amount),
taker_amount=str(amounts.taker_amount),
fee_rate_bps=100, # Get from GET /markets endpoint
),
)
With a Signer
from eth_account import Account
from predict_sdk import OrderBuilder, ChainId
# Create from private key
private_key = "0x..." # Your private key
signer = Account.from_key(private_key)
# Or pass private key directly
builder = OrderBuilder.make(ChainId.BNB_MAINNET, private_key)
# Now you can sign orders and interact with contracts
typed_data = builder.build_typed_data(
order,
is_neg_risk=False,
is_yield_bearing=False,
)
signed_order = builder.sign_typed_data_order(typed_data)
print(f"Signature: {signed_order.signature}")
Setting Approvals
Before trading, you need to set approvals for the exchange contracts:
# Set all approvals at once
result = builder.set_approvals(is_yield_bearing=False)
if result.success:
print("All approvals set successfully!")
else:
print("Some approvals failed")
for tx in result.transactions:
if not tx.success:
print(f"Failed: {tx.cause}")
# Or set individual approvals
builder.set_ctf_exchange_approval(is_neg_risk=False, is_yield_bearing=False)
builder.set_ctf_exchange_allowance(is_neg_risk=False, is_yield_bearing=False)
Using Predict Accounts (Smart Wallets)
from predict_sdk import OrderBuilder, ChainId, OrderBuilderOptions
builder = OrderBuilder.make(
ChainId.BNB_MAINNET,
private_key, # Must be the Privy exported wallet
OrderBuilderOptions(
predict_account="0x...", # Your Predict account address
),
)
Signing Messages with Predict Accounts
When using a Predict account (smart wallet), you can sign arbitrary messages that can be verified on-chain:
from predict_sdk import OrderBuilder, ChainId, OrderBuilderOptions
builder = OrderBuilder.make(
ChainId.BNB_MAINNET,
private_key,
OrderBuilderOptions(predict_account="0x..."),
)
# Sign a string message
signature = builder.sign_predict_account_message("Hello, world!")
# Or sign a pre-computed hash (useful for EIP-712 typed data)
signature = builder.sign_predict_account_message({"raw": "0x1234..."})
# Async version available
signature = await builder.sign_predict_account_message_async("Hello, world!")
The signature is formatted for Kernel smart wallet verification, including the ECDSA validator address prefix.
Market Orders
from predict_sdk import MarketHelperInput, MarketHelperValueInput
# Market order by quantity (number of shares)
amounts = builder.get_market_order_amounts(
MarketHelperInput(
side=Side.BUY,
quantity_wei=10000000000000000000, # 10 shares
),
orderbook, # From GET /markets/{marketId}/orderbook
)
# Market BUY by value (total USDT to spend)
amounts = builder.get_market_order_amounts(
MarketHelperValueInput(
side=Side.BUY,
value_wei=5000000000000000000, # 5 USDT
),
orderbook,
)
Redeeming Positions
# For standard markets
result = builder.redeem_positions(
condition_id="0x...",
index_set=1, # 1 or 2
is_neg_risk=False,
is_yield_bearing=False,
)
# For NegRisk (winner-takes-all) markets
result = builder.redeem_positions(
condition_id="0x...",
index_set=1,
amount=1000000000000000000, # Required for NegRisk
is_neg_risk=True,
is_yield_bearing=False,
)
Merging Positions
Merge both outcome tokens back into collateral (USDT). Useful when holding equal amounts of both YES and NO positions.
# For standard markets
result = builder.merge_positions(
condition_id="0x...",
amount=1000000000000000000, # Amount to merge (in wei)
is_neg_risk=False,
is_yield_bearing=False,
)
# For NegRisk (winner-takes-all) markets
result = builder.merge_positions(
condition_id="0x...",
amount=1000000000000000000,
is_neg_risk=True,
is_yield_bearing=False,
)
Canceling Orders
from predict_sdk import CancelOrdersOptions
result = builder.cancel_orders(
orders=[order1, order2],
options=CancelOrdersOptions(
is_neg_risk=False,
is_yield_bearing=False,
),
)
Checking Balance
balance = builder.balance_of("USDT")
print(f"USDT Balance: {balance}")
Async Support
All contract interaction methods have async versions:
import asyncio
async def main():
balance = await builder.balance_of_async("USDT")
result = await builder.set_approvals_async(is_yield_bearing=False)
asyncio.run(main())
API Reference
OrderBuilder
The main class for building and signing orders.
Factory Method
OrderBuilder.make(
chain_id: ChainId,
signer: LocalAccount | str | None = None,
options: OrderBuilderOptions | None = None,
) -> OrderBuilder
Order Building Methods
get_limit_order_amounts(data: LimitHelperInput) -> OrderAmountsget_market_order_amounts(data: MarketHelperInput | MarketHelperValueInput, book: Book) -> OrderAmountsbuild_order(strategy: "MARKET" | "LIMIT", data: BuildOrderInput) -> Orderbuild_typed_data(order: Order, *, is_neg_risk: bool, is_yield_bearing: bool) -> EIP712TypedDatabuild_typed_data_hash(typed_data: EIP712TypedData) -> strsign_typed_data_order(typed_data: EIP712TypedData) -> SignedOrdersign_predict_account_message(message: str | dict) -> str- Sign a message for a Predict accountsign_predict_account_message_async(message: str | dict) -> str- Async version
Approval Methods
set_approvals(*, is_yield_bearing: bool = False) -> SetApprovalsResultset_ctf_exchange_approval(*, is_neg_risk: bool, is_yield_bearing: bool, approved: bool = True) -> TransactionResultset_neg_risk_adapter_approval(*, is_yield_bearing: bool, approved: bool = True) -> TransactionResultset_ctf_exchange_allowance(*, is_neg_risk: bool, is_yield_bearing: bool, amount: int = MAX_UINT256) -> TransactionResult
Position Management
balance_of(token: "USDT" = "USDT", address: str | None = None) -> intredeem_positions(condition_id: str, index_set: 1 | 2, amount: int | None = None, *, is_neg_risk: bool, is_yield_bearing: bool) -> TransactionResultmerge_positions(condition_id: str, amount: int, *, is_neg_risk: bool, is_yield_bearing: bool) -> TransactionResult
Order Cancellation
cancel_orders(orders: list[Order], options: CancelOrdersOptions) -> TransactionResultvalidate_token_ids(token_ids: list[int], *, is_neg_risk: bool, is_yield_bearing: bool) -> bool
Types
from predict_sdk import (
ChainId, # BNB_MAINNET (56), BNB_TESTNET (97)
Side, # BUY (0), SELL (1)
SignatureType, # Only supports EOA (0)
Order,
SignedOrder,
BuildOrderInput,
OrderAmounts,
LimitHelperInput,
MarketHelperInput,
MarketHelperValueInput,
Book,
EIP712TypedData,
TransactionResult,
SetApprovalsResult,
CancelOrdersOptions,
OrderBuilderOptions,
)
Requirements
- Python >= 3.10
- web3.py >= 6.0.0
License
MIT
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file predict_sdk-0.0.8.tar.gz.
File metadata
- Download URL: predict_sdk-0.0.8.tar.gz
- Upload date:
- Size: 37.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.10.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9682cf51ff92fe3535a9bf91b15f70644e936eb837faf0e47fa634479c76dc2f
|
|
| MD5 |
a3f0b3ed3109def87e01451caffe6052
|
|
| BLAKE2b-256 |
05d251114e2fe29ef70092e5136d11ef620b0c635735c7a4d32b298f18842570
|
File details
Details for the file predict_sdk-0.0.8-py3-none-any.whl.
File metadata
- Download URL: predict_sdk-0.0.8-py3-none-any.whl
- Upload date:
- Size: 38.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.10.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
36aed6c2ad5ba0a715cf023947baa243c15815dfbb7083215eaac60079ce395a
|
|
| MD5 |
7242cfc95b2202e87edb471df5598114
|
|
| BLAKE2b-256 |
bb843536e2f081a538c8f3548a0a0059695a9c885bfb7e92e64da1aa71998533
|