> ## Documentation index
> Fetch the complete documentation index at: https://docs.predictefy.com/llms.txt
> Use it to discover every available page before exploring further.

# 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.

| Field                                  | Venue scope                  | Type                                            |
| -------------------------------------- | ---------------------------- | ----------------------------------------------- |
| `order.salt`                           | all three                    | `uint256` decimal string                        |
| `order.maker` / `signer`               | all three                    | EVM address                                     |
| `order.tokenId`                        | all three                    | `uint256` decimal string                        |
| `order.makerAmount` / `takerAmount`    | all three                    | `uint256` decimal string (atomic)               |
| `order.expiration`                     | all three                    | `uint256` decimal string                        |
| `order.side`                           | all three                    | venue BUY/SELL form                             |
| `order.signatureType`                  | all three                    | see per-venue rules below                       |
| `order.timestamp`                      | Polymarket V2 only           | `uint256` Unix milliseconds                     |
| `order.metadata` / `builder`           | Polymarket V2 only           | bytes32 hex                                     |
| `order.taker` / `nonce` / `feeRateBps` | Opinion and Predict.fun only | venue V1 fields; rejected for Polymarket V2     |
| `domain`                               | all three                    | `{ name, version, chainId, verifyingContract }` |
| `structHash`                           | all three                    | 32-byte hex digest                              |
| `exchangeAddress` / `currencyAddress`  | all three                    | EVM 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.
