Разработка системы стриминговых платежей (Superfluid, Sablier)
Стриминг платежей — это непрерывный поток криптовалюты по времени: получатель может в любой момент снять уже "заработанные" токены, не дожидаясь конца периода. Вместо ежемесячной выплаты зарплаты — поток, который течёт по секунде. Технически это реализуется по-разному в Superfluid и Sablier, и выбор между ними определяет архитектуру всей системы.
Superfluid vs Sablier: принципиальная разница
Superfluid: real-time balance без on-chain транзакций
Superfluid использует концепцию Super Token — ERC-20-совместимый токен с расширенной механикой. Баланс Super Token пересчитывается в реальном времени без отдельных транзакций: balance(t) = initialBalance + flowRate * (t - startTime).
Создание потока — одна транзакция. После этого баланс получателя растёт непрерывно, и никаких дополнительных транзакций для обновления баланса не нужно. Это главное преимущество: gas только на создание и закрытие потока.
Обёртка токена в Super Token: USDCx — это Super Token для USDC. Wrap/unwrap через ISuperToken.upgrade(amount) и downgrade(amount). Для работы с нативным ETH — ETHx через нативную обёртку в Superfluid.
Критический момент с liquidation. Superfluid требует поддержания депозита (buffer) у отправителя. Если баланс отправителя падает до нуля — поток становится "критическим". Любой может вызвать deleteFlow и получить liquidation bonus из буфера. Если никто не вызывает — поток продолжается и sender уходит в долг (Patrician Period). Это нужно учитывать в UI: предупреждение о низком балансе и автоматический top-up.
Sablier: линейные потоки с flexible vesting
Sablier v2 (контракты SablierV2LockupLinear, SablierV2LockupDynamic) — это NFT-стримы. Каждый поток токенизирован как ERC-721, что позволяет передавать его, использовать как collateral.
LockupLinear — линейный поток от start до end. LockupDynamic — кастомный график с сегментами (cliff + linear, exponential, etc). Для vesting с cliff: первые 12 месяцев ничего, затем линейный поток 24 месяца — это два сегмента в LockupDynamic.
// Создание потока в Sablier v2
ISablierV2LockupLinear.CreateWithRange({
asset: IERC20(USDC),
sender: msg.sender,
recipient: employee,
totalAmount: 120_000e6, // 120k USDC
range: ISablierV2LockupLinear.Range({
start: uint40(block.timestamp),
cliff: uint40(block.timestamp + 365 days),
end: uint40(block.timestamp + 3 * 365 days)
}),
cancelable: true,
transferable: true
})
Sablier не требует депозита и нет liquidation риска. Весь totalAmount блокируется в контракте при создании потока. Получатель забирает accumulated amount через withdraw(). Gas на каждый withdraw — это trade-off vs Superfluid.
Выбор протокола под задачу
| Параметр | Superfluid | Sablier v2 |
|---|---|---|
| Gas на создание потока | Низкий | Средний |
| Gas на получение токенов | Нет (realtime balance) | Есть (withdraw транзакция) |
| Liquidation риск | Да (buffer system) | Нет |
| Поток как NFT | Нет | Да |
| Vesting с cliff | Через конфигурацию | Нативно |
| Подходит для | Зарплаты, подписки | Vesting, grants |
Superfluid — для регулярных выплат (зарплаты, стриминговые подписки, DCA), где отправитель держит активный баланс. Integrations с Gelato для автоматического top-up.
Sablier — для vesting, grants, односторонних выплат с фиксированной суммой. NFT-позиция позволяет интегрировать вторичный рынок.
Интеграция в продукт
Superfluid интеграция
SDK: @superfluid-finance/sdk-core. Основные операции через Framework:
import { Framework } from '@superfluid-finance/sdk-core'
const sf = await Framework.create({ chainId: 137, provider })
const usdc_x = await sf.loadSuperToken('USDCx')
const createFlowOp = usdc_x.createFlow({
sender: senderAddress,
receiver: receiverAddress,
flowRate: '3858024691358024' // ~10k USDC/month в wei/sec
})
await createFlowOp.exec(signer)
flowRate в wei/second: для $10,000/month = 10000 * 1e6 / (30 * 24 * 3600) = 3858 wei USDC/sec.
Для мониторинга потоков — Superfluid Subgraph (The Graph):
query {
streams(where: { receiver: "0x..." }) {
currentFlowRate
streamedUntilUpdatedAt
}
}
Sablier интеграция
SDK: @sablier/v2-sdk или прямые вызовы контрактов через ethers.js/viem. Адреса контрактов для каждого чейна в документации.
Перед созданием потока нужен approve ERC-20 токена: token.approve(sablierAddress, totalAmount).
После approve — создание потока, получение streamId. Этот ID нужен для всех дальнейших операций: withdraw, cancel, transferFrom.
Поддерживаемые чейны
Superfluid: Ethereum, Polygon, Arbitrum, Optimism, Base, BNB Chain, Avalanche, Gnosis.
Sablier v2: Ethereum, Arbitrum, Optimism, Base, Polygon, BNB Chain, Avalanche, Blast.
Если чейн клиента не поддерживается — есть вариант с собственной реализацией базовой streaming логики, хотя это значительно дороже и требует аудита.
Процесс разработки
Выбор протокола (1 день). Анализируем use case: разовые vesting потоки или постоянные выплаты, важен ли liquidation риск, нужна ли tradeable позиция.
Интеграция (2-3 дня). SDK + смарт-контракт если нужна кастомная логика (например, распределение на несколько получателей из одного источника).
UI (1-2 дня). Dashboard с текущими потоками, балансами, управлением. wagmi/viem для on-chain чтения.
Тесты и деплой (1 день). Fork-тесты на mainnet. Деплой на тестнет, затем mainnet.
Ориентиры по срокам
Интеграция Superfluid или Sablier в существующий продукт — 3-5 дней. Создание системы управления потоками с UI (создание/отмена/мониторинг) — до 2 недель.







