Skip to main content
Placing orders from a Safe with multiple signers (multi-sig) requires coordinating signatures from threshold owners before the order can be submitted. This tutorial covers the complete flow using both PreSign and ERC-1271 approaches.

Overview

Safe multi-sig wallets can’t sign messages with a single key. Instead, you need to:
  1. Propose the order and collect the required number of owner signatures
  2. Submit the signed transaction to register the order on-chain (PreSign) or off-chain (ERC-1271)
Most multi-sig integrations use PreSign because it’s simpler and doesn’t require handling Safe’s internal signature encoding. Use ERC-1271 when gas costs matter (e.g., frequent trading).

Prerequisites

  • A Safe deployed with 2+ owners and a threshold ≥ 2
  • The sell token approved for the CoW Protocol Vault Relayer from the Safe
  • Safe Protocol Kit installed: npm install @safe-global/protocol-kit
PreSign is the simplest approach — you create the order, then execute a Safe transaction to call setPreSignature on the settlement contract.
1

Create the order with PRESIGN signing scheme

The order is now in the orderbook with status presignaturePending.
2

Build the PreSign Safe transaction

3

Collect additional owner signatures

Each additional owner signs the same transaction:
In practice, Safe owners typically sign via the Safe Transaction Service or Safe UI rather than sharing private keys. The Safe SDK supports both approaches.
4

Execute the transaction

Once enough signatures are collected (≥ threshold), any owner can execute:

Using Safe Transaction Service

For production multi-sig flows, use the Safe Transaction Service to propose and collect signatures asynchronously:

Method 2: ERC-1271 (Gas-Efficient)

ERC-1271 allows off-chain signing — no gas cost for the signature itself. The settlement contract calls isValidSignature on the Safe to verify.
ERC-1271 with Safe multi-sig requires encoding the combined Safe signatures in a specific format. This is more complex than PreSign. See the ERC-1271 Signing Guide for details on signature encoding.

Python SDK

The Python SDK’s swap_tokens function supports Safe multi-sig orders with the safe_address parameter:

Transaction Batching

For efficiency, you can batch the token approval and PreSign into a single Safe transaction using MultiSend:

Order Lifecycle

Troubleshooting

Next Steps

Last modified on March 12, 2026