| Метод | Пользователь задаёт | Контракт возвращает | Предварительный запрос |
|---|---|---|---|
| deposit | Точное число assets | Полученные shares | previewDeposit + maxDeposit |
| mint | Точное число shares | Потраченные assets | previewMint + maxMint |
| withdraw | Точное число assets | Списанные shares | previewWithdraw + maxWithdraw |
| redeem | Точное число shares | Полученные assets | previewRedeem + maxRedeem |
- Метод
- deposit
- Пользователь задаёт
- Точное число assets
- Контракт возвращает
- Полученные shares
- Предварительный запрос
- previewDeposit + maxDeposit
- Метод
- mint
- Пользователь задаёт
- Точное число shares
- Контракт возвращает
- Потраченные assets
- Предварительный запрос
- previewMint + maxMint
- Метод
- withdraw
- Пользователь задаёт
- Точное число assets
- Контракт возвращает
- Списанные shares
- Предварительный запрос
- previewWithdraw + maxWithdraw
- Метод
- redeem
- Пользователь задаёт
- Точное число shares
- Контракт возвращает
- Полученные assets
- Предварительный запрос
- previewRedeem + maxRedeem
Vault ведёт учёт в двух контрактах и двух единицах
`asset()` возвращает address underlying ERC-20, а сам vault является ERC-20 для shares. `totalAssets()` сообщает количество managed underlying по правилам реализации; `totalSupply()` — supply долей. Баланс пользователя в `balanceOf` выражен в shares. Сначала зафиксируйте chain и оба contract address, затем прочитайте decimals токена для каждой единицы: одинаковое число знаков не является обязательным и не задаёт стоимость.
Convert, preview и max нельзя подменять друг другом
| Слой | Вопрос | Включает | Не включает |
|---|---|---|---|
| convertToShares / convertToAssets | Средняя идеализированная конверсия | Общий exchange-rate logic | Fees, caller variation, slippage, limits |
| previewDeposit / previewMint | Результат входа в текущих условиях | Operation-specific fees и неблагоприятное отклонение | Deposit/mint limits |
| previewWithdraw / previewRedeem | Результат выхода в текущих условиях | Operation-specific fees и неблагоприятное отклонение | Withdraw/redeem limits |
| maxDeposit / maxMint | Сколько разрешено receiver | Global и user-specific limits | Реальный wallet balance |
| maxWithdraw / maxRedeem | Сколько доступно owner | Shares и текущие ограничения | Гарантию неизменности до следующего block |
- Слой
- convertToShares / convertToAssets
- Вопрос
- Средняя идеализированная конверсия
- Включает
- Общий exchange-rate logic
- Не включает
- Fees, caller variation, slippage, limits
- Слой
- previewDeposit / previewMint
- Вопрос
- Результат входа в текущих условиях
- Включает
- Operation-specific fees и неблагоприятное отклонение
- Не включает
- Deposit/mint limits
- Слой
- previewWithdraw / previewRedeem
- Вопрос
- Результат выхода в текущих условиях
- Включает
- Operation-specific fees и неблагоприятное отклонение
- Не включает
- Withdraw/redeem limits
- Слой
- maxDeposit / maxMint
- Вопрос
- Сколько разрешено receiver
- Включает
- Global и user-specific limits
- Не включает
- Реальный wallet balance
- Слой
- maxWithdraw / maxRedeem
- Вопрос
- Сколько доступно owner
- Включает
- Shares и текущие ограничения
- Не включает
- Гарантию неизменности до следующего block
Preview привязан к текущему onchain state и наиболее близок к соответствующей операции в той же transaction, но не является резервированием курса. Между чтением и включением состояние может измениться. Max method обязан учитывать ограничения и способен вернуть ноль, даже если математическая конверсия положительна. Для асинхронного расширения ERC-7540 появляются request и claim states; обычный atomic workflow нельзя переносить на него без проверки interface.
Rounding системно зависит от направления операции
Минимальная модель округления ERC-4626
- когда vault выдаёт shares за заданные assets, результат не должен завышаться для пользователя;
- когда vault выдаёт assets за заданные shares, результат также округляется вниз;
- когда пользователь запрашивает точное число shares или assets, необходимый input может округляться вверх;
- оба convertTo methods по стандарту округляют вниз;
- конкретная потеря зависит от rate, precision, размера операции, fees и реализации.
На малых суммах одна минимальная единица shares может быть существенной. В пустом или почти пустом vault прямое пополнение underlying без mint shares способно сдвинуть rate и усилить rounding loss для следующего deposit — это называют donation/inflation attack. OpenZeppelin Contracts 5.x использует virtual assets и shares как mitigation, но наличие стандарта ERC-4626 не доказывает, что конкретный deployment использует эту реализацию или её настройки.
Перед входом или выходом строят quote card на одном block
- 1Определить contracts
Зафиксируйте chain, vault address, результат asset() и bytecode/implementation, если vault upgradeable.
- 2Назвать единицу цели
Для точных assets выбирайте deposit/withdraw, для точных shares — mint/redeem; не сравнивайте разные направления.
- 3Прочитать preview и max
Вызовите соответствующую пару для receiver/owner на одном block и запишите raw units.
- 4Проверить разрешения
Для входа обычно нужен ERC-20 allowance vault-контракту; отдельно проверьте spender и сумму.
- 5Задать границу
Если wrapper/router поддерживает slippage check, установите minimum output или maximum input; стандартный метод сам по себе не принимает такой параметр.
Если vault участвует в DeFi-кредитовании, его `totalAssets` и withdrawal limits могут зависеть от внешней позиции; ERC-4626 не объясняет риск ликвидации или доступную ликвидность стратегии. Если proxy implementation, asset address, max result или preview неожиданно меняется, не увеличивайте allowance и не повторяйте операцию, пока причина не установлена.
Receipt подтверждает дельты, а не обещанный APY
| Наблюдение | Проверка | Действие |
|---|---|---|
| Transaction успешна | Deposit/Withdraw events и balance deltas assets/shares | Сохранить tx hash, block, raw amounts и receiver/owner |
| Revert | max, allowance, balance, pause, custom error | Не повышать gas вслепую; устранить конкретное условие |
| Shares меньше preview | Block/state, fees, slippage guard, другой contract | Остановить повтор и сравнить calldata с quote |
| maxWithdraw = 0 | Owner, shares, global/user limits, async request state | Не считать convertToAssets доступной суммой |
| Неизвестный spender | Approval transaction и фактический vault/router | Не подписывать; отозвать лишнее разрешение, если оно уже выдано |
- Наблюдение
- Transaction успешна
- Проверка
- Deposit/Withdraw events и balance deltas assets/shares
- Действие
- Сохранить tx hash, block, raw amounts и receiver/owner
- Наблюдение
- Revert
- Проверка
- max, allowance, balance, pause, custom error
- Действие
- Не повышать gas вслепую; устранить конкретное условие
- Наблюдение
- Shares меньше preview
- Проверка
- Block/state, fees, slippage guard, другой contract
- Действие
- Остановить повтор и сравнить calldata с quote
- Наблюдение
- maxWithdraw = 0
- Проверка
- Owner, shares, global/user limits, async request state
- Действие
- Не считать convertToAssets доступной суммой
- Наблюдение
- Неизвестный spender
- Проверка
- Approval transaction и фактический vault/router
- Действие
- Не подписывать; отозвать лишнее разрешение, если оно уже выдано
Проверяемый результат содержит chain, vault и asset contracts, block, выбранный метод, preview/max, transaction hash и фактические изменения двух балансов. Перед подписью отдельно прочитайте, что подписывает кошелёк: receiver и owner могут различаться, а router добавляет собственный contract и assumptions. Если фактический output нарушил заданную onchain-границу, сохраните calldata/receipt и остановите новые approvals до анализа реализации.
Источники
Мы используем прямые ссылки и фиксируем дату проверки. Полный текст чужих материалов не перепечатывается.
- ERC-4626: Tokenized Vaults Ethereum Improvement Proposals · Проверено 20 августа 2026 г. в 09:21 GMT+5
- OpenZeppelin Contracts 5.x — ERC4626 API OpenZeppelin · Проверено 20 августа 2026 г. в 09:21 GMT+5
- OpenZeppelin Contracts 5.x — ERC-4626 guide OpenZeppelin · Проверено 20 августа 2026 г. в 09:21 GMT+5
- ERC-7540: Asynchronous ERC-4626 Tokenized Vaults Ethereum Improvement Proposals · Проверено 20 августа 2026 г. в 09:21 GMT+5
