🚽 Tron: Три нюанса, о которых нет в доке.
1000 лет ничего не деплоил в замечательную сеть Tron. Ниже опишу то, с чем я столкнулся сегодня.
1️⃣ Опкод `mcopy` сломал компиляцию, хотя мой контракт его даже не использует
Наследовался от контракта из OpenZeppelin 5.6.1 — компиляция падает.
Оказалось, внутри зависимостей AccessControlEnumerable → EnumerableSet → Arrays
используется опкод MCOPY (EIP-5656), который доступен только с Cancun. У меня стояла версия для компиляции: 'istanbul'. Попотел над поиском проблемы знатно.
Отмечу, что я не сам придумал использовать istanbul, я взял это из доки TronBox 😡. Поэтому, если используете свежий OZ, то ставьте сразу 'cancun'.
2️⃣ TronBox тихо съедает аргумент конструктора
У меня скрипт деплоя чуть сложнее, чем деплой ERC-20. Конструктор принимает много параметров и я подумал, что хочу объединить все это в структуру Config. Тогда скрипт деплоя/миграции вот такой
...
const config = [param0, param1, ... , paramN]; // Массив (tuple) в деплой скрипте описывает мою структуру для конструктора моего контракта
await deployer.deploy(MyContract, config);
....
TronBox плюнул ошибку: constructor expected 1 arguments, received 0.
Прикол! Зову Гарри Поттера Claude, лезем в исходники самого TronBox. Внутри есть проверка typeof lastArg === "object", которая считает последний аргумент «опциями деплоя»... и массивы у JS тоже typeof === "object". Получается мой единственный аргумент TronBox принимал за опции деплоя и стирал.
Подсунул пустой объект последним аргументом, чтобы TronBox мог продолжить заниматься этим непотребством.
await deployer.deploy(MyContract, config, {});
Не передавайте массив как последний аргумент без {} и вообще будьте на стороже...
3️⃣ Больше не надо удалять дублиait deployer.deploy(MyContrруками во flatten файле для верификации.
Если вы хоть когда-нибудь деплоили в Tron, то вы знаете, что там нельзя верифицировать контракт привычным для EVM блокчейнов способом.
TronScan предлагает собрать контракт со всеми зависимостями в один файл, который он компилирует и проверяет. При этом Tron не умеет верифицировать набор файлов.
Самое нудное! Перед верификацией нужно удалить из этого собранного воедино файла дубли SPDX-License-Identifier. Если что, то это официальная рекомендация Tron! У меня их получилось ни много, ни мало 22 штуки.
И вот TronBox наконец-то подвез фичу, которая делает это за вас! Они заключили соглашение с клодом, чтобы тот научился мать вашу удалять дубли автоматически. Объясняешь клоду ситуацию и он все делает по-красоте. Я прям кайфанул, как-будто клод мне золотого бота написал для Polymarket!
Пожалуй это самое полезное, что для меня когда либо сделал Claude Code. Советую попробовать 😁
P.S. Третий пункт оказывается и правда исправлен в TronBox@4.6.0. У меня был TronBox@4.5.0, поэтому нужно было заниматься удалением дублей руками.
Поднял версию и проблемы больше нет. Снимаю шляпу, пост только вышел, а проблема уже исправлена)
#павел_найданов
🤟 Сайт | ТГ-канал | Наш чат
1000 лет ничего не деплоил в замечательную сеть Tron. Ниже опишу то, с чем я столкнулся сегодня.
1️⃣ Опкод `mcopy` сломал компиляцию, хотя мой контракт его даже не использует
Наследовался от контракта из OpenZeppelin 5.6.1 — компиляция падает.
Оказалось, внутри зависимостей AccessControlEnumerable → EnumerableSet → Arrays
используется опкод MCOPY (EIP-5656), который доступен только с Cancun. У меня стояла версия для компиляции: 'istanbul'. Попотел над поиском проблемы знатно.
Отмечу, что я не сам придумал использовать istanbul, я взял это из доки TronBox 😡. Поэтому, если используете свежий OZ, то ставьте сразу 'cancun'.
2️⃣ TronBox тихо съедает аргумент конструктора
У меня скрипт деплоя чуть сложнее, чем деплой ERC-20. Конструктор принимает много параметров и я подумал, что хочу объединить все это в структуру Config. Тогда скрипт деплоя/миграции вот такой
...
const config = [param0, param1, ... , paramN]; // Массив (tuple) в деплой скрипте описывает мою структуру для конструктора моего контракта
await deployer.deploy(MyContract, config);
....
TronBox плюнул ошибку: constructor expected 1 arguments, received 0.
Прикол! Зову Гарри Поттера Claude, лезем в исходники самого TronBox. Внутри есть проверка typeof lastArg === "object", которая считает последний аргумент «опциями деплоя»... и массивы у JS тоже typeof === "object". Получается мой единственный аргумент TronBox принимал за опции деплоя и стирал.
Подсунул пустой объект последним аргументом, чтобы TronBox мог продолжить заниматься этим непотребством.
await deployer.deploy(MyContract, config, {});
Не передавайте массив как последний аргумент без {} и вообще будьте на стороже...
3️⃣ Больше не надо удалять дублиait deployer.deploy(MyContrруками во flatten файле для верификации.
Если вы хоть когда-нибудь деплоили в Tron, то вы знаете, что там нельзя верифицировать контракт привычным для EVM блокчейнов способом.
TronScan предлагает собрать контракт со всеми зависимостями в один файл, который он компилирует и проверяет. При этом Tron не умеет верифицировать набор файлов.
Самое нудное! Перед верификацией нужно удалить из этого собранного воедино файла дубли SPDX-License-Identifier. Если что, то это официальная рекомендация Tron! У меня их получилось ни много, ни мало 22 штуки.
И вот TronBox наконец-то подвез фичу, которая делает это за вас! Они заключили соглашение с клодом, чтобы тот научился мать вашу удалять дубли автоматически. Объясняешь клоду ситуацию и он все делает по-красоте. Я прям кайфанул, как-будто клод мне золотого бота написал для Polymarket!
Пожалуй это самое полезное, что для меня когда либо сделал Claude Code. Советую попробовать 😁
P.S. Третий пункт оказывается и правда исправлен в TronBox@4.6.0. У меня был TronBox@4.5.0, поэтому нужно было заниматься удалением дублей руками.
Поднял версию и проблемы больше нет. Снимаю шляпу, пост только вышел, а проблема уже исправлена)
#павел_найданов
🤟 Сайт | ТГ-канал | Наш чат