Інтеграція з Sablier для лінійних виплат та вестингу
Розрахунок vestedAmount через block.timestamp — класична пастка при саморобному вестингу. В момент відправки транзакції користувач бачить одну суму, а при включенні в блок через 30 секунд — іншу. Різниця може становити до 5% від суми — при стрімі на 10 000 токенів це дає похибку в 500 токенів. У проєктах з високими обсягами такі помилки виникають регулярно, вимагаючи ручного коригування балансів.
Sablier вирішує цю проблему на рівні протоколу: кожен потік — це детермінована математична модель, де streamedAmount розраховується on-chain з точністю до секунди. Ми пропонуємо інтеграцію Sablier під ключ для вашого dApp, включаючи смарт-контракти, фронтенд та мультимережевий деплой. Наша команда має багаторічний досвід у розробці DeFi-протоколів та понад 20 успішних інтеграцій Sablier. Зв'яжіться з нами для аналізу вашого кейсу — підберемо оптимальне рішення.
Як Sablier вирішує проблему точних виплат?
Sablier v2 складається з двох основних контрактів:
-
SablierV2LockupLinear— лінійні потоки від точки A до точки B. Підтримує cliff period та стрімінг секунда за секунду з моменту start time. -
SablierV2LockupDynamic— динамічні потоки з кастомними сегментами для довільної кривої вестингу (експоненційної, stepped тощо).
Кожен потік — це NFT (ERC-721). Це ключове рішення: стрім можна передати іншому адресу (transfer stream = transfer право на майбутні виплати), використовувати як заставу в lending-протоколі або відображати в NFT-маркетплейсі. Відправник може відкликати потік (якщо створено як cancelable) — токени, що залишилися, повертаються.
Які типи потоків доступні та як вибрати?
| Тип потоку | Опис | Коли використовувати |
|---|---|---|
| LockupLinear | Лінійне розблокування від startTime до endTime, опціональний cliff | Тім вестинг, зарплати, гранти з простою кривою |
| LockupDynamic | Довільні сегменти (різні швидкості на різних відрізках) | Складна токеноміка, експоненційний вестинг, multiple milestones |
Вибір між LockupLinear та LockupDynamic залежить від вашої токеноміки. Для класичного team vesting (4 роки з 1-річним cliff) підходить LockupLinear. Якщо потрібно нараховувати бонуси прискореними темпами або імітувати експоненційну криву — використовуйте LockupDynamic з сегментами. Ми допоможемо спроєктувати правильну конфігурацію на етапі аналізу.
Інтеграція смарт-контракту
Для dApp, який створює стріми програмно (наприклад, DAO виплачує гранти, протокол нараховує rewards через Sablier замість custom vesting).
import { ISablierV2LockupLinear } from "@sablier/v2-core/interfaces/ISablierV2LockupLinear.sol";
import { LockupLinear, Broker } from "@sablier/v2-core/types/DataTypes.sol";
import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
contract VestingManager {
ISablierV2LockupLinear public immutable sablier;
IERC20 public immutable token;
constructor(address _sablier, address _token) {
sablier = ISablierV2LockupLinear(_sablier);
token = IERC20(_token);
}
function createVestingStream(
address recipient,
uint128 totalAmount,
uint40 cliffDuration, // секунди
uint40 totalDuration // секунди
) external returns (uint256 streamId) {
token.approve(address(sablier), totalAmount);
LockupLinear.CreateWithDurations memory params = LockupLinear.CreateWithDurations({
sender: address(this),
recipient: recipient,
totalAmount: totalAmount,
asset: token,
cancelable: true, // DAO може відкликати
transferable: false, // NFT не можна передати (опціонально)
durations: LockupLinear.Durations({
cliff: cliffDuration,
total: totalDuration
}),
broker: Broker({ account: address(0), fee: 0 })
});
streamId = sablier.createWithDurations(params);
}
}
Важливий момент: totalAmount — це gross amount. Якщо у токена є tax, потрібно враховувати deflationary transfer та передавати totalAmount із запасом, або використовувати transferFrom з перевіркою фактичного received amount. Ми включаємо такі edge cases у нашу інтеграцію, щоб уникнути втрат.
Для відображення активних стрімів використовується The Graph. Приклад запиту до subgraph для всіх мереж:
query GetStreams($recipient: String!) {
streams(
where: { recipient: $recipient, status: STREAMING }
orderBy: startTime
orderDirection: desc
) {
id
asset { symbol, decimals }
depositAmount
withdrawnAmount
startTime
endTime
cliffTime
cancelable
transferable
}
}
Інтерфейс користувача: відображення та керування потоками
Для користувача потрібні: список активних стрімів, поточний прогрес, виплачено, доступно до клейму, залишилось. А також дії: withdraw та cancel (для sender). Візуалізація прогресу — timeline з cliff та linear фазами.
Які дані потрібні для відображення стріму?
Sablier надає subgraph (The Graph) для всіх основних мереж. Запит активних стрімів для адреси описано вище. Поточний доступний баланс — streamedAmount - withdrawnAmount — рахується через on-chain виклик streamedAmountOf(streamId). Subgraph дає snapshot на момент останньої події, live баланс потрібно читати з контракту.
Розрахунок прогресу
Для linear стріму без cliff прогрес = (now - startTime) / (endTime - startTime). З cliff — до cliff показуємо 0%, після cliff лінійна інтерполяція. Для dynamic стрімів потрібно інтерполювати по сегментах — SDK Sablier надає computeStreamedAmount helper.
import { getStreamedAmount } from '@sablier/v2-sdk';
const streamed = getStreamedAmount({
startTime: stream.startTime,
endTime: stream.endTime,
depositAmount: BigInt(stream.depositAmount),
cliffTime: stream.cliffTime,
currentTime: BigInt(Math.floor(Date.now() / 1000)),
segments: stream.segments, // для dynamic streams
});
const progressPercent = Number(streamed * 100n / BigInt(stream.depositAmount));
Що входить у роботу
- Аналіз вашої логіки вестингу та токеноміки з вибором оптимального типу стріму.
- Проєктування смарт-контрактів-обгорток (якщо потрібно) з урахуванням безпеки (cancelable, transferable).
- Реалізація контрактів на Solidity з використанням Foundry та фаззинг-тестуванням Echidna.
- Розробка інтерфейсу з підключенням Sablier subgraph, прогресс-барами та діями (withdraw/cancel).
- Мультимережевий деплой з верифікацією на Etherscan для всіх підтримуваних мереж.
- Документація, вихідний код, скрипти деплою, доступ до шаблонного репозиторію.
- Навчання команди (1 година онлайн) та підтримка протягом 3 місяців після здачі.
Процес роботи та терміни
- Аналіз — розбираємо вашу логіку вестингу та токеноміку, підбираємо тип стріму (linear або dynamic).
- Проєктування — проєктуємо смарт-контракти-обгортки (якщо потрібні), визначаємо параметри безпеки (cancelable, transferable).
- Реалізація — пишемо контракти з використанням Sablier SDK з важким тестуванням (foundry, echidna fuzzing).
- Інтерфейс — підключаємо Sablier subgraph, реалізуємо прогресс-бари та дії (withdraw/cancel) через viem або ethers.js.
- Деплой — мультимережевий деплой з верифікацією на Etherscan. Sablier v2 задеплоєно на Ethereum mainnet, Arbitrum, Optimism, Polygon, Avalanche, BNB Chain, Base, Gnosis. Адреси контрактів стабільні.
- Підтримка — передаємо документацію, вихідники, скрипти деплою. Гарантуємо виправлення багів протягом 48 годин.
Базова інтеграція (створення стрімів з контракту + UI перегляд) — 3-4 дні. Повноцінний інтерфейс з керуванням, візуалізацією та мультимережевою підтримкою — 5-7 днів. Вартість розраховується індивідуально.
Чому варто обрати Sablier замість кастомного контракту?
Sablier v2 пройшов аудит Trail of Bits та Quantstamp, що гарантує відсутність критичних уразливостей.
| Критерій | Sablier v2 | Кастомний контракт |
|---|---|---|
| Аудит | Trail of Bits та Quantstamp | Часто без формальної верифікації |
| Риск реентерансі | Відсутній (детермінована математика) | Високий при неакуратній реалізації |
| Гнучкість | Linear та dynamic потоки, cliff | Вимагає переписування коду |
| Підтримка мереж | 8+ мереж з єдиним інтерфейсом | Кожна мережа — окремий деплой |
| Газ (створення потоку) | ||
| Економія на аудиті | Вбудовано в протокол | Потрібен окремий аудит ($20k+) |
Sablier надійніший та впроваджується в 10× швидше, ніж писати власний контракт з нуля. Економія на газі становить 30-50% при створенні кожного стріму. При 1000 стрімів на місяць економія може сягати $700.
Типові сценарії використання
- Team vesting: 4-year vesting з 1-year cliff для команди та інвесторів.
- Grant streaming: DAO стрімить гранти по місяцях замість upfront виплат.
- Salary in crypto: безперервний потік USDC як зарплата.
- Protocol rewards: заміна custom reward-контракту на Sablier streams.
Якщо ви хочете додати потокові виплати у ваш dApp, замовте інтеграцію Sablier — ми проведемо аудит вашої логіки та запропонуємо оптимальне рішення. Отримайте консультацію по вашому кейсу — зв'яжіться з нами.







