Создание рынка на LlamaLend
В этом гайде мы последовательно пройдём путь запуска рынка на Curve LlamaLend: выбор пула, настройка ценового оракула, подбор параметров кредитования и подключение гейджа для CRV-вознаграждений. Материал дополняет предыдущий гайд по подбору параметров и позволит самостоятельно интегрировать любой токен в экосистему Curve.
1. Подготовка и требования
В предыдущей части "Подбор оптимальных параметров для создания рынков на LlamaLend" мы подробно разобрали как провести симуляции на исторических данных. Важно использовать подходящие параметры для каждого рынка иначе высок риск массовых ликвидаций при резких движениях цены внутри диапазона мягкой ликвидации.
Давайте пройдемся по требованиям для создания нового рынка:
1. Пул для вашего актива на CURVE желательно в паре с crvUSD (если без crvUSD потребуется деплоить отдельный контракт оракула)
2. Глубокая ликвидность ончеин/офчеин достаточная для постепенной ликвидации и деликвидации всех займов.
3. Если не вся ликвидность находится в подключаемом пуле нужно обеспечить и проследить, чтобы был быстрый арбитраж между вашим пулом Curve и другими торговыми площадками.
2. Создание пула Curve
Для создания рынка LlamaLend нужен честный и устойчивый к манипуляциям оракул цены. Идеальное решение – пул Curve с вашим токеном.
- Cryptoswap Two Asset NG Pool – для двух волатильных активов (например, crvUSD/ваш_токен)
- Cryptoswap Three Asset NG Pool – для трех активов (например, crvUSD/WETH/ваш_токен)
- Stableswap NG Pool – для стабильных активов (например, crvUSD/ваш_стейбл)
Важно: Суффикс "NG" (Next Generation) указывает на наличие встроенного оракула EMA.
Если нужного пула нет, создайте его через официальный интерфейс Curve или по гайду в разделе Создание пулов.
Внимание: Если ваш актив торгуется не напрямую к crvUSD, потребуется кастомный оракул (см. создание оракула).
3. Развёртывание рынка через OneWay Lending Factory
OneWay Lending Factory развернет все контракты, необходимые для функционирования рынка одной транзакцией через метод create_from_pool или create
. После чего новый рынок автоматически добавится в пользовательский интерфейс Curve LlamaLend. Адреса фабрик:
Ethereum: 0xeA6876DDE9e3467564acBeE1Ed5bac88783205E0#writeContract
Arbitrum: 0xcaEC110C784c9DF37240a8Ce096D352A75922DeA#writeContract
Fraxtal: 0xf3c9bdab17b7016fbe3b77d17b1602a7db93ac66#writeContract
Optimism: 0x5ea8f3d674c70b020586933a0a5b250734798bef#writeContract
Sonic: 0x30d1859dad5a52ae03b6e259d1b48c4b12933993#writeContract
Выбор метода:
- Если у вас есть пул с crvUSD: используйте метод
create_from_pool
- Если у вас кастомный оракул: используйте метод
create
Как видно, для каждого из методов существует несколько вариаций, отличающихся количеством опций. Методы с меньшим числом опций задают отсутствующие значения по умолчанию.
Метод create_from_pool: для рынка с пулом в паре к crvUSD
Подходит если у вас есть пул Curve (например, crvUSD/ваш токен), поддерживающий оракул (stableswap-ng, twocrypto-ng, tricrypto-ng).
borrowed_token (address)
- адрес токена займа (обычно crvUSD)collateral_token (address)
- адрес токена обеспеченияA (uint256)
- ширина диапазона (обычно 10–30, чем волатильнее актив, тем ниже)fee (uint256)
- комиссия AMM, в формате 10¹⁸ (например, 0.06% = 6000000000000000)loan_discount (uint256)
- дисконт для расчета максимального LTV (например, 11% = 110000000000000000)liquidation_discount (uint256)
- дисконт для расчета ликвидации (например, 8% = 80000000000000000)pool (address)
- адрес Curve-пула-оракула (пул обязательно должен содержать оба токена: залоговый и заемный)name (string)
- название рынка (строка)min_borrow_rate (uint256)
- минимальная ставка займа (rate/sec, рассчитывается как ставка в секунду, например, 1% APR = 317097919)man_borrow_rate (uint256)
- максимальная ставка займа (rate/sec, рассчитывается как ставка в секунду, например, 80% APR = 25367833587)
Все числовые значения кроме A
нужно перевести в формат wei 10¹⁸
Параметры А
, fee
, loan_discount
и liquidation_discount
нужно подбирать проводя симуляции на исторических данных, читайте: "Подбор оптимальных параметров для создания рынков на LlamaLend".
Подбор min_borrow_rate
и man_borrow_rate
Ставки займа рассчитываются в зависимости от показателя утилизации. Чем выше утилизация тем выше ставка займа; снижение утилизации, соответственно снижает ставку. Можно предварительно рассчитать проценты по займу для разных уровней утилизации, следующим образом:
(max_rate/min_rate)^util * min_rate где: min_rate и max_rate - минимальная и максимальная ставки (в процентах) util - уровень утилизации (в долях от 1) пример результатов расчета ставки в зависимости утилизации для параметров min_rate=1, max_rate=100: При утилизации 60%: 15.85% При утилизации 70%: 25.12% При утилизации 80%: 39.81%
Для стабильных активов стоит выбирать более низкие значения, когда как для волатильных более высокие. Также стоит понимать потенциальный спрос и предложение для принятия решения по этим ставкам.
Параметры min_borrow_rate
и man_borrow_rate
можно не задавать (выставить 0 или использовать метод без этих параметров) в таком случае им присваиваются значения по умолчанию, заданное CurveDAO.
После ввода значений остаётся только нажать "Write" и подписать транзакцию.
Не забывайте наблюдать за ним, контролируя, чтобы его поведение было безопасным и соответствовало ожиданиям. В случае необходимости, после запуска рынка часть параметров (например, комиссии и диапазон ставок) можно корректировать администратору рынка или через DAO Curve.
Метод create: для рынка с пулом без crvUSD
- Нет прямого пула Curve с вашим токеном и crvUSD
- Требуется агрегировать цену через несколько пулов (например, ваш токен/USDT + crvUSD/USDT)
Параметры аналогичны как для метода create_from_pool, но добавляется дополнительный параметр, указывающий на адрес контракта оракула:
Как самостоятельно развернуть оракул для Curve LlamaLend читайте дальше.
Деплой контракта оракула
(только для рынков развёртываемых через метод create)
Создание рынка, залоговый токен которого не торгуется в NG-пуле Curve с crvUSD, требует агрегации цены из нескольких пулов или других источников и развертывания отдельного контракта. Это более сложная задача, поэтому рекомендуется связаться с командой Curve для консультации и помощи в развертывании.
На данный момент не существует фабрик для деплоя таких контрактов оракула с использованием методов, поэтому требуется разворачивать его самостоятельно.
Для примера покажем процесс деплоя с помощью онлайн среды разработки REMIX IDE.
Первое, что вам потребуется — это загрузить готовый код контракта в ваше рабочее пространство. Для этого нажмите на иконку ссылки:
По этому адресу есть доступные вариант контрактов оракула для L1:
https://github.com/curvefi/curve-stablecoin/tree/master/contracts/price_oracles
Для L2:
https://github.com/curvefi/curve-stablecoin/tree/master/contracts/price_oracles/L2
Для L2 и монет с разным количеством значений:
https://github.com/martinkrung/ape-oracle-deploy/blob/main/contracts/L2/CryptoFromPoolsWAgg.vy
(именно этот вариант мы будем использовать в примере ниже, так как агрегирование цены будет происходить через токены с разным количеством значений, 18 для EYWA и 8 для USDT)
Пример для создания рынка для EYWA/crvUSD
Нужно выбрать подходящий контракт и вставить на него ссылку.
После загрузки контракта его нужно скомпилировать:
После перейти в раздел "Deploy & run transaction":
В выпадающем списке “ENVIRONMENT” выберите “WalletConnect”, подключите кошелёк и в кошельке укажите сеть, на которой планируете разворачивать новый контракт.
Дальше нужно задать параметры инициализации, разверните меню "Deploy":
pools
- адреса пулов в кавычках через запятую и без пробелов, внутри квадратных скобок [], например пула с токеном обеспечения и пула с crvusdborrowed_ixs
- индексы связи для монеты займа, через запятую в квадратных скобках []collateral_ixs
- индексы связи для монеты обеспечения, через запятую в квадратных скобках []agg
- адрес контракта агрегатора, в кавычках без скобок
В контракте пула используйте метод coins
для того чтобы узнать к какому индексу привязана монета. Вводите индекс и увидите адрес монеты привязанной к нему (индексы считаются с 0).
Пример для агрегации через два пула EYWA/USDT и crvUSD/USDT:
сначала проверьте пул EYWA https://arbiscan.io/address/0x6579758e9e85434450d638cfbea0f2fe79856dda#readContract
индекс монеты 0 = USDT
индекс монеты 1 = EYWA
затем проверьте пул crvUSD/USDT:
https://arbiscan.io/address/0x73af1150f265419ef8a5db41908b700c32d49135#readContract
индекс монеты 0 = crvUSD
индекс монеты 1 = USDT
pools: ["0x6579758e9e85434450d638cfbea0f2fe79856dda","0x73af1150f265419ef8a5db41908b700c32d49135"] borrowed_ixs: [0,0] collateral_ixs: [1,1] agg: "0x44a4FdFb626Ce98e36396d491833606309520330"
Теперь осталось нажать "transact" и подписать транзакцию. Поздравляем - ваш оракул создан.
В хеше вашей транзакции можно найти адрес нового контракта. Перейдите во вкладку “Contract” → “Read Contract” и в методе price проверьте цену, чтобы убедиться, что она определяется корректно.
Нажмите на значение, чтобы увидеть цену в классическом формате:
Выбор оракулов для рынков Curve Lending
(только для рынков развёртываемых через метод create)
https://github.com/martinkrung/ape-oracle-deploy/blob/main/contracts/L2/CryptoFromPoolsWAgg.vy
- оракул для агрегации цен между токенами с разным количеством значений
https://github.com/curvefi/curve-stablecoin/tree/master/contracts/price_oracles
В репозитории Curve представлено множество типов оракулов, каждый из которых оптимизирован для определенных сценариев использования. Рассмотрим основные типы и случаи их применения.
Основные типы оракулов для рынков кредитования
1. Оракулы на основе пулов Curve
- CryptoFromPool.vy – базовый оракул, получающий цену напрямую из пула Curve. Используется, когда есть пул с вашим токеном и crvUSD.
- CryptoFromPoolWAgg.vy – расширенная версия, дополнительно использующая агрегатор стоимости. Применяется, когда нужно пересчитать цену через USD, а не напрямую через crvUSD.
2. Комбинированные оракулы (для цепочек пулов)
- CryptoFromPoolsRate.vy и CryptoFromPoolsRateWAgg.vy – используются, когда нужно агрегировать цены из нескольких пулов. Идеальны для токенов, у которых нет прямого пула с crvUSD.
3. Специализированные оракулы для L2
- Контракты в папке L2/ – адаптированные версии для Arbitrum и других L2 сетей, учитывающие особенности работы этих сетей (проверка активности секвенсера и т.д.).
Оракулы для специфических токенов
1. Для токенов с доходностью (yield-bearing)
- CryptoWithStablePriceWstethN.vy – специально оптимизирован для wstETH и подобных токенов, учитывает механизм накопления доходности.
- CryptoWithStablePriceWBTC.vy – оптимизирован для WBTC
- CryptoWithStablePriceTBTC.vy – оптимизирован для TBTC
- CryptoWithStablePriceETH.vy – оптимизирован для ETH
3. Интеграции с внешними оракулами
- ChainlinkWrapper.vy – обертка для Chainlink оракулов
- CryptoWithStablePriceAndChainlink.vy – гибридный подход, объединяющий данные из пулов Curve и Chainlink
- UniOracle.vy – использует Uniswap TWAP для получения цен
Принципы выбора оракула
- Для стандартного рынка с прямым пулом crvUSD/ваш_токен:
- Используйте
CryptoFromPool.vy
(не обязательно развертывать вручную, доступно создание через контракт-фабрику) - Для токена без прямого пула с crvUSD:
- Для рынков на L2 (Arbitrum и др.):
- Для yield-bearing токенов (wstETH, pufETH):
- Для повышенной безопасности:
Важные особенности
- EMA-механизм: все оракулы Curve используют экспоненциальное скользящее среднее для сглаживания колебаний цен и защиты от манипуляций
- Защита от флэш-кредитов: многие оракулы включают механизмы защиты от манипуляций ценами через флэш-кредиты
- Совместимость с токенами: для токенов с нестандартным количеством десятичных знаков (например, USDT с 6 знаками) лучше использовать версии без stored_rates
При выборе оракула рекомендуется также учитывать ликвидность используемых пулов и устойчивость механизма определения цены к манипуляциям. А также связаться с командой разработчиков Curve для получения актуальных сведений и помощи в развертывании.
4. Создание гейджей для получения вознаграждений
После создания рынка LlamaLend вы можете добавить гейдж для получения вознаграждений CRV. Процесс отличается в зависимости от сети, где развернут рынок.
Процесс для рынков на Ethereum Mainnet
Для рынков, созданных на основной сети Ethereum, процесс проще и включает только один шаг:
Развертывание основного гейджа:
- Используйте контракт Liquidity Gauge Factory на Ethereum
- Вызовите метод
deploy_gauge
- Укажите адрес LP-токена рынка (сам контракт рынка LlamaLend)
Процесс для рынков на сайдчейнах (L2 и альтернативные L1)
Для рынков на сайдчейнах (Arbitrum, Optimism, Fraxtal и т.д.) требуется двухступенчатый процесс:
1. Создание Child Gauge на сайдчейне
- Чтобы найти актуальный адрес ChildLiquidityGaugeFactory, используйте метод gauge_factory во вкладке Read Contract на странице фабрики нужной сети. Адреса фабрик — выше по тексту.
- Перейдите к контракту ChildLiquidityGaugeFactory в вашей сети.
- В контракте ChildLiquidityGaugeFactory вызовите метод
deploy_child_gauge
(#3 или #4 в интерфейсе, используйте #4 чтобы в дальнейшем иметь возможность обновлять параметры без голосования CurveDAO)
_chain_id
(uint256) – ID сети (например, 42161 для Arbitrum)_lp_token
(address) – адрес рынка LlamaLend (LP-токен)_salt
(bytes32) – произвольное 32-байтное значение (обязательно сохраните!)
2. Создание Root Gauge на Ethereum Mainnet
- Перейдите к контракту RootLiquidityGaugeFactory (0xabC000d88f23Bb45525E447528DBF656A9D55bf5)
- Вызовите метод
deploy_gauge
(#2 на интерфейсе) с параметрами:
Критически важно: При развертывании обоих гейджей используйте тот же адрес кошелька и то же значение _salt. Это гарантирует создание идентичных адресов контрактов, что необходимо для их корректной связи.
Генерация значения salt
Для параметра _salt
можно использовать любое (сгенерированное или набранное вручную) 32-байтное значение, например:
0xcedbd6b3fde8bb3a72a0decca9d8812aa7c679f8530274e859011cf4f5a31344
Параметр _manager
Параметр _manager
в методе #4 позволяет указать адрес, который будет иметь расширенные права управления гейджем, например:
- Добавление дополнительных токенов-вознаграждений через метод
add_reward
- Депонирование токенов вознаграждения через
deposit_reward_token
- Изменение других параметров гейджа
Рекомендуется использовать метод #4 с явным указанием вашего адреса как менеджера, чтобы иметь возможность в дальнейшем управлять гейджем и настраивать дополнительные вознаграждения помимо CRV.
Дополнительные возможности
Владелец (manager) гейджа может настроить дополнительные вознаграждения в контракте гейджа:
- Добавить сторонние токены-вознаграждения через метод
add_reward
- Депонировать токены вознаграждения через
deposit_reward_token
После успешного развертывания гейджа создайте предложение для его добавления в Gauge Controller с помощью Curve DAO. О создании такого предложения читайте в следующем нашем материале.
Заключение
Создание собственного рынка на Curve LlamaLend представляет собой процесс, требующий внимательного планирования и технических знаний, но при этом открывающий широкие возможности для проектов и их сообществ.
Как мы рассмотрели в этом руководстве, весь процесс состоит из нескольких ключевых этапов:
- Подготовка и подбор параметров – фундамент безопасного рынка, где критически важно провести симуляции на исторических данных.
- Создание пула Curve (если необходимо) или выбор существующего – основа для надежного ценового оракула.
- Развертывание оракула для токенов без прямого пула с crvUSD – позволяет интегрировать практически любой актив через цепочку пулов.
- Запуск рынка через OneWay Lending Factory – один транзакционный вызов разворачивает всю необходимую инфраструктуру.
- Создание гейджей – опциональный шаг, обеспечивающий получение вознаграждений CRV поставщиками ликвидности.
Отдельно стоит подчеркнуть важность правильного подбора параметров рынка: значения A, fee, loan_discount и liquidation_discount напрямую влияют на безопасность и эффективность работы вашего рынка. Ставки кредитования, которые определяются параметрами min_borrow_rate и max_borrow_rate, формируют экономику рынка и стимулы для участников.
Несмотря на техническую сложность некоторых шагов, экосистема Curve делает создание собственного рынка кредитования доступным для широкого круга проектов. Благодаря permissionless-модели и открытому исходному коду, каждый имеет возможность интегрировать свой токен в одну из самых надежных DeFi-экосистем.
Запустив собственный рынок, не забывайте о его постоянном мониторинге и поддержке – здоровье рынка кредитования требует внимания не только на этапе создания, но и на протяжении всего жизненного цикла.