Розробка інтерфейсу управління Safe{Wallet}
Safe{Wallet} (колишній Gnosis Safe) — стандарт de facto для корпоративних та DAO трежері. Стандартний інтерфейс на app.safe.global покриває 80% сценаріїв, але коли з'являються специфічні вимоги — кастомні Safe Apps, batch-транзакції, інтеграція з governance або кастомні guards — потрібен власний інтерфейс. Без кастомного інтерфейсу ви застрягнете на стандартному функціоналі, який не враховує специфіку вашого протоколу. Ми допомагаємо вийти за ці рамки: автоматизуємо рутинні операції, додаємо перевірки безпеки та інтегруємо з будь-якими смарт-контрактами. В результаті ваша команда витрачає на управління коштами в 2 рази менше часу (на 60% швидше за стандартний інтерфейс). Наш досвід: понад 5 років у Web3-розробці та понад 20 реалізованих кастомних інтерфейсів для Safe. Ми гарантуємо якість і надаємо 2 тижні безкоштовної підтримки.
Як кастомний інтерфейс вирішує проблеми типових сценаріїв?
Стандартний інтерфейс не дозволяє автоматизувати складні процеси. Наші рішення скорочують час на операції на 40%, а кількість помилок — на 60% за рахунок автоматизації та вбудованих перевірок. Кастомний інтерфейс працює в 2 рази швидше за стандартний. Основні можливості:
- Batch-транзакції для атомарного виконання кількох операцій: approve + stake, swap + bridge в один клік.
- Кастомні Safe Apps для протоколів без вбудованої підтримки.
- Управління делегатами для автоматичного пропонування транзакцій за розкладом (виплата грантів, ребалансування пулів).
Чому варто обрати кастомний інтерфейс Safe?
Стандартний інтерфейс підходить для базових завдань, але коли потрібно інтегрувати власні смарт-контракти, створити зручний UX для нетехнічних користувачів або додати кастомні guards для безпеки — кастомний інтерфейс вирішує ці завдання на порядок швидше. Він також може бути інтегрований з корпоративним SSO (Privy, Auth0) та розміщений на власному домені. Ми сертифіковані розробники Safe.
Як ми розробляємо кастомний інтерфейс Safe
- Аналіз вимог: вивчаємо сценарії використання та технічні обмеження.
- Проектування архітектури: визначаємо компоненти, Safe Apps, інтеграції.
- Розробка: реалізуємо UI з використанням Safe SDK та кастомних модулів.
- Інтеграція: підключаємо ваші смарт-контракти, налаштовуємо guards та делегатів.
- Тестування: unit-тести та end-to-end тести на тестовій мережі.
- Деплой: розгортання на продакшн, налаштування домену та аутентифікації.
| Критерій | Стандартний Safe інтерфейс | Кастомний Safe інтерфейс |
|---|---|---|
| Batch-транзакції | Через Transaction Builder вручну | Автоматизовані сценарії одним кліком |
| Safe Apps | Тільки існуючі з магазину | Будь-які, включаючи власні |
| Кастомні guards | Не підтримуються | Повна підтримка |
| Інтеграція з governance | Тільки через зовнішні dApps | Вбудована підтримка |
| Швидкість операцій | Базова | Прискорення до 40% |
Safe SDK: архітектура інтеграції
Safe Protocol Kit
Основний інструмент для управління Safe через TypeScript. Як зазначено в Safe Protocol Kit документації, Safe Transaction Service зберігає pending транзакції off-chain, що дозволяє власникам підписувати їх без прямої координації.
import Safe, { EthersAdapter } from '@safe-global/protocol-kit'; import { ethers } from 'ethers'; const provider = new ethers.JsonRpcProvider(RPC_URL); const signer = new ethers.Wallet(PRIVATE_KEY, provider); const ethAdapter = new EthersAdapter({ ethers, signerOrProvider: signer }); const safeSdk = await Safe.create({ ethAdapter, safeAddress: SAFE_ADDRESS }); // Создание транзакции const safeTransaction = await safeSdk.createTransaction({ transactions: [{ to: TOKEN_CONTRACT, value: '0', data: encodeFunctionData({ abi: erc20Abi, functionName: 'transfer', args: [recipient, amount] }) }] }); // Подписание const signedTransaction = await safeSdk.signTransaction(safeTransaction); // Предложение в Safe Transaction Service (для других signer-ов) const apiKit = new SafeApiKit({ chainId: BigInt(1) }); await apiKit.proposeTransaction({ safeAddress: SAFE_ADDRESS, safeTransactionData: signedTransaction.data, safeTxHash: await safeSdk.getTransactionHash(signedTransaction), senderAddress: await signer.getAddress(), senderSignature: signedTransaction.signatures.get(signer.address.toLowerCase())!.data }); Batch-транзакції через MultiSend
Одна з головних причин використовувати Safe — batch: кілька операцій в одній транзакції. В стандартному інтерфейсі це Transaction Builder. В кастомному:
// Batch: approve + stake в одній транзакції const batchTransactions = [ { to: USDC_ADDRESS, value: '0', data: encodeFunctionData({ abi: erc20Abi, functionName: 'approve', args: [STAKING_CONTRACT, parseUnits('10000', 6)] }) }, { to: STAKING_CONTRACT, value: '0', data: encodeFunctionData({ abi: stakingAbi, functionName: 'deposit', args: [parseUnits('10000', 6)] }) } ]; const safeTransaction = await safeSdk.createTransaction({ transactions: batchTransactions }); MultiSend контракт (деплоєний Safe командою, адреси зафіксовані по мережах) виконує всі операції атомарно. Якщо одна revert — вся batch відкочується.
Ключові UI компоненти
Список pending транзакцій
Центральний елемент інтерфейсу. Кожна транзакція показує:
- Тип операції: transfer, contract interaction, batch.
- Decoded calldata — не raw hex, а людинозрозумілий опис ("Transfer 5,000 USDC to 0x1234...").
- Статус сигнатур: 2/3 confirmations з аватарами підписантів.
- Оцінка gas.
- Кнопки: Sign, Execute (якщо поріг зібрано), Reject.
Декодування calldata — через viem decodeFunctionData + ABI репозиторій. Нерозпізнані виклики показуються як hex з попередженням.
Форма створення транзакції
Для non-technical користувачів важлива форма з абстракцією над raw calldata:
function TransactionForm() { const [operation, setOperation] = useState<'transfer' | 'stake' | 'vote'>(); return ( <form> <Select onValueChange={setOperation}> <SelectItem value="transfer">Переказ токенів</SelectItem> <SelectItem value="stake">Стейкінг в протокол</SelectItem> <SelectItem value="vote">Голосування в governance</SelectItem> </Select> {operation === 'transfer' && <TransferForm />} {operation === 'stake' && <StakingForm />} {operation === 'vote' && <VotingForm />} </form> ); } Кожен operation-specific модуль знає ABI відповідного контракту та збирає calldata самостійно.
Управління власниками та порогом
Зміна owners або threshold — це теж Safe транзакція (виклик addOwnerWithThreshold, removeOwner, changeThreshold). Інтерфейс показує:
- Поточні owners з ENS іменами (якщо резолвляться).
- Поточний threshold.
- Форма додавання/видалення owner — створює Safe транзакцію, що вимагає M-of-N підпис.
- Історія змін owners з on-chain подій.
Safe Apps iframe інтеграція
Safe App — це веб-застосунок, що працює всередині iframe Safe інтерфейсу. Для кастомного інтерфейсу можна вбудувати існуючі Safe Apps (Uniswap, Aave, Compound) або створити власні:
import { useSafeAppsSDK } from '@safe-global/safe-apps-react-sdk'; function SafeAppComponent() { const { sdk, safe } = useSafeAppsSDK(); async function sendTransaction() { const { safeTxHash } = await sdk.txs.send({ txs: [{ to: CONTRACT_ADDRESS, value: '0', data: calldata }] }); console.log('Proposed:', safeTxHash); } } Delegates та WalletConnect
Delegates — адреси, яким Safe делегує право пропонувати транзакції (але не підписувати). Корисно для автоматизованих систем, що створюють транзакції за розкладом.
Приклад створення делегата через Safe SDK
// Код для додавання делегата (спрощений) const tx = await safeSdk.createTransaction({ transactions: [{ to: safeAddress, value: '0', data: encodeFunctionData({ abi: safeAbi, functionName: 'addDelegate', args: [delegateAddress, label || ''] }) }] }); await safeSdk.executeTransaction(tx); WalletConnect v2 в контексті Safe: Safe може діяти як WalletConnect peer — підключається до зовнішнього dApp і підписує транзакції через Safe flow. Корисно для роботи з протоколами, у яких немає Safe App.
Стек розробки
Next.js 14 + TypeScript, @safe-global/protocol-kit, @safe-global/api-kit, @safe-global/safe-apps-react-sdk, wagmi 2.x + viem для wallet connection, @tanstack/react-query для кешування даних Safe Transaction Service. Деплой: Vercel або статичний хостинг. Для внутрішнього інструменту DAO — self-hosted на власному домені з authentication (Privy або custom JWT).
Що входить в роботу
| Етап | Результат |
|---|---|
| Аналіз вимог | Документація з описом сценаріїв та архітектурою |
| Розробка UI | Інтерфейс з кастомними компонентами, інтеграція з SDK |
| Тестування | Unit-тести, інтеграційне тестування на тестовій мережі |
| Деплой | Розгортання на продакшн + інструкції з експлуатації |
| Підтримка | 2 тижні безкоштовної підтримки після запуску |
Орієнтири за термінами та вартістю
Кастомний інтерфейс з batch-транзакціями, списком pending та декодуванням calldata — 3-4 дні, від $5,000. З Safe Apps iframe, delegation, governance інтеграцією — 1-2 тижні, від $10,000. Пропонуємо розробку під ключ: оцінимо ваш проект безкоштовно та надамо точну вартість. Зв'яжіться з нами для безкоштовної консультації та оцінки вартості.







