Розробка скарбниці DAO
Ми розробляємо скарбниці DAO, які витримують ведмежий ринок та governance атаки. Один відомий протокол втратив 35% вартості treasury через концентрацію 80% активів у нативному токені під час спаду — наша мета запобігти таким сценаріям. Оптимізація диверсифікації може заощадити протоколу від $500k до $2M на рік при ринковій волатильності. Але справа не лише в диверсифікації: атаки через governance, flash loan маніпуляції та помилки в конфігурації мультипідпису — реальні загрози, які ми усуваємо на етапі архітектури.
Правильна архітектура починається з розділення скарбниці на рівні доступу і закінчується автоматизацією виконання через streaming. Нижче — конкретні рішення: багаторівнева архітектура, смарт-контракти з timelock та streaming, моніторинг KPI. Ми впроваджуємо ці компоненти в кожному проєкті, адаптуючи під специфіку DAO. Отримайте консультацію з архітектури treasury прямо зараз — це безкоштовно.
Багаторівнева архітектура treasury
Скарбниця DAO складається з кількох рівнів з різними правами доступу:
Рівень 1: Core Treasury (Gnosis Safe + Governor)
Основне сховище активів керується через on-chain governance. Будь-яка витрата вимагає повний governance цикл: proposal → voting → timelock → execution. TimelockController — обов'язковий посередник. Gnosis Safe тут — останнє сховище, а не керуючий інструмент. Це важливо: Safe не повинен бути signers-managed для основних коштів.
Governance Governor ──propose──► TimelockController ──execute──► Gnosis Safe
▲ (48h delay) │
│ ▼
Token holders Treasury assets
Рівень 2: Operational Budget (Sub-DAO Safe)
Окремий Gnosis Safe для операційних витрат з лімітом. Керується core team з 3/5 multisig. Поповнюється з Core Treasury через governance proposal раз на квартал.
Рівень 3: Streaming Payments (Sablier / Superfluid)
Зарплати та гранти через token streaming — контриб'ютори отримують безперервний потік токенів, який можна зупинити в будь-який момент. Не потрібно ручних виплат. Streaming payments через Sablier кращі за ручні виплати — вони знижують операційне навантаження та виключають затримки. Наприклад, DAO з командою з 20 осіб економить до $200k на рік на операційних витратах.
Чому streaming payments кращі за ручні виплати?
Ручні виплати вимагають постійної уваги від treasury manager: підпис кожної транзакції, облік, можливі затримки. Streaming через Sablier V2 автоматизує процес: кошти йдуть рівномірно, а відміна відбувається миттєво. Це особливо важливо для DAO з розподіленою командою — контриб'ютор бачить надходження токенів у реальному часі і не залежить від людського фактора.
Смарт-контракти treasury
Treasury Controller
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
import "@openzeppelin/contracts/governance/TimelockController.sol";
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
import "@openzeppelin/contracts/access/AccessControl.sol";
contract DAOTreasury is AccessControl {
using SafeERC20 for IERC20;
bytes32 public constant GOVERNOR_ROLE = keccak256("GOVERNOR_ROLE");
bytes32 public constant OPERATOR_ROLE = keccak256("OPERATOR_ROLE");
mapping(address => uint256) public monthlySpendLimit;
mapping(address => mapping(uint256 => uint256)) public monthlySpent;
event FundsDisbursed(address indexed token, address indexed recipient, uint256 amount, string reason);
event AllocationUpdated(address indexed token, uint256 amount, string strategy);
constructor(address _governor, address _operator) {
_grantRole(DEFAULT_ADMIN_ROLE, _governor);
_grantRole(GOVERNOR_ROLE, _governor);
_grantRole(OPERATOR_ROLE, _operator);
}
function disburse(
address token,
address recipient,
uint256 amount,
string calldata reason
) external onlyRole(GOVERNOR_ROLE) {
IERC20(token).safeTransfer(recipient, amount);
emit FundsDisbursed(token, recipient, amount, reason);
}
function operationalDisburse(
address token,
address recipient,
uint256 amount
) external onlyRole(OPERATOR_ROLE) {
uint256 currentMonth = block.timestamp / 30 days;
uint256 spent = monthlySpent[token][currentMonth];
require(spent + amount <= monthlySpendLimit[token], "Monthly limit exceeded");
monthlySpent[token][currentMonth] = spent + amount;
IERC20(token).safeTransfer(recipient, amount);
emit FundsDisbursed(token, recipient, amount, "operational");
}
function setMonthlyLimit(address token, uint256 limit)
external
onlyRole(GOVERNOR_ROLE)
{
monthlySpendLimit[token] = limit;
}
receive() external payable {}
}
Budget Streams через Sablier V2
import { ISablierV2LockupLinear } from "@sablier/v2-core/interfaces/ISablierV2LockupLinear.sol";
import { LockupLinear, Broker } from "@sablier/v2-core/types/DataTypes.sol";
contract TreasuryStreaming {
ISablierV2LockupLinear public immutable sablier;
IERC20 public immutable daoToken;
function createContributorStream(
address contributor,
uint128 totalAmount,
uint40 startTime,
uint40 endTime,
uint40 cliffDuration,
bool cancelable
) external returns (uint256 streamId) {
daoToken.approve(address(sablier), totalAmount);
LockupLinear.CreateWithDurations memory params = LockupLinear.CreateWithDurations({
sender: address(this),
recipient: contributor,
totalAmount: totalAmount,
asset: daoToken,
cancelable: cancelable,
transferable: false,
durations: LockupLinear.Durations({
cliff: cliffDuration,
total: endTime - startTime
}),
broker: Broker(address(0), ud60x18(0))
});
streamId = sablier.createWithDurations(params);
}
function cancelStream(uint256 streamId) external {
sablier.cancel(streamId);
}
}
Як забезпечити диверсифікацію treasury?
Зберігати більшу частину активів у нативному токені — стандартна помилка молодих DAO. При ведмежому ринку така скарбниця втрачає купівельну спроможність. Рекомендована структура:
| Актив | Частка | Обґрунтування |
|---|---|---|
| Stablecoins (USDC, DAI) | 40-50% | Операційні витрати, runway |
| ETH | 20-30% | Ліквідний резерв, yield через staking |
| Нативний токен | 20-30% | Governance, incentives |
| Diversified DeFi (wBTC) | 0-10% | Опціонально |
Yield на stablecoin частину
Idle stablecoins — упущений yield. Популярні стратегії: Aave/Compound (lending, 3-8% APY на USDC), Maker DSR, Yearn Finance. Кожна зміна стратегії повинна проходити через governance proposal.
Моніторинг та аналітика
interface TreasurySnapshot {
timestamp: number;
assets: { token: string; balance: bigint; usdValue: number }[];
totalUsdValue: number;
runwayMonths: number;
}
async function getTreasurySnapshot(
provider: ethers.Provider,
treasuryAddress: string,
tokenList: string[]
): Promise<TreasurySnapshot> {
const assets = await Promise.all(
tokenList.map(async (token) => {
const contract = new ethers.Contract(token, ERC20_ABI, provider);
const balance = await contract.balanceOf(treasuryAddress);
const price = await getTokenPrice(token);
return { token, balance, usdValue: Number(ethers.formatEther(balance)) * price };
})
);
const totalUsdValue = assets.reduce((sum, a) => sum + a.usdValue, 0);
const monthlyBurn = await getMonthlyBurnRate();
return { timestamp: Date.now(), assets, totalUsdValue, runwayMonths: totalUsdValue / monthlyBurn };
}
KPI дашборда
| Метрика | Ціль | Алерт |
|---|---|---|
| Runway | > 24 місяці | < 12 місяців |
| Stable ratio | > 40% | < 25% |
| Monthly burn | Відомий та узгоджений | +20% перевищення |
| Yield APY | > 4% на стейбли | < 2% |
| Token concentration | < 40% | > 60% |
Чому timelock критичний для безпеки?
Proposal threshold — створення proposal на виведення коштів вимагає stake (1%+ supply). Інакше атакуючий з невеликою кількістю токенів може проштовхнути шкідливий proposal.
Timelock — обов'язкова затримка перед виконанням. Мінімум 48 годин, для великих сум — 7 днів. Це дає спільноті час зреагувати.
Spending caps — навіть через governance не можна виводити більше певного відсотка treasury за один proposal. Великі витрати розбиваються на частини.
Veto mechanism — Security Council (4/7 мультипідпис) має право вето на governance рішення протягом timelock. Використовується тільки для явно шкідливих proposals.
contract TreasuryGuardian {
address public immutable securityCouncil;
TimelockController public immutable timelock;
function vetoOperation(bytes32 operationId) external {
require(msg.sender == securityCouncil, "Not security council");
timelock.cancel(operationId);
emit OperationVetoed(operationId);
}
}
Процес роботи
- Аналітика — аудит поточної структури treasury та ризиків.
- Проєктування — архітектура рівнів, вибір інструментів.
- Реалізація — розгортання смарт-контрактів та налаштування Gnosis Safe.
- Тестування — внутрішній аудит та симуляція атак з використанням fuzzing (Echidna) для пошуку рідкісних багів.
- Деплой та навчання — запуск в mainnet та навчання команди.
Зв'яжіться з нами для обговорення вашого DAO та отримайте попередню оцінку архітектури.
Що входить в нашу роботу?
- Архітектурна документація та схема рівнів treasury.
- Розгортання та налаштування смарт-контрактів (Treasury Controller, Streaming через Sablier).
- Конфігурація Gnosis Safe з multisig та timelock.
- Інтеграція моніторингу та дашборда KPI.
- Навчання команди безпечному управлінню.
- Місяць технічної підтримки після запуску.
Наша команда має багаторічний досвід у блокчейн-розробці, реалізувала понад 20 проєктів DAO та сертифікована за Solidity (OpenZeppelin, Consensys). Гарантуємо безпеку та прозорість архітектури — всі контракти проходять внутрішній аудит.
Отримайте консультацію з архітектури treasury вже сьогодні. Зв'яжіться з нами для оцінки вашого проєкту — терміни від 3 до 8 тижнів залежно від складності.







