protocols/safe

Safe (Gnosis Safe) Multisig — Developer Guide

multichaintechnical-doc👥 Communityconfidence highhealth 100%
v1.0·by @openbuild·Updated 4/3/2026

Safe is the most widely used smart account / multisig on EVM chains. Supports 15+ networks.

Creating a 2/3 Multisig (Minimal Steps)

import Safe, { SafeFactory } from '@safe-global/protocol-kit'

// Step 1: Prepare 3 owner addresses
const owners = ['0xOwner1...', '0xOwner2...', '0xOwner3...']
const threshold = 2  // 2-of-3

// Step 2: Deploy via SafeFactory
const safeFactory = await SafeFactory.create({ provider, signer })
const safeAccountConfig = { owners, threshold }
const safeSdk = await safeFactory.deploySafe({ safeAccountConfig })

const safeAddress = await safeSdk.getAddress()
console.log('Safe deployed at:', safeAddress)

Or use the safe.global web UI: connect wallet → New Safe → Add owners → Set threshold → Deploy.

Proposing and Confirming Transactions

import SafeApiKit from '@safe-global/api-kit'

const apiKit = new SafeApiKit({ chainId: 1n })

// Propose a transaction (owner 1)
const safeTransactionData = {
  to: recipientAddress,
  value: '100000000000000000', // 0.1 ETH in wei
  data: '0x',
}
const safeTransaction = await safeSdk.createTransaction({ transactions: [safeTransactionData] })
const safeTxHash = await safeSdk.getTransactionHash(safeTransaction)
const signature = await safeSdk.signHash(safeTxHash)
await apiKit.proposeTransaction({ safeAddress, safeTransactionData: safeTransaction, safeTxHash, senderSignature: signature, senderAddress })

// Confirm (owner 2 signs)
const signature2 = await safeSdk2.signHash(safeTxHash)
await apiKit.confirmTransaction(safeTxHash, signature2.data)

// Execute after threshold reached
await safeSdk.executeTransaction(safeTransaction)

Key Concepts

ConceptDescription
thresholdMin signatures required to execute (e.g. 2 of 3)
ownersEOAs or smart contracts that can sign
SafeFactoryDeploys new Safe proxies via CREATE2 (deterministic address)
Safe Transaction ServiceOff-chain API for collecting signatures
ModulesOptional extensions (spending limits, recovery, etc.)
GuardsPre/post-execution hooks for custom validation

EIP-1271 Signature Validation

Safe implements EIP-1271 — contracts can verify Safe signatures on-chain:

bytes4 result = ISafe(safeAddress).isValidSignature(hash, signatures);
require(result == 0x1626ba7e, "Invalid signature");

Supported Networks

Mainnet, Arbitrum, Optimism, Polygon, Base, BNB Chain, Avalanche, Gnosis Chain, zkSync, Scroll, Linea, Celo, Blast, Mantle, and more.

Installation

npm install @safe-global/protocol-kit @safe-global/api-kit @safe-global/types-kit