Інтеграція Sablier для лінійних виплат та вестингу

Інтеграція з Sablier для лінійних виплат та вестингу Розрахунок `vestedAmount` через `block.timestamp` — класична пастка при саморобному вестингу. В момент відправки транзакції користувач бачить одну суму, а при включенні в блок через 30 секунд — іншу. Різниця може становити до 5% від суми — при

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

Часті запитання

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

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

Інтеграція з 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 місяців після здачі.

Процес роботи та терміни

  1. Аналіз — розбираємо вашу логіку вестингу та токеноміку, підбираємо тип стріму (linear або dynamic).
  2. Проєктування — проєктуємо смарт-контракти-обгортки (якщо потрібні), визначаємо параметри безпеки (cancelable, transferable).
  3. Реалізація — пишемо контракти з використанням Sablier SDK з важким тестуванням (foundry, echidna fuzzing).
  4. Інтерфейс — підключаємо Sablier subgraph, реалізуємо прогресс-бари та дії (withdraw/cancel) через viem або ethers.js.
  5. Деплой — мультимережевий деплой з верифікацією на Etherscan. Sablier v2 задеплоєно на Ethereum mainnet, Arbitrum, Optimism, Polygon, Avalanche, BNB Chain, Base, Gnosis. Адреси контрактів стабільні.
  6. Підтримка — передаємо документацію, вихідники, скрипти деплою. Гарантуємо виправлення багів протягом 48 годин.

Базова інтеграція (створення стрімів з контракту + UI перегляд) — 3-4 дні. Повноцінний інтерфейс з керуванням, візуалізацією та мультимережевою підтримкою — 5-7 днів. Вартість розраховується індивідуально.

Чому варто обрати Sablier замість кастомного контракту?

Sablier v2 пройшов аудит Trail of Bits та Quantstamp, що гарантує відсутність критичних уразливостей.

Критерій Sablier v2 Кастомний контракт
Аудит Trail of Bits та Quantstamp Часто без формальної верифікації
Риск реентерансі Відсутній (детермінована математика) Високий при неакуратній реалізації
Гнучкість Linear та dynamic потоки, cliff Вимагає переписування коду
Підтримка мереж 8+ мереж з єдиним інтерфейсом Кожна мережа — окремий деплой
Газ (створення потоку) 200k gas ($0.5 при поточному газі) 300k+ gas ($1.2)
Економія на аудиті Вбудовано в протокол Потрібен окремий аудит ($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 — ми проведемо аудит вашої логіки та запропонуємо оптимальне рішення. Отримайте консультацію по вашому кейсу — зв'яжіться з нами.