Разработка PSM (Peg Stability Module)
MakerDAO ввёл PSM в 2020 году как ответ на нестабильность DAI. Идея прямолинейна: разрешить обмен 1 DAI ↔ 1 USDC с минимальной комиссией, создав встроенный арбитражный механизм. Когда DAI торгуется выше $1.00 — арбитражники вносят USDC, получают DAI, продают на рынке. Когда ниже $1.00 — покупают DAI, возвращают в PSM, получают USDC. Peg восстанавливается через рыночное давление без участия команды. Для нового стейблкоина PSM — это не просто удобный модуль, а обязательная инфраструктура, без которой depegging становится вопросом «когда», а не «если».
Математика стабилизации и точки отказа
Как работает арбитражный механизм PSM
Допустим, ваш стейблкоин XUSD торгуется по $1.02 на DEX. PSM предлагает: принеси $1 в USDC, получи 1 XUSD (минус tin — fee on entry, например 0.1%). Арбитражник вносит 1000 USDC, получает 999 XUSD, продаёт их на Uniswap по $1.02, получает $1019.98. Профит $19.98 минус газ. После достаточного количества таких сделок supply XUSD на рынке вырастет, цена снизится к $1.00.
Обратная ситуация: XUSD = $0.98. PSM: принеси 1 XUSD, получи $1 USDC (минус tout — fee on exit). Арбитражник покупает 1000 XUSD за $980 на Uniswap, вносит в PSM, получает $999 USDC. Профит $19 минус газ. XUSD выкупается с рынка, цена поднимается.
Ключевой параметр: debt ceiling PSM. Максимальная сумма, которую можно обменять через модуль. Без потолка PSM может накопить 100% резервов в одном активе (например, USDC) — это концентрирует риск регулятора (Circle может заморозить USDC). MakerDAO на пике держал >50% резервов DAI в USDC через PSM, что привело к пересмотру параметров после угроз регуляторов в 2022-2023.
Атака через несбалансированный PSM
Если tin/tout установлен слишком низко (< 0.01%), PSM превращается в бесплатный арбитражный инструмент, который высасывает резервы при любом рыночном шоке. При XUSD = $0.995 арбитраж становится выгодным при объёме от $50K — MEV-боты включаются автоматически.
Оптимальный диапазон tin/tout для нового стейблкоина на старте: 0.1-0.5%. По мере роста ликвидности — снижение до 0.01-0.1%. Это конфигурируемые параметры, которые governance может изменять через timelock.
Архитектура PSM контракта
Корневые функции модуля
// Вход: пользователь вносит collateral, получает стейблкоин
function sellGem(address usr, uint256 gemAmt) external {
uint256 gemAmt18 = gemAmt * (10 ** (18 - dec)); // нормализация decimals
uint256 daiAmt = gemAmt18; // 1:1 до комиссии
uint256 fee = daiAmt * tin / WAD; // tin в WAD (1e18)
require(dai.balanceOf(address(this)) >= daiAmt - fee, "PSM/insufficient-dai");
vow.bump(fee); // комиссия в казну
gem.transferFrom(msg.sender, address(this), gemAmt);
dai.transfer(usr, daiAmt - fee);
emit SellGem(usr, gemAmt, fee);
}
// Выход: пользователь вносит стейблкоин, получает collateral
function buyGem(address usr, uint256 gemAmt) external {
uint256 gemAmt18 = gemAmt * (10 ** (18 - dec));
uint256 daiAmt = gemAmt18;
uint256 fee = daiAmt * tout / WAD;
require(gem.balanceOf(address(this)) >= gemAmt, "PSM/insufficient-gem");
dai.transferFrom(msg.sender, address(this), daiAmt + fee);
vow.bump(fee);
gem.transfer(usr, gemAmt);
emit BuyGem(usr, gemAmt, fee);
}
Критичный момент: нормализация decimals. USDC имеет 6 decimals, большинство стейблкоинов — 18. Без gemAmt * (10 ** (18 - dec)) арифметика PSM сломается — пользователь получит в 10^12 раз меньше токенов. Это не гипотетика: ошибку decimals делают даже опытные разработчики при работе с нестандартными ERC-20.
Whitelist коллатералей и мультиактивный PSM
Базовый PSM работает с одним collateral. Расширенная версия поддерживает несколько: USDC, USDT, DAI — каждый с собственными параметрами tin/tout и debt ceiling.
Добавление нового collateral через governance: addGem(address gemAddress, uint256 ceiling) с timelock минимум 48 часов. Это предотвращает добавление вредоносного ERC-20 с кастомным transferFrom, который дренирует PSM через reentrancy.
Rate limiter против flash loan атак
Flash loan атака на PSM: занять 10M USDC, вломиться в PSM через sellGem, получить 10M XUSD, продать на рынке, создать искусственное давление на цену, купить XUSD обратно дешевле, вернуть в PSM, вернуть flash loan с прибылью. Для нейтрализации — RateLimiter: максимальный объём операций в PSM за N блоков.
mapping(uint256 => uint256) public volumePerBlock;
uint256 public constant MAX_VOLUME_PER_WINDOW = 1_000_000e18; // 1M стейблкоинов
uint256 public constant WINDOW_BLOCKS = 50; // ~10 минут
function _checkRateLimit(uint256 amount) internal {
uint256 windowStart = block.number - (block.number % WINDOW_BLOCKS);
volumePerBlock[windowStart] += amount;
require(volumePerBlock[windowStart] <= MAX_VOLUME_PER_WINDOW, "PSM/rate-limit");
}
Governance и управление параметрами
PSM без governance — статический инструмент. PSM с governance — живой рыночный механизм. Параметры, которые должны быть в governance:
| Параметр | Описание | Рекомендуемый timelock |
|---|---|---|
tin |
Fee on entry | 24 часа |
tout |
Fee on exit | 24 часа |
line (debt ceiling) |
Макс. объём | 48 часов |
addGem |
Новый коллатераль | 72 часа |
pause |
Остановка PSM | 0 (экстренная) |
Для новых протоколов рекомендуем Gnosis Safe + TimelockController OpenZeppelin. Pause — единственная операция без timelock, но требует мультисиг (минимум 3/5).
Процесс работы
Аналитика и моделирование (2-3 дня). Python-скрипт моделирует поведение PSM при разных сценариях волатильности: peg deviation 1%, 3%, 5%, flash crash. Подбираем оптимальные tin/tout и debt ceiling. Анализируем ликвидность целевого стейблкоина на DEX — от этого зависит минимальный размер PSM.
Разработка (4-6 дней). Core PSM контракт, RateLimiter, мультиактивная поддержка если нужна, governance интеграция. Foundry тесты: unit тесты для всех функций, fuzz-тесты на граничные значения decimals и amount, fork-тесты с реальными USDC/USDT.
Аудит (2-3 дня). Slither, ручной review decimals handling и overflow/underflow (critical для Solidity < 0.8.0; в 0.8+ SafeMath built-in, но кастомные unchecked блоки требуют внимания).
Деплой (1-2 дня). Testnet сначала, mainnet через multisig с верификацией.
Базовый PSM с одним collateral — 1-1.5 недели. С мультиактивной поддержкой, governance и дашбордом — 2-3 недели. Стоимость рассчитывается индивидуально после анализа токеномики.







