Кастомні модулі та хуки для Safe{Wallet}
Уявіть: ваша DAO керує казною в $10M через Safe, але кожен дрібний платіж вимагає голосування 3/5 підписів. Це повільно та дорого — кожна транзакція може займати години та коштувати сотні доларів у газах та часі. Наша команда розробників Safe Plugin вирішує цю проблему, даючи можливість виконувати рутинні операції без мультисига, заощаджуючи до $500 на операційних витратах щомісяця. Наприклад, Spending Limit Plugin виконує транзакцію за $0.1, тоді як multisig коштує $0.5 — це в 5 разів дешевше.
Safe (колишній Gnosis Safe) — стандарт де-факто для мультисиг-зберігання коштів у Web3. $100B+ TVL, тисячі DAO та протоколів. Але базова функціональність Safe — це тільки multisig. Plugins (раніше Modules) розширюють його до повноцінної програмованої казни: автоматичні платежі, рольовий доступ, DeFi-інтеграції, spending limits без окремого multisig голосування.
Ми розробляємо кастомні Safe Plugin під ключ — від архітектури до деплою та інтеграції в Safe{Wallet}. Наш досвід включає 10+ проєктів на Ethereum, Polygon та Arbitrum. Наша команда має 5+ років досвіду в блокчейн-розробці. Гарантуємо безпеку та якість: всі контракти проходять аудит. Оцінимо ваше завдання за 1 робочий день.
Архітектура Safe Extensions у Safe v1.4+
Safe{Core} Protocol — це модульна система поверх Safe Account. З версії 1.4 Safe перейшов на нову архітектуру з трьома типами розширень:
| Тип | Що робить | Приклад |
|---|---|---|
| Plugin | Виконує транзакції від імені Safe без multisig | Spending Limit для операційних витрат |
| Hook | Валідує транзакції до/після виконання | Перевірка на санкційні адреси |
| Function Handler | Обробляє виклики до Safe через fallback |
Кастомна логіка при отриманні токенів |
Plugin — найпотужніший тип. Він може викликати execTransactionFromModule() на Safe контракті, минаючи поріг підписів. Саме тому встановлення plugin вимагає повного multisig approve.
interface ISafeProtocolPlugin {
function name() external view returns (string memory);
function version() external view returns (string memory);
function metadataHash() external view returns (bytes32);
}
Plugin реєструється в SafeProtocolRegistry — whitelist схвалених розширень. Кастомний plugin для mainnet Safe потрібно або пройти аудит для включення в офіційний реєстр, або використовувати через кастомний Manager.
Для чого потрібен кастомний Plugin, якщо є стандартні модулі?
Стандартні модулі Safe, такі як Allowances Module, покривають базові сценарії. Однак багато проєктів вимагають нестандартної логіки: мульти-токенні ліміти з різними періодами, інтеграція з AMM для автоматичного ребалансу пулу, рольова модель з різними рівнями доступу. Кастомне розширення Safe може інтегруватися з будь-яким DeFi протоколом. У таких випадках кастомний Plugin дає повний контроль над поведінкою та може бути адаптований під специфіку вашого протоколу.
Приклад: Spending Limit Plugin
Найпоширеніший кейс — обмежений доступ для операційних витрат. Замість голосування 3/5 за кожен платіж команда встановлює plugin, який дозволяє конкретній адресі витрачати до N USDC на день без multisig.
contract SpendingLimitPlugin is ISafeProtocolPlugin {
struct AllowanceConfig {
uint128 dailyLimit;
uint128 spent;
uint64 resetTimestamp;
}
// safe => token => delegate => config
mapping(address => mapping(address => mapping(address => AllowanceConfig))) public allowances;
function executeSpend(
ISafeProtocolManager manager,
ISafe safe,
address token,
address to,
uint128 amount
) external {
AllowanceConfig storage config = allowances[address(safe)][token][msg.sender];
// скидання денного ліміту
if (block.timestamp >= config.resetTimestamp + 1 days) {
config.spent = 0;
config.resetTimestamp = uint64(block.timestamp);
}
require(config.spent + amount <= config.dailyLimit, "Daily limit exceeded");
config.spent += amount;
// Transfer через Safe без multisig
bytes memory data = abi.encodeCall(IERC20.transfer, (to, amount));
SafeTransaction memory tx = SafeTransaction({
to: token,
value: 0,
data: data,
operation: Enum.Operation.Call
});
(, bytes memory returnData) = manager.executeTransaction(safe, tx);
}
}
Офіційний allowances module від Safe вже реалізує подібну логіку — для стандартних spending limits краще використовувати його. Кастомний plugin потрібен коли потрібна нестандартна логіка: мульти-токенні ліміти, рольова модель, інтеграція з DeFi.
Кастомний Plugin окупається за рахунок зниження витрат на мультисиг-транзакції. Для DAO з 50 платежами на місяць економія на газах може перевищувати $300 — наші клієнти підтверджують це на практиці. Вартість типового Plugin починається від $2500.
Hook: валідація транзакцій перед виконанням
Hook дозволяє додати додаткові перевірки до будь-якої Safe-транзакції:
contract TransactionGuardHook is ISafeProtocolHook {
mapping(address => bool) public blockedAddresses;
function preCheck(
ISafe safe,
SafeTransaction calldata tx,
uint8 executionType,
bytes calldata executionMeta
) external view returns (bytes memory preCheckData) {
// Заборона транзакцій на адреси з blacklist
require(!blockedAddresses[tx.to], "Blocked address");
// Заборона викликів небезпечних функцій
if (tx.data.length >= 4) {
bytes4 selector = bytes4(tx.data[:4]);
require(!blockedSelectors[selector], "Blocked function");
}
return abi.encode(block.timestamp);
}
function postCheck(ISafe safe, bool success, bytes calldata preCheckData) external {
// логіка після виконання
}
}
Типові use cases для Hook: compliance (заборона транзакцій на sanctioned addresses через Chainalysis oracle), budget control (заборона перевищення місячного бюджету), whitelist (тільки pre-approved адреси отримувачів).
Safe{Core} Protocol Manager
У новій архітектурі Plugin не викликає Safe безпосередньо — тільки через SafeProtocolManager. Manager — посередник, який перевіряє, що plugin увімкнений для конкретного Safe і що registry його схвалює.
// Встановлення plugin через multisig Safe транзакцію
function enablePlugin(address plugin, uint8 permissions) external authorized {
ISafeProtocolManager(MANAGER).enablePlugin(plugin, permissions);
}
permissions — бітмаска: EXECUTE_DELEGATECALL (0x01), EXECUTE_CALL (0x02). DelegateCall потрібен обережно — plugin з delegatecall правами виконується в контексті Safe і може змінити його storage.
Етапи розробки кастомного Plugin
| Етап | Тривалість | Результат |
|---|---|---|
| Аналітика та проєктування | 0.5-1 день | Архітектурна документація, специфікація permissions |
| Розробка смарт-контрактів | 2-3 дні | Solidity-код з Foundry тестами, покриття >90% |
| Аудит безпеки | 0.5-1 день | Звіт Slither/Mythril, ручне рев’ю |
| Frontend інтеграція | 1 день | Віджет у Safe{Wallet} через Safe Apps SDK |
| Деплой та верифікація | 0.5 дня | Підписані та верифіковані контракти |
Як встановити Plugin у Safe?
- Підготуйте транзакцію multisig з викликом
enablePlugin(адреса_плагіна, permissions)на вашому Safe. - Підпишіть транзакцію необхідною кількістю власників (наприклад, 3 з 5).
- Виконайте транзакцію. Плагін активовано.
Як перевіряється безпека Plugin перед деплоєм?
Детальний процес тестування
Тести через Foundry з форком mainnet і реальним Safe:
contract SpendingLimitTest is Test {
ISafe safe;
SpendingLimitPlugin plugin;
function setUp() public {
// Fork mainnet
vm.createFork(MAINNET_RPC);
// Deploy Safe через SafeProxyFactory
safe = ISafe(safeFactory.createProxyWithNonce(
SAFE_SINGLETON,
initData,
block.timestamp
));
// Deploy і включити plugin
plugin = new SpendingLimitPlugin();
vm.prank(address(safe));
manager.enablePlugin(address(plugin), 2);
}
function test_SpendWithinLimit() public {
vm.prank(delegate);
plugin.executeSpend(manager, safe, USDC, recipient, 100e6);
assertEq(IERC20(USDC).balanceOf(recipient), 100e6);
}
function testFail_ExceedDailyLimit() public {
vm.prank(delegate);
plugin.executeSpend(manager, safe, USDC, recipient, 10000e6); // > daily limit
}
}
Перед деплоєм ми проводимо статичний аналіз за допомогою Slither та Mythril, а також ручне рев’ю на reentrancy та bypass-уразливості. Для критичних модулів використовуємо формальну верифікацію через Echidna. Safe Protocol Documentation рекомендує завжди тестувати плагіни на форку з реальними даними.
Що входить в роботу
- Аналітика та проєктування архітектури розширення
- Розробка смарт-контрактів на Solidity 0.8.x з використанням Foundry
- Написання unit-тестів та інтеграційних тестів з форком mainnet
- Аудит безпеки (Slither, Mythril, ручне рев’ю)
- Інтеграція з Safe{Wallet} через Safe Apps SDK
- Деплой та верифікація контрактів у блокчейні
- Документація та навчання команди
- Пост-релізна підтримка протягом 30 днів
Процес роботи
Аналітика (0.5-1 день). Визначаємо тип розширення (Plugin/Hook/FunctionHandler), необхідні permissions, інтеграції (DeFi протоколи, oracles, інші модулі).
Розробка (2-3 дні). Контракт plugin, тести на Foundry з mainnet fork. Safe registry інтеграція. Якщо потрібен custom Manager — додатковий день.
Аудит та рев’ю (0.5-1 день). Особлива увага на reentrancy через execTransactionFromModule, на коректність permission перевірок, на неможливість обходу multisig через plugin при небажаних умовах.
Frontend інтеграція (1 день). Safe Apps SDK для відображення plugin інтерфейсу прямо в Safe{Wallet} UI.
Строки та вартість
Строки: від 3 до 14 днів залежно від складності. Вартість типового Plugin починається від $2500. Вартість розраховується індивідуально — після аналізу технічного завдання. Врахуйте, що витрати на багаторазові ручні підписи в Safe можуть становити тисячі доларів на місяць для активних DAO — автоматизація через Plugin окупається за кілька тижнів.
Наші інженери сертифіковані з безпеки смарт-контрактів та мають досвід роботи з найбільшими протоколами. Замовте розробку кастомного Safe Plugin вже сьогодні та отримайте архітектурний план протягом 24 годин. Зв'яжіться з нами для отримання консультації та попередньої оцінки вашого проєкту.







