DeFi
September 16

DeFi. Вывод средств при блокировке аккаунта через интерфейс. Пример EtherFI

ETHFI вывод

Введение

Начальное состояние (до вывода): 520.3283 sETHFI

Кошелёк 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 получим.

Для этого проделываем следующие не хитрые манипуляции:

  • В Read Contract ищем previewAssetsOut
  • вводим:
    • assetOut = 0xFe0c30065B384F05761f15d0CC899D4F9F9Cc0eB
    • amountOfShares = 431931916160290135402
    • discount = 0
Параметры

Тут немного поясню. 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 = 0xF03352da1536F31172A7F7cB092D4717DeDDd3CB
  • value = 431931916160290135402

Тут 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

Всё.