Gas Operations
Gas vs Gas-Free Operations
Overview
The Opinion CLOB SDK implements a hybrid execution model: off-chain order matching via CLOB infrastructure eliminates gas costs for order operations, while direct smart contract invocations require BNB native token for transaction fees.
Gas-Free Operations
Off-Chain Order Book
The Central Limit Order Book functions as an off-chain matching engine. Orders are authenticated via EIP712 cryptographic signatures and submitted to the Opinion API. On-chain settlement is executed asynchronously by backend infrastructure, abstracting gas costs from end users.
Supported Gas-Free Operations
Market Data Queries
- get_markets()- Market metadata retrieval
- get_market()- Individual market details
- get_categorical_market()- Categorical market information
- get_orderbook()- Real-time order book snapshots
- get_latest_price()- Current market prices
- get_price_history()- Historical price data (OHLCV candles)
- get_quote_tokens()- Supported collateral currencies
- get_fee_rates()- Fee schedule information
Order Management
- place_order()- Order submission (market and limit)
- cancel_order()- Single order cancellation
- cancel_all_orders()- Batch order cancellation
- get_my_orders()- Active order retrieval
- get_order_by_id()- Order status queries
Position Tracking
- get_my_balances()- Token balance queries
- get_my_positions()- Position inventory
- get_my_trades()- Trade history
Technical Implementation
from opinion_clob_sdk import Client
from opinion_clob_sdk.chain.py_order_utils.model.order import PlaceOrderDataInput
from opinion_clob_sdk.chain.py_order_utils.model.sides import OrderSide
from opinion_clob_sdk.chain.py_order_utils.model.order_type import LIMIT_ORDER
client = Client(
    host='https://proxy.opinion.trade:8443',
    apikey='your_api_key',
    chain_id=56,
    rpc_url='https://bsc-dataseed.binance.org',
    private_key='0x...',      # Signs orders (no gas required)
    multi_sig_addr='0x...'
)
# Gas-free order placement
order = PlaceOrderDataInput(
    marketId=813,
    tokenId='——————',
    side=OrderSide.BUY,
    orderType=LIMIT_ORDER,
    price='0.65',
    makerAmountInQuoteToken=100
)
result = client.place_order(order)  # Zero gas cost to userEIP712 Signature Protocol
Orders employ typed structured data signatures conforming to EIP712 specification. Signatures provide cryptographic proof of authorization without blockchain state modification.
Signature Generation Flow:
- Order parameters encoded per EIP712 TypedData standard 
- Digest computed: - keccak256("\x19\x01" ‖ domainSeparator ‖ structHash)
- ECDSA signature generated via secp256k1 curve 
- Signature transmitted with order to API endpoint 
- Backend performs ecrecover validation (signer authenticity) 
- Matched orders batch-settled on-chain (gas paid by infrastructure) 
Pseudocode:
# EIP712 signature construction (simplified)
domain_separator = keccak256(
    encode(EIP712Domain_TYPEHASH, name, version, chainId, verifyingContract)
)
struct_hash = keccak256(encode(ORDER_TYPEHASH, order_params))
digest = keccak256(concat(0x1901, domain_separator, struct_hash))
signature = ecdsa_sign(digest, private_key)  # Returns (v, r, s)Gas-Required Operations
On-Chain Smart Contract Invocations
Direct blockchain transactions invoke smart contract methods and require gas payment in BNB native tokens. These operations modify on-chain state and are irreversible post-confirmation.
Operations Requiring Gas
Token Approval (One-Time Setup)
- enable_trading()- Grant ERC20/ERC1155 allowances to exchange contracts
Position Operations
- split()- Invoke- ConditionalTokens.splitPosition()(USDT → outcome tokens)
- merge()- Invoke- ConditionalTokens.mergePositions()(outcome tokens → USDT)
- redeem()- Invoke- ConditionalTokens.redeemPositions()(claim winning payouts)
State Query (RPC Call, No Gas)
- check_enable_trading()- Read contract allowance state via- eth_call
Gas Cost Analysis
BNB Chain Network Parameters
Block Time
~1.5s
Average block production interval
Gas Price
0.05 Gwei
Minimum gas price (EIP-1559 base fee)
Finality Threshold
10 blocks
Recommended confirmation depth (~15s)
Operation Gas Consumption Estimates
enable_trading() (2 approvals)
~100,000
0.000005 BNB
$0.003
split()
~150,000
0.0000075 BNB
$0.0045
merge()
~120,000
0.000006 BNB
$0.0036
redeem()
~180,000
0.000009 BNB
$0.0054
Cost Formula:
Transaction Fee = Gas Units × Gas Price (Gwei) × 10^-9 BNB
USD Cost = Transaction Fee × BNB/USD PriceVariability Factors:
- Network congestion (gas price auction) 
- Contract state complexity (storage operations) 
- Transaction data size (calldata cost) 
- BNB market price volatility 
Implementation Examples
Enable Trading (Required Once)
from opinion_clob_sdk import Client
client = Client(...)
# Check current approval status
status = client.check_enable_trading()
print(f"USDT approved: {status['usdt_approved']}")
print(f"Conditional tokens approved: {status['conditional_tokens_approved']}")
# Grant approvals if needed
if not (status['usdt_approved'] and status['conditional_tokens_approved']):
    tx_hash = client.enable_trading()
    print(f"Approval transaction: {tx_hash}")
    # Wait for confirmation before tradingRequired Approvals:
