Build Order
Build an EIP-712 order structure for a user to sign.
Usage
import { BuilderClient, OrderSide, OrderType } from '@opinion-labs/opinion-clob-sdk';
const builder = new BuilderClient({
host: 'https://openapi.opinion.trade/openapi',
builderApiKey: 'YOUR_BUILDER_KEY',
chainId: 56,
});
const orderData = await builder.buildOrderForSigning({
marketId: 123,
tokenId: 'outcome_token_id',
userWalletAddress: '0xSafeAddress...', // User's Safe wallet (maker)
side: OrderSide.BUY,
orderType: OrderType.LIMIT_ORDER,
amount: 10,
price: '0.5',
signerAddress: '0xEOAAddress...', // User's EOA (signer)
});
console.log(orderData.order); // Order struct (Record<string, string>)
console.log(orderData.structHash); // Hash for signing
console.log(orderData.typedData); // Full EIP-712 typed data
console.log(orderData.exchangeAddress); // CTF Exchange address
console.log(orderData.currencyAddress); // Quote token address
console.log(orderData.currencyDecimal); // Token decimalsParameters
marketId
number
Yes
Market ID (positive integer)
tokenId
string
Yes
Outcome token ID
userWalletAddress
string
Yes
User's Safe wallet address (maker)
side
OrderSide
Yes
OrderSide.BUY (0) or OrderSide.SELL (1)
orderType
OrderType
Yes
OrderType.LIMIT_ORDER (2) or OrderType.MARKET_ORDER (1)
amount
number
Yes
Amount in human-readable units (e.g., 10 for 10 USDC)
price
string
For limit
Price per outcome token (e.g., '0.5'). Required for limit orders.
amountType
string
No
'quote' (default) or 'base'. Quote = ERC20 amount, Base = token amount.
signerAddress
string
No
Signer's EOA address. If different from userWalletAddress, Safe mode (signatureType=2) is used.
Response
Signing the Order
IMPORTANT: Order signing uses signHash(structHash), not signTypedData. This is different from Safe TX signing.
Test Helper
For testing, you can sign with a private key using the static helper:
Production: Users sign with their own wallet (MetaMask, WalletConnect). The wallet should sign the
structHashusingpersonal_signor equivalent.
Notes
For limit orders,
priceis required. For market orders,priceis ignored.Market BUY orders only accept
amountType: 'quote'(how much to spend).Market SELL orders only accept
amountType: 'base'(how many tokens to sell).When
signerAddressdiffers fromuserWalletAddress, the SDK automatically setssignatureTypeto 2 (POLY_GNOSIS_SAFE).Orders expire 30 days from creation by default.