Signing
CoW Protocol supports four distinct signing approaches for order authorization.
Signing Schemes
enum SigningScheme {
EIP712 = 0, // Structured data signing (recommended)
ETHSIGN = 1, // Legacy eth_sign RPC
EIP1271 = 2, // Smart contract signatures
PRESIGN = 3, // On-chain pre-approval
}
EIP-712 (Recommended)
Shows users a structured representation of the order data in their wallet, making it clear what they are signing.
const signature = await signOrder(
settlementDomain,
order,
wallet,
SigningScheme.EIP712
);
EthSign
Available for legacy wallet compatibility but provides minimal context to users about transaction details.
const signature = await signOrder(
settlementDomain,
order,
wallet,
SigningScheme.ETHSIGN
);
EIP-1271
For smart contract wallets like multi-signature systems. Enables verification through contract-based signature validation.
const eip1271Sig: Eip1271Signature = {
scheme: SigningScheme.EIP1271,
verifier: safeAddress,
data: signatureBytes,
};
const encoded = encodeEip1271SignatureData(eip1271Sig);
PreSign
Orders approved directly on-chain by calling setPreSignature on the settlement contract.
const preSignSig: PreSignSignature = {
scheme: SigningScheme.PRESIGN,
signer: ownerAddress,
};
Signature Types
EcdsaSignature
interface EcdsaSignature {
scheme: SigningScheme.EIP712 | SigningScheme.ETHSIGN;
data: string; // r, s, v values
}
Eip1271Signature
interface Eip1271Signature {
scheme: SigningScheme.EIP1271;
verifier: string;
data: string;
}
PreSignSignature
interface PreSignSignature {
scheme: SigningScheme.PRESIGN;
signer: string;
}
Core Functions
signOrder
async function signOrder(
domain: TypedDataDomain,
order: Order,
signer: Signer,
scheme: SigningScheme.EIP712 | SigningScheme.ETHSIGN
): Promise<EcdsaSignature>;
encodeEip1271SignatureData
function encodeEip1271SignatureData(signature: {
verifier: string;
data: string;
}): string;
decodeEip1271SignatureData
function decodeEip1271SignatureData(encoded: string): {
verifier: string;
data: string;
};
Always use the correct domain with appropriate chain IDs and settlement contract addresses to prevent replay attacks across different networks.