Skip to content

GuidesBuild schemas by venue

Polymarket, Opinion, and Predict.fun may echo their venue SDK build result at the top level or nested under buildResult. The server validates the venue-specific shape, re-derives the EIP-712 structHash, and stores only the clean subset needed for submission.

FieldVenue scopeType
order.saltall threeuint256 decimal string
order.maker / signerall threeEVM address
order.tokenIdall threeuint256 decimal string
order.makerAmount / takerAmountall threeuint256 decimal string (atomic)
order.expirationall threeuint256 decimal string
order.sideall threevenue BUY/SELL form
order.signatureTypeall threesee per-venue rules below
order.timestampPolymarket V2 onlyuint256 Unix milliseconds
order.metadata / builderPolymarket V2 onlybytes32 hex
order.taker / nonce / feeRateBpsOpinion and Predict.fun onlyvenue V1 fields; rejected for Polymarket V2
domainall three{ name, version, chainId, verifyingContract }
structHashall three32-byte hex digest
exchangeAddress / currencyAddressall threeEVM addresses

currencyDecimal is shape-validated (integer 0–36) but is never the notional divisor. The divisor is server-derived — from the signed V2 verifyingContract on Polymarket, from the pinned collateral on Opinion and Predict.fun — because a client-declared decimals value is not part of the signed order and could otherwise be inflated to evade spend caps.

Polymarket V2 (Polygon, chain 137) additionally requires:

  • order.signatureType must be '0' (EOA). A Proxy or Safe order is rejected: polymarket signatureType must be EOA (0) — only client-signed EOA orders are accepted (no Proxy/Safe). maker must equal signer; V2 has no signed taker field.
  • The domain version must be 2, and the complete 11-field V2 signed order is required. Supplying V1-only taker, nonce, or feeRateBps is rejected.
  • orderType: one of GTC, GTD, FOK, FAK — orderType must be one of GTC|GTD|FOK|FAK.
  • currencyAddress must be pUSD-Polygon; other collateral is rejected.
  • order.salt must stay within the safe-integer range (the relay serializes it as a number, so a larger salt would no longer be byte-exact to what you signed).
  • Supply a conditionId (or catalog market context) so the lane can bind live market fee and token-level NegRisk truth. Optional compatibility metadata includes category and marketId.
  • Collateral is 6 decimals, not 18 — notional is makerAmount / 1e6.

Opinion (BSC) differs on three points:

  • order.signatureType may be '0' (EOA) or '2' (Safe). A Safe order where maker differs from signer must use '2'; that is enforced at submit.
  • order.taker defaults to the zero address when omitted.
  • currencyDecimal is required here, and marketId (integer), orderType (integer), and price (non-empty string) are required. postOnly is an optional boolean — postOnly must be a boolean when provided. A collateral whose decimals are not armed in this deployment is rejected with a message beginning unsupported opinion collateral currency — its decimals are not armed.

Predict.fun (BNB Chain, chain 56) differs again:

  • EOA only, same invariant as Polymarket with the message …(no Safe/proxy).
  • strategy is required: strategy must be 'MARKET' or 'LIMIT'.
  • pricePerShare is required as a uint256 decimal string.
  • Optional controls, each type-checked exactly: slippageBps (a uint decimal string, not a number), isFillOrKill, isPostOnly, isMinAmountOut (booleans), reservedBalancePolicy (REJECT_MARKET_ORDER | SKIP_RESERVED_BALANCE_CHECKS), and selfTradePrevention (CANCEL_MAKER | CANCEL_TAKER | CANCEL_BOTH).
  • Collateral is pinned to USDT-BSC at 18 decimals, not 6.