DeFi. Вывод средств при блокировке аккаунта через интерфейс. Пример EtherFI
Введение
Кошелёк menaskop.eth - тестовый, поэтому на нём совершаю самые разные транзакции. В итоге это приводит к тому, что порой он окрашивается в “красный” цвет для сервисов и его блокируют.
Но подобное может случиться с каждым и один из способов обхода - это прямое взаимодействие с контрактами. Расскажу сегодня на свежем примере методологию…
sETH - ETHFI
Итак, зададимся простым вопросом: “Как вручную вывести sETHFI - ETHFI через контракты ether.fi?”. Кошелёк мой: 0x23802e21c6cd72c091792bfb9f7afc2265cc68d6.
Определяем токены и контракт вывода
Для начала ищем токен sETHFI: 0x86B5780b606940Eb59A062aA85a07959518c0161: etherscan.io/address/0x86B5780b606940Eb59A062aA85a07959518c0161. Далее идём дальше и ищем ETHFI: 0xFe0c30065B384F05761f15d0CC899D4F9F9Cc0eB: etherscan.io/address/0xFe0c30065B384F05761f15d0CC899D4F9F9Cc0eB.
И, наконец, контракт ончейн-вывода: etherscan.io/address/0xF03352da1536F31172A7F7cB092D4717DeDDd3CB.
Что получаем?
Сначала смотрим, сколько ETHFI получим.
Для этого проделываем следующие не хитрые манипуляции:
Тут немного поясню. amountOfShares - это количество sETHFI, которое хотим вывести, записанное в минимальных единицах токена. Но как его вычислить-то?
Для этого на контракте sETHFI (0x86B5780b606940Eb59A062aA85a07959518c0161) делаем тот же финт ушами: sETHFI - Read Contract и открываем параметр: balanceOf(address) - после чего вводим адрес кошелька: 0x23802e…f7afc2265cc68d6.
На момент моей проверки balanceOf показывал: 431931916160290135402.
Важно всегда учесть разрядность: у sETHFI 18 decimals, поэтому: 431931916160290135402 / 10^18 = 431.931916160290135402 sETHFI. То есть если хотим вывести весь баланс, то: amountOfShares = 431931916160290135402. И уже именно это число без точки и без округления вставляем в previewAssetsOut - amountOfShares.
Важно! Дисклеймер! Не нужно вручную переписывать 431.9319 как число токенов - контракт принимает значение в минимальных единицах. Для другого кошелька или другого объёма amountOfShares будет другим.
Итак, amountOfShares здесь = 431.931916 sETHFI, а discount = 0 означает отсутствие добровольной скидки.
В нашем примере контракт вернул: 520343039203819529027, то есть примерно 520.343039 ETHFI. Это логично: помимо застейканных токенов начислили ещё ведь проценты.
Разрешаем Withdrawal-контракту забрать sETHFI
После всего, что описано выше, на контракте sETHFI вызываем approve():
Тут spender - это тот, кому разрешаем забрать токены; а value - ровно сколько sETHFI разрешаем использовать. Фактический approve из примера: транзакция approve 431.931916 sETHFI.
Создаём заявку на вывод
На Withdrawal-контракте вызываем requestOnChainWithdraw():
- assetOut = 0xFe0c30065B384F05761f15d0CC899D4F9F9Cc0eB
- amountOfShares = 431931916160290135402
- discount = 0
- secondsToDeadline = 1209600
Здесь assetOut = ETHFI; amountOfShares = 431.931916 sETHFI; discount = 0 = без скидки; 1209600 секунд = 14 дней срока действия заявки, а не 14 дней ожидания (как раньше).
Фактическая транзакция: requestOnChainWithdraw - чтобы был пример перед глазами.
Проверяем событие OnChainWithdrawRequested
В нашем случае контракт записал:
- nonce = 892
- amountOfShares = 431.931916160290135402 sETHFI
- amountOfAssets = 520.343039203819529027 ETHFI
- secondsToMaturity = 3600
- secondsToDeadline = 1209600
Самое важное: secondsToMaturity = 3600 в статус “cooldown “ и этовсего 1 час! А вот secondsToDeadline = 1209600 - это срок, когда заявка остаётся действительной: 14 дней.
См. requestId этой конкретной заявки.
После часа проверяем состояние заявки: без интерфейса ether.fi. Не создаём новую заявку только потому, что ETHFI ещё не появились: сначала проверяем существующий requestId.
Итог примера: 431.931916 sETHFI “превратились” в 520.343039 ETHFI, скидка составила 0, cooldown - 1 час, а окно исполнения 14 дней.
P.S. Вывод через час
Итог: https://etherscan.io/address/0xba538b15bbcA0cb5e3ad844241C7a0d2DFc4F13b#writeContract:
См. https://etherscan.io/tx/0xdaa37c8cd3fd7d6b74f921e3623b33bda4c1a82e6be2ab47bb13718490608c81