Predictefy Docs
Browse documentation

Echoed build results

The byte-compatible legacy echoed-build-result variant, and which lanes accept it — Polymarket V2, Opinion, and Predict.fun.

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, FAKorderType 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.