Разработка Safe{Wallet} Plugin
Представьте: ваша DAO управляет казной в $10M через Safe, но каждый мелкий платёж требует голосования 3/5 подписей. Это медленно и дорого — каждая транзакция может занимать часы и стоить сотни долларов в газах и времени. Наша команда разработчиков Safe Plugin решает эту проблему, давая возможность выполнять рутинные операции без мультисига, экономя до $500 на операционных расходах ежемесячно.
Safe (бывший Gnosis Safe) — стандарт де-факто для мультисиг-хранения средств в Web3. $100B+ TVL, тысячи DAO и протоколов. Но базовая функциональность Safe — это только multisig. Plugins (ранее Modules) расширяют его до полноценной программируемой казны: автоматические платежи, ролевой доступ, DeFi-интеграции, spending limits без отдельного multisig голосования.
Мы разрабатываем кастомные Safe Plugin под ключ — от архитектуры до деплоя и интеграции в Safe{Wallet}. Наш опыт включает 10+ проектов на Ethereum, Polygon и Arbitrum. Оценим вашу задачу за 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 для автоматического ребаланса пула, ролевая модель с разными уровнями доступа. В таких случаях кастомный 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 — наши клиенты подтверждают это на практике.
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 перед деплоем?
Подробный процесс тестирования
Тесты через 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
}
}
</details>
Перед деплоем мы проводим статический анализ с помощью Slither и Mythril, а также ручное ревью на reentrancy и bypass-уязвимости. Для критичных модулей используем формальную верификацию через Echidna. <cite>Safe Protocol Documentation</cite> рекомендует всегда тестировать плагины на форке с реальными данными.
### Что входит в работу
- Аналитика и проектирование архитектуры расширения
- Разработка смарт-контрактов на 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 дней в зависимости от сложности. Стоимость рассчитывается индивидуально — после анализа технического задания. Учтите, что затраты на многократные ручные подписи в Safe могут составлять тысячи долларов в месяц для активных DAO — автоматизация через Plugin окупается за несколько недель.
Наши инженеры сертифицированы по безопасности смарт-контрактов и имеют опыт работы с крупнейшими протоколами. Закажите разработку кастомного Safe Plugin уже сегодня и получите архитектурный план в течение 24 часов. Свяжитесь с нами для получения консультации и предварительной оценки вашего проекта.







