Інтеграція з Safe{Wallet} (Gnosis Safe)
Safe (колишній Gnosis Safe) — де-факто стандарт мультисиг кошелька у EVM екосистемі. Більш $100 млрд активів під управлінням, інтеграція у більшість крупних DAO й корпоративних treasury. Суть: смарт-контракт кошелек з M-of-N підписами, де транзакція виконується лише після сбору потрібного порога підписів від owners.
Інтеграція з Safe потрібна у кількох сценаріях: DAO treasury management, корпоративний контроль над смарт-контрактами, multisig для DeFi протоколів, кастомний інтерфейс для управління активами команди.
Архітектура Safe
Safe контракт — GnosisSafe.sol з модульною архітектурою. Ключові компоненти:
Owners й Threshold. Список адрес-owners й мінімальна кількість підписів для виконання. Зміна цих параметрів сама вимагає threshold підписів.
Modules. Додаткові смарт-контракти, що можуть виконувати транзакції від імені Safe без стандартного процесу підписів. Використовуються для автоматизації (Zodiac, Gelato), recovery механізмів, кастомних flows.
Guards. Контракти, що вызиваються до й після кожної Safe транзакції для додаткових перевірок. Можна реалізувати whitelist адрес, ліміти на суми, cooldown періоди.
Fallback Handler. Обробляє вызови невідомих функцій й receive(). Використовується для підтримки додаткових стандартів (ERC-1155, EIP-1271).
Safe Transaction Service й API
Safe підтримує offline сбір підписів через Safe Transaction Service — hosted API від команди Safe. Flow:
- Proposer (будь-який owner) створює транзакцію й відправляє у Transaction Service
- Інші owners бачать pending транзакцію в інтерфейсі, перевіряють й підписують
- Після сбору threshold підписів — будь-хто може виконати on-chain (оплативши газ)
import SafeApiKit from '@safe-global/api-kit'
import Safe from '@safe-global/protocol-kit'
const apiKit = new SafeApiKit({
chainId: 1n // Ethereum mainnet
})
// Створити pending транзакцію
const safeTransaction = await safeSdk.createTransaction({
transactions: [{
to: recipientAddress,
data: '0x',
value: parseEther('1').toString()
}]
})
const safeTxHash = await safeSdk.getTransactionHash(safeTransaction)
const senderSignature = await safeSdk.signHash(safeTxHash)
await apiKit.proposeTransaction({
safeAddress,
safeTransactionData: safeTransaction.data,
safeTxHash,
senderAddress,
senderSignature: senderSignature.data
})
Для кастомного frontend: @safe-global/protocol-kit й @safe-global/api-kit — офіційні SDK. Працюють у браузері й Node.js.
Safe Apps SDK: Вбудовування dApps
Safe Apps — dApps, що запускаються всередині Safe інтерфейсу як iframes. Ключевой момент: Safe App не відправляє транзакції безпосередньо, а передає їх у Safe для підпису через @safe-global/safe-apps-sdk.
import SafeAppsSDK from '@safe-global/safe-apps-sdk'
const sdk = new SafeAppsSDK()
// Замість звичайного wallet.sendTransaction
const txs = [{
to: contractAddress,
data: contract.interface.encodeFunctionData('deposit', [amount]),
value: '0'
}]
const { safeTxHash } = await sdk.txs.send({ txs })
Якщо потрібно вбудувати існуючий dApp у Safe екосистему або створити кастомне treasury management приложення — це основний шлях.
Zodiac: Модульна розширюваність
Zodiac — фреймворк від Gnosis Guild для розширення Safe через модулі. Готові модулі:
Reality Module — виконує транзакції по результатам on-chain голосування через Kleros або Reality.eth. Safe + Snapshot + Reality Module = DAO treasury без on-chain voting газу.
Delay Module — додає timelock для транзакцій. Критично для протоколів: навіть якщо threshold підписів зібрані, транзакція чекає N годин перед виконанням. Користувачі можуть помітити й відреагувати на шкідливі зміни.
Roles Module — гранульований контроль доступу. Різним адресам можна дозволити вызивати конкретні функції конкретних контрактів з конкретними параметрами. Приклад: "мультисиг може вызвати лише rebalance() на стратегії, але не withdraw()".
Кастомні Guard й Module
Якщо потрібна специфічна логіка — пишемо кастомний Guard чи Module.
Приклад Guard з дневным лімітом трат:
contract SpendingLimitGuard is BaseGuard {
uint256 public dailyLimit;
uint256 public currentDay;
uint256 public spentToday;
function checkTransaction(
address to,
uint256 value,
bytes memory data,
// ... інші параметри
) external override {
if (block.timestamp / 1 days > currentDay) {
currentDay = block.timestamp / 1 days;
spentToday = 0;
}
require(spentToday + value <= dailyLimit, "Daily limit exceeded");
spentToday += value;
}
function checkAfterExecution(bytes32 txHash, bool success) external override {}
}
Guard підключається через Safe.setGuard(guardAddress) — сама транзакція вимагає threshold підписів.
Мультичейн Safe й Safe{Core} AA
Safe розгортається на 15+ сітях, адреси контрактів совпадают (deployment через CREATE2 з одинаковим salt). Safe адрес на Ethereum й Arbitrum може бути одинаковим, якщо розгорнутий з одинаковими параметрами (owners, threshold, nonce).
Safe{Core} Account Abstraction SDK — новий стек, що інтегрує Safe з ERC-4337. Safe контракт стає ERC-4337 Account, транзакції йдуть через bundler, можна використовувати Paymaster для оплати газу в ERC-20.
Стек інтеграції
| Задача | Інструмент |
|---|---|
| SDK для транзакцій | @safe-global/protocol-kit |
| Pending транзакції | @safe-global/api-kit |
| Safe Apps (iframe dApp) | @safe-global/safe-apps-sdk |
| Модулі й розширення | Zodiac framework |
| AA інтеграція | @safe-global/safe-core-sdk |
Сроки
Базова інтеграція — UI для створення/підпису/виконання транзакцій через Safe Transaction Service, список pending транзакцій, історія: 3-4 тижні.
Розширена інтеграція з кастомними модулями, Guard контрактами, Safe Apps, Zodiac: 6-8 тижнів + аудит кастомних контрактів.
Safe контракти пройшли багато аудитів — сам Safe безпечен. Ризики — у кастомних модулях й Guards, що пишуться під проект.







