Розробка PSM (Peg Stability Module)

Проєктуємо та розробляємо блокчейн-рішення повного циклу: від архітектури смарт-контрактів до запуску DeFi-протоколів, NFT-маркетплейсів та криптобірж. Аудит безпеки, токеноміка, інтеграція з наявною інфраструктурою.
Показано 1 з 1Усі 1306 послуг
Розробка PSM (Peg Stability Module)
Складний
~1-2 тижні
Часті запитання

Напрямки блокчейн-розробки

Етапи блокчейн-розробки

Останні роботи

  • image_website-b2b-advance_0.webp
    Розробка сайту компанії B2B ADVANCE
    1285
  • image_web-applications_feedme_466_0.webp
    Розробка веб-додатків для компанії FEEDME
    1198
  • image_websites_belfingroup_462_0.webp
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    902
  • image_ecommerce_furnoro_435_0.webp
    Розробка інтернет магазину для компанії FURNORO
    1119
  • image_logo-advance_0.webp
    Розробка логотипу компанії B2B Advance
    587
  • image_crm_enviok_479_0.webp
    Розробка веб-додатків для компанії Enviok
    853

Розробка 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 мінус газ. Після достатньої кількості таких торгів обсяг 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-of-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 (критично для Solidity < 0.8.0; у 0.8+ SafeMath built-in, але кастомні unchecked блоки потребують уваги).

Деплой (1–2 дня). Testnet спочатку, mainnet через multisig з верифікацією.

Базовий PSM з одним collateral — 1–1.5 тижні. З мультиактивною підтримкою, governance та дашбордом — 2–3 тижні. Вартість розраховується індивідуально після аналізу токеномики.