Стандарт токенизированного хранилища ERC-4626
Введение
ERC-4626 — это стандарт для оптимизации и унификации технических параметров доходных хранилищ. Он предоставляет стандартный API для токенизированных доходных хранилищ, которые представляют собой доли одного базового токена ERC-20. ERC-4626 также описывает дополнительное расширение для токенизированных хранилищ, использующих ERC-20, предлагая базовую функциональность для внесения, вывода токенов и чтения балансов.
Роль ERC-4626 в доходных хранилищах
Рынки кредитования, агрегаторы и токены, изначально приносящие процентный доход, помогают пользователям находить лучшую доходность для их криптовалютных токенов путем выполнения различных стратегий. Эти стратегии реализуются с небольшими вариациями, что может приводить к ошибкам или лишним тратам ресурсов на разработку.
Использование ERC-4626 в доходных хранилищах снизит усилия по интеграции и откроет доступ к доходности в различных приложениях с минимальными специализированными усилиями со стороны разработчиков за счет создания более согласованных и надежных шаблонов реализации.
Токен ERC-4626 полностью описан в EIP-4626 (opens in a new tab).
Асинхронное расширение хранилища (ERC-7540)
ERC-4626 оптимизирован для атомарных внесений и погашений до определенного лимита. Если лимит достигнут, новые внесения или погашения не могут быть отправлены. Это ограничение плохо работает для любой системы смарт-контрактов с асинхронными действиями или задержками в качестве обязательного условия для взаимодействия с хранилищем (например, протоколы активов реального мира, протоколы кредитования с недостаточным обеспечением, протоколы кроссчейн-кредитования, токены ликвидного стейкинга (LST) или страховые модули безопасности).
ERC-7540 расширяет полезность хранилищ ERC-4626 для асинхронных сценариев использования. Существующий интерфейс хранилища (deposit/withdraw/mint/redeem) полностью используется для того, чтобы востребовать асинхронные запросы.
Расширение ERC-7540 полностью описано в ERC-7540 (opens in a new tab).
Расширение хранилища для нескольких активов (ERC-7575)
Одним из недостающих сценариев использования, который не поддерживается ERC-4626, являются хранилища, имеющие несколько активов или точек входа, такие как токены поставщика ликвидности (LP). Обычно они являются громоздкими или несовместимыми из-за требования к ERC-4626 самому быть токеном ERC-20.
ERC-7575 добавляет поддержку хранилищ с несколькими активами путем вынесения реализации токена ERC-20 за пределы реализации ERC-4626.
Расширение ERC-7575 полностью описано в ERC-7575 (opens in a new tab).
Предварительные требования
Для лучшего понимания этой страницы мы рекомендуем сначала прочитать про стандарты токенов и ERC-20.
Функции и особенности ERC-4626:
Методы
asset
function asset() public view returns (address assetTokenAddress)
Эта функция возвращает адрес базового токена, используемого для хранилища в целях учета, внесения и вывода.
totalAssets
function totalAssets() public view returns (uint256)
Эта функция возвращает общую сумму базовых активов, удерживаемых хранилищем.
convertToShares
function convertToShares(uint256 assets) public view returns (uint256 shares)
Эта функция возвращает количество shares, которое хранилище обменяло бы на предоставленное количество assets.
convertToAssets
function convertToAssets(uint256 shares) public view returns (uint256 assets)
Эта функция возвращает количество assets, которое хранилище обменяло бы на предоставленное количество shares.
maxDeposit
function maxDeposit(address receiver) public view returns (uint256 maxAssets)
Эта функция возвращает максимальное количество базовых активов, которое может быть внесено за один вызов deposit, с долями, отчеканенными для receiver.
previewDeposit
function previewDeposit(uint256 assets) public view returns (uint256 shares)
Эта функция позволяет пользователям смоделировать результаты их внесения на текущем блоке.
deposit
function deposit(uint256 assets, address receiver) public returns (uint256 shares)
Эта функция вносит assets базовых токенов в хранилище и предоставляет право собственности на shares для receiver.
maxMint
function maxMint(address receiver) public view returns (uint256 maxShares)
Эта функция возвращает максимальное количество долей, которое может быть отчеканено за один вызов mint, с долями, отчеканенными для receiver.
previewMint
function previewMint(uint256 shares) public view returns (uint256 assets)
Эта функция позволяет пользователям смоделировать результаты их чеканки на текущем блоке.
mint
function mint(uint256 shares, address receiver) public returns (uint256 assets)
Эта функция чеканит ровно shares долей хранилища для receiver путем внесения assets базовых токенов.
maxWithdraw
function maxWithdraw(address owner) public view returns (uint256 maxAssets)
Эта функция возвращает максимальное количество базовых активов, которое может быть выведено с баланса owner за один вызов withdraw.
previewWithdraw
function previewWithdraw(uint256 assets) public view returns (uint256 shares)
Эта функция позволяет пользователям смоделировать результаты их вывода на текущем блоке.
withdraw
function withdraw(uint256 assets, address receiver, address owner) public returns (uint256 shares)
Эта функция сжигает shares у owner и отправляет ровно assets токенов из хранилища к receiver.
maxRedeem
function maxRedeem(address owner) public view returns (uint256 maxShares)
Эта функция возвращает максимальное количество долей, которое может быть погашено с баланса owner через вызов redeem.
previewRedeem
function previewRedeem(uint256 shares) public view returns (uint256 assets)
Эта функция позволяет пользователям смоделировать результаты их погашения на текущем блоке.
redeem
function redeem(uint256 shares, address receiver, address owner) public returns (uint256 assets)
Эта функция погашает определенное количество shares у owner и отправляет assets базовых токенов из хранилища к receiver.
totalSupply
function totalSupply() public view returns (uint256)
Возвращает общее количество непогашенных долей хранилища в обращении.
balanceOf
function balanceOf(address owner) public view returns (uint256)
Возвращает общее количество долей хранилища, которое в настоящее время имеет owner.
Карта интерфейса
События
Событие Deposit
ДОЛЖНО генерироваться, когда токены вносятся в хранилище через методы mint и deposit.
event Deposit(
address indexed sender,
address indexed owner,
uint256 assets,
uint256 shares
)
Где sender — это пользователь, который обменял assets на shares и перевел эти shares к owner.
Событие Withdraw
ДОЛЖНО генерироваться, когда доли выводятся из хранилища вкладчиком в методах redeem или withdraw.
event Withdraw(
address indexed sender,
address indexed receiver,
address indexed owner,
uint256 assets,
uint256 shares
)
Где sender — это пользователь, который инициировал вывод и обменял shares, принадлежащие owner, на assets. receiver — это пользователь, который получил выведенные assets.
