Skip to main content
Here’s the English version of your 8DX Limit Order Protocol documentation:

8DX Limit Order Protocol

Pure TypeScript + viem code for limit orders (no React/wagmi).

Files

  • limitOrderContracts.ts — contract addresses, EIP-712 types
  • makerTraits.ts — working with makerTraits bitmap
  • orderBuilder.ts — order construction
  • example.ts — usage example
import { parseUnits, createWalletClient, custom } from 'viem';
import { mainnet } from 'viem/chains';
import {
  getContractsForChain,
  EIP712_LIMIT_ORDER_DOMAIN,
  ORDER_EIP712_TYPES,
} from './limitOrderContracts';
import {
  buildMakerTraits,
  generateNonce,
  getExpiryTimestamp,
  decodeMakerTraits,
} from './makerTraits';
import { buildSimpleOrder, prepareOrderForApi } from './orderBuilder';

const walletClient = createWalletClient({
  chain: mainnet,
  transport: custom(window.ethereum),
});

const [maker] = await walletClient.getAddresses();
const contracts = getContractsForChain(1);

// 1. Build makerTraits
const makerTraits = buildMakerTraits({
  allowedSender: contracts.ALLOWED_SENDER,
  allowPartialFill: true,
  allowMultipleFills: true,
  expiry: getExpiryTimestamp(60),
  nonce: generateNonce(),
});

// 2. Build order
const order = buildSimpleOrder({
  maker,
  makerSrcOrToken: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48', // USDC
  takerSrcOrToken: '0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2', // WETH
  makingAmount: parseUnits('100', 6).toString(),
  takingAmount: parseUnits('0.03', 18).toString(),
  makerTraits,
});

// 3. Sign order
const signature = await walletClient.signTypedData({
  account: maker,
  domain: {
    name: EIP712_LIMIT_ORDER_DOMAIN.name,
    version: EIP712_LIMIT_ORDER_DOMAIN.version,
    chainId: 1,
    verifyingContract: contracts.LIMIT_ORDER_PROTOCOL,
  },
  types: ORDER_EIP712_TYPES,
  primaryType: 'Order',
  message: {
    salt: BigInt(order.salt),
    maker: order.maker,
    recipient: order.recipient,
    makerSrcOrToken: order.makerSrcOrToken,
    takerSrcOrToken: order.takerSrcOrToken,
    makingAmount: BigInt(order.makingAmount),
    takingAmount: BigInt(order.takingAmount),
    makerTraits: BigInt(order.makerTraits),
  },
});

// 4. Prepare for API
const orderBody = prepareOrderForApi(order, signature, decodeMakerTraits(order.makerTraits));
// POST to /api/orders

Contracts (Ethereum Mainnet)

ContractAddress
Limit Order Protocol0xDe5D3b6b9b8d0e063BFCf7Ec1FdbC2115D158f14
Permit20x000000000022D473030F116dDEE9F6B43aC78BA3
Permit2 Witness Proxy0xe54d802dD4F0fb47f3B0E4d4a7e739beA842F55A
Allowed Sender0xC9aAF1061076cC36EFa69A39D92E5792865A5b27