- USDT Contract → Exchange contract (for collateral deposits) 
- ConditionalTokens Contract → Exchange contract (for outcome token trading) 
Split Position
# Convert 100 USDT into 100 YES + 100 NO tokens
amount_in_usdt = 100
amount_in_wei = amount_in_usdt * 10**18  # USDT has 18 decimals
tx_hash = client.split(
    market_id=813,
    amount=amount_in_wei
)
print(f"Split transaction: {tx_hash}")
# Result: +100 YES tokens, +100 NO tokens, -100 USDTUse Cases:
- Creating outcome tokens for selling 
- Market making strategies 
- Arbitrage opportunities 
Merge Position
# Convert 50 YES + 50 NO back into 50 USDT
amount_to_merge = 50 * 10**18  # Outcome tokens use 18 decimals
tx_hash = client.merge(
    market_id=813,
    amount=amount_to_merge
)
print(f"Merge transaction: {tx_hash}")
# Result: -50 YES tokens, -50 NO tokens, +50 USDTRequirements:
- Must hold equal amounts of both outcome tokens 
- Amount specified in Wei (18 decimals) 
Redeem Winnings
# Claim winnings from resolved market
try:
    tx_hash = client.redeem(market_id=813)
    print(f"Redeem transaction: {tx_hash}")
except NoPositionsToRedeem:
    print("No winning positions to redeem")Redemption Logic:
- Markets resolved to YES: 1 YES token → 1 USDT 
- Markets resolved to NO: 1 NO token → 1 USDT 
- Losing outcome tokens become worthless 
Gas Balance Requirements
Recommended BNB Holdings
Maintain sufficient BNB balance to execute gas-required operations without transaction failures.
Allocation Guidelines:
Initial setup
0.001 BNB (~$0.60)
Single enable_trading() call
High-frequency
0.1 BNB (~$60.00)
Hundreds of transactions, failover capacity
Balance Monitoring
from web3 import Web3
w3 = Web3(Web3.HTTPProvider('https://bsc-dataseed.binance.org'))
address = '0xYourWalletAddress'
# Query native token balance
balance_wei = w3.eth.get_balance(address)
balance_bnb = Web3.from_wei(balance_wei, 'ether')
print(f"BNB Balance: {balance_bnb:.6f} BNB")
# Alert threshold
MINIMUM_BALANCE = 0.005  # BNB
if balance_bnb < MINIMUM_BALANCE:
    print(f"WARNING: BNB balance below threshold. Current: {balance_bnb}, Required: {MINIMUM_BALANCE}")Position Management Planning
Structure trading strategies to minimize split/merge operations.
Example Strategy:
- Execute single split to create large token inventory 
- Trade via gas-free CLOB orders 
- Merge/redeem only when exiting position or market resolves 
# Initial setup (one-time gas cost)
client.split(market_id=813, amount=1000_000000)  # Create 1000 YES + 1000 NO
# Trading loop (no gas costs)
for i in range(100):
    order = PlaceOrderDataInput(...)
    client.place_order(order)  # Gas-free
# Position exit (one-time gas cost)
client.merge(market_id=813, amount=500 * 10**18)  # Merge remaining 500 pairsNext Steps
- Precision - Token decimal systems 
Last updated

