Инструкция по интеграции Frontend с контрактами Magnet Liquidity
Данный документ содержит техническое руководство по взаимодействию с контрактами общей (MagnetLiquidityShared) и личной (MagnetLiquidityPersonal) ликвидности.
1. Окружение и адреса контрактов
Результаты деплоя в тестовой среде (Hardhat Network):
Uniswap V3 (Local)
- WETH9:
0x5FbDB2315678afecb367f032d93F642f64180aa3 - Factory:
0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512 - NonfungiblePositionManager (NPM):
0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0 - SwapRouter:
0xCf7Ed3AccA5a467e9e704C703E8D87F634fB0Fc9 - Pool (token0/token1/3000):
0xc8291c7d77041373FC8b95E2337CB0D1f2204F2e
Test Tokens
- token0 (payToken):
0x5FC8d32690cc91D4c39d9d3abcBD16989F875707 - token1:
0xDc64a140Aa3E981100a9becA4E685f962f0cF6C9
Magnet Protocols
- PartnerChainBridge:
0x9A676e781A523b5d0C0e43731313A708CB607508 - MagnetLiquidityShared:
0xc6e7DF5E7b4f2A278906862b61205850344D4e7d - MagnetLiquidityPersonal:
0x67d269191c92Caf3cD7723F116c85e6E9bf55933
2. Общая ликвидность (MagnetLiquidityShared)
Протокол общей ликвидности использует модель долей (shares). Все NFT в одном пуле делят между собой одну или несколько позиций Uniswap V3.
Пользовательские функции
Покупка NFT
Пользователь платит payToken и получает долю в общем пуле.
- Метод:
buyNft(uint256 poolId, uint256 payAmount, uint256 minShares, uint256 minAmt0, uint256 minAmt1, uint256 deadline) - Предварительно: Требуется
approveдляpayTokenна адрес контракта. - Параметры:
poolId: ID пула (в тестовой среде0).minShares: Минимальное количество долей (защита от проскальзывания при свопе внутри контракта).minAmt0/minAmt1: Ограничения на добавление ликвидности в Uniswap.
Пополнение (Top up)
Добавление средств в существующую NFT (увеличивает количество уже имеющихся долей).
- Метод:
topUp(uint256 nftId, uint256 payAmount, uint256 minAmt0, uint256 minAmt1, uint256 deadline) - Важно: В отличие от покупки, при пополнении (top up) партнерские и другие распределения не взимаются.
Вывод средств (Withdraw)
Частичный или полный вывод ликвидности. Требуется подпись бэкенда.
- Метод:
withdraw(uint256 nftId, uint256 shares, bool convertSingle, uint256 minOut, uint256 minAmt0, uint256 minAmt1, uint256 nonce, uint256 deadline, bytes sig) - Параметры:
shares: Количество долей к выводу.convertSingle: Еслиtrue, контракт попытается конвертировать оба токена пары вpayoutToken(обычноpayToken).sig: Подпись отsignatureVerifier, подтверждающая право на вывод.
Клейм дохода (Claim)
Забор накопленных комиссий без уменьшения тела позиции. Требуется подпись бэкенда.
- Метод:
claim(uint256 nftId, bool convertSingle, uint256 minOut, uint256 nonce, uint256 deadline, bytes sig)
Админские и операторские функции
Создание/Настройка пула
- Метод:
setPoolConfig(uint256 poolId, PoolConfig config) - Config: включает адреса токенов, NPM, Router, границы тиков (
tickLower,tickUpper) и флагenabled.
Ребалансировка (Rebalance)
Переносит всю активную ликвидность пула в новый диапазон тиков.
- Метод:
rebalance(uint256 poolId, int24 newTickLower, int24 newTickUpper, uint256 minAmt0, uint256 minAmt1, uint256 deadline) - Логика: Старая позиция закрывается, средства свопаются под новый диапазон и открывается новая позиция. Старая позиция становится «неактивной».
Установка активной позиции
Если в пуле несколько позиций (например, после частичного перемещения), можно вручную указать, какая из них являе тся «активной» (в неё будут идти новые депозиты).
- Метод:
setActivePosition(uint256 poolId, uint256 positionId)
Реинвестирование (Shared Reinvest)
Реинвестирование накопленных вознаграждений обратно в пул. Доступно в двух режимах:
Ручное реинвестирование — вызывается только владельцем NFT, подпись не требуется.
- Метод:
reinvest(uint256 nftId, uint256 minAmt0, uint256 minAmt1, uint256 deadline) - Логика: Забирает pending rewards данной NFT, свопает в оптимальное соотношение и добавляет ликвидность. Доли (shares) пропорционально увеличиваются.
- Распределения: Не применяются.
Автоматизированное реинвестирование — вызывается оператором/админом с EIP-712 подписью от верификатора.
- Метод:
reinvestByOperator(uint256 nftId, uint256 minAmt0, uint256 minAmt1, uint256 nonce, uint256 deadline, bytes sig) - Nonce: Привязан к владельцу NFT (
ownerOf(nftId)), а не кmsg.sender(оператору). - EIP-712 тип:
ReinvestPermit(uint256 nftId,uint256 nonce,uint256 deadline)
Перекладывание ликвидности (Move)
Позволяет переместить часть ликвидности из одной позиции в другую (даже в другой пул). Используется для диверсификации.
- Метод:
moveLiquidity(uint256 fromPoolId, uint256 fromPositionId, uint256 toPoolId, uint128 liquidity, uint256 amount0Min, uint256 amount1Min, uint256 deadline) - Пример: Вывод 50% ликвидности из пассивной позиции и добавление её в активную позицию другого пула.