Skip to main content

Signing

The signing module provides utilities for various signature schemes used in CoW Protocol order signing.

Signing Schemes

enum SigningScheme {
  EIP712 = 0,
  ETHSIGN = 1,
  EIP1271 = 2,
  PRESIGN = 3,
}
SchemeDescription
EIP712Recommended. Provides structured data to wallets about what is being signed
ETHSIGNUses the eth_sign RPC call for legacy wallet compatibility
EIP1271For smart contract wallets like Gnosis Safe
PRESIGNOn-chain pre-authorization before settlement

Signature Types

EcdsaSignature

interface EcdsaSignature {
  scheme: SigningScheme.EIP712 | SigningScheme.ETHSIGN;
  data: string; // ECDSA signature (r, s, v)
}

Eip1271Signature

interface Eip1271Signature {
  scheme: SigningScheme.EIP1271;
  verifier: string; // Smart contract address
  data: string; // Signature bytes
}

PreSignSignature

interface PreSignSignature {
  scheme: SigningScheme.PRESIGN;
  signer: string; // Signer address
}

Functions

signOrder

Signs orders using externally owned accounts with either EIP-712 or ETHSIGN schemes.
async function signOrder(
  domain: TypedDataDomain,
  order: Order,
  signer: Signer,
  scheme: SigningScheme.EIP712 | SigningScheme.ETHSIGN
): Promise<EcdsaSignature>;
Parameters:
NameTypeDescription
domainTypedDataDomainEIP-712 domain separator
orderOrderOrder to sign
signerSignerethers.js Signer instance
schemeSigningSchemeEIP712 or ETHSIGN

encodeEip1271SignatureData

Encodes EIP-1271 signature components into hex format.
function encodeEip1271SignatureData(signature: {
  verifier: string;
  data: string;
}): string;

decodeEip1271SignatureData

Reverses the encoding to retrieve original signature components.
function decodeEip1271SignatureData(encodedSignature: string): {
  verifier: string;
  data: string;
};

Example

import { domain, signOrder, SigningScheme, Order, OrderKind } from "@cowprotocol/contracts";
import { ethers } from "ethers";

const settlementDomain = domain(1, "0x9008D19f58AAbD9eD0D60971565AA8510560ab41");
const wallet = new ethers.Wallet("YOUR_PRIVATE_KEY");

const order: Order = {
  // ... order fields
  kind: OrderKind.SELL,
  partiallyFillable: false,
};

// EIP-712 signing (recommended)
const signature = await signOrder(
  settlementDomain,
  order,
  wallet,
  SigningScheme.EIP712
);
EIP-712 is the recommended signing scheme for optimal user experience, as it shows users a structured representation of the order data in their wallet.
Last modified on March 4, 2026