Когда постоянно пользуешься Tenderly для трассировки транзакции, тебе надо верифицировать смарт-контракт. Если ты сделал это для explorer, то в 99% случаев Tenderly может автоматически подтянуть код контракта оттуда и разложить на него весь стек вызова твоей транзакции.
Мой случай попадает в тот самый 1%, когда что-то пошло не так.
☠️ Затравочка
У нас блокчейн Base. Проект средний сложности, порядка 5 основных контрактов, версия Solidity 0.8.35, много чего наследуется от OZ. В общем, верифицировать руками смерти подобно. Поэтому использую возможности Foundry прямо в момент деплоя.
Пока мы только в тестнете, но уже готовимся к выходу в мейннет, поэтому активно тестируем — транзакций много. И вот появляется "транзакция-кандидат", которая ревернулась.
Привычно открываю Tenderly, жму кнопку "Fetch the contract from public explorer" и ничего. В этот раз проблему решил без глубокого погружения в код, но звоночек мне не понравился. Решил попозже эту проблемку как-нибудь разобрать.
💡 Поиск решения
Я знаю, что сУрьезные проекты верифицируют свои контракты в Tenderly приватно и используют для этого апишку. Я пошел сам в доку, нашел, что верифицировать можно через Foundry.
Время три часа дня. На раз-два быстренько запустил команду
forge verify-contract --mne-na-Tenderly и ... чудеса, получил ошибку вида Bytecode does not match deployed contract.Черт, но я ничего не менял в настройках деплоя! Версия компилятора, оптмизатор, все такое же, как и при деплое!Ладно, зову
Единственное, до чего дошли по итогу — это что Tenderly не поддерживает еще версию Solidity 0.8.35. Звучит очень странно, на фоне того, что уже как-бы 0.8.37 вышла. Причину ошибки, которую Tenderly, возможно, кидает в ответ из консоли прочитать невозможно.
Решил попробовать понизить версию контрактов, но сначала на легком тестовом, чтобы не ломать свои. Бахнул 0.8.27, как у них в примерах, и все прошло с первого раза. Хм, интересно, включил в голове бинарный поиск и выяснил, что 0.8.34 и все что до нее (даже 0.8.36) работают, но не моя 0.8.35.
Время уже вечер! Ну, думаю, пришло время написать куда-нибудь в Tenderly. У них есть чат прямо в приложении, я туда коротенько свою проблему описал и там создался тикет по моей проблеме, а я пошел довольный спать с мыслями, что видимо завтра у нас переезд на 0.8.[что-нибудь].
☀️ Утро вечера мудренее
Честно говоря, я ни на что не рассчитывал, потому что привык, что саппорт штука номинальная. Она вроде есть, но лучше кого-нибудь напрямую знать, чтобы чего-то получить полезного.
Какого же было мое удивление, когда утром я получил ответ о том, что проблема действительно есть и она на стороне Tenderly.
I reproduced it: verification with solc 0.8.35 currently fails on our side whenever the contract has a strict version pragma such as pragma solidity 0.8.35; or ^0.8.35. That's a bug in how we handle that compiler version, not a problem with your contract.
И даже вот пж, попробуй чисто для верификации в Tenderly поставить версию компилятора ^0.8.0.
Keep 0.8.35 selected as the compiler, but in the source you paste into the verification form loosen the pragma line to something like pragma solidity ^0.8.0;.
Откладываю все свои дела, не иду чистить зубы, пробую и вуаля, получаю результат. Все контракты моего проекта внутри дашборда Tenderly и верифицированы.
Вывод
Иногда саппорт лучше клода, а я уже забыл какого это, когда тебе помогают люди. Хотя не факт, что мне ответил человек 😅
В общем, очередной прекрасный опыт верификации (когда это уже закончится).
Ну а Tenderly мое почтение, это не только хороший продукт без которого я не мыслю разработку смарт-контрактов, но и великолепная поддержка. Приходите к нам на подкаст)
#павел_найданов
🤟 Сайт | ТГ-канал | Наш чат
