Практика практике рознь
Практика для новичка в программировании является чуть ли не единственным способом обучения. Если просто смотреть видео или читать посты, можно уловить суть языка, но написать код в редакторе с полным пониманием "а зачем ты это пишешь?" - немного другое.
Мне всегда было проще учиться на примерах. И чем лучше становился мой навык владения кодом, тем сложнее требовались эти примеры. Вопрос был в том, а где их взять?
Когда год назад, я для практики с defi открыл код протокола Compound, то был немного в шоке от объема и сложности. Перешел на Uniswap... Лучше не стало.
На тот момент меня спасли конкурсные аудиты. Я смотрел различные репо и учился читать код профессиональных команд. Ловить связи функций, поток транзакций, писать тесты и многое другое.
Я подбирал для себя не самые сложные аудиты и рос вместе с ними.
Задачи ethernaut, dvd, capture the ether помогли мне понимать "внутреннюю кухню" функций и языка. Но и к ним нужно подходить с умом.
На третьем модуле я хочу передать этот опыт ученикам, чтобы ваш путь к разработке занял намного меньше времени, чем у меня.
Вы должны научиться не только писать свой код, но и разбираться в чужом. Брать от туда лучшие практики и паттерны, видеть проблемы и избегать их в своих проектах.
Это и будет основной темой третьего модуля.
Сегодня были открыты продажи. Успейте присоединиться!
Программа модуля. Реквизиты для оплаты
Старт 2 октября.
#курс
Практика для новичка в программировании является чуть ли не единственным способом обучения. Если просто смотреть видео или читать посты, можно уловить суть языка, но написать код в редакторе с полным пониманием "а зачем ты это пишешь?" - немного другое.
Мне всегда было проще учиться на примерах. И чем лучше становился мой навык владения кодом, тем сложнее требовались эти примеры. Вопрос был в том, а где их взять?
Когда год назад, я для практики с defi открыл код протокола Compound, то был немного в шоке от объема и сложности. Перешел на Uniswap... Лучше не стало.
На тот момент меня спасли конкурсные аудиты. Я смотрел различные репо и учился читать код профессиональных команд. Ловить связи функций, поток транзакций, писать тесты и многое другое.
Я подбирал для себя не самые сложные аудиты и рос вместе с ними.
Задачи ethernaut, dvd, capture the ether помогли мне понимать "внутреннюю кухню" функций и языка. Но и к ним нужно подходить с умом.
На третьем модуле я хочу передать этот опыт ученикам, чтобы ваш путь к разработке занял намного меньше времени, чем у меня.
Вы должны научиться не только писать свой код, но и разбираться в чужом. Брать от туда лучшие практики и паттерны, видеть проблемы и избегать их в своих проектах.
Это и будет основной темой третьего модуля.
Сегодня были открыты продажи. Успейте присоединиться!
Программа модуля. Реквизиты для оплаты
Старт 2 октября.
#курс
А время идет, так почему бы не начать уже сегодня?
18 первых учеников уже на канале третьего модуля! Успейте занять свое место!
Когда в июле запускался первый модуль курса, я писал, что к осени ученики могут получить крепкую основу для дальнейшего изучения Solidity, и что не стоит откладывать на потом свои желания начать что-либо.
Здорово, что многие тогда получили хороший заряд мотивации и пошли дальше программы. Некоторые из них уже пробуют получить первую работу или устроиться в зарубежную компанию на стажировку! Я верю в вас!
До нового года планируется еще два модуля - 3 (практический) и 4 (более специализированный). За это время вы сможете укрепить свои знания в Solidity, создать портфолио, которое можно показать работодателям, и, возможно, найти новую работу.
С третьим модулем мы начнем также создавать ваше резюме, которое можно будет показывать на собеседованиях. Работодатель будет видеть ваши наработки и уровень знаний!
Не теряйте время, пора начинать! Присоединяйтесь!
Программа модуля. Реквизиты для оплаты
Старт 2 октября.
Продажи только до конца недели!
#курс
18 первых учеников уже на канале третьего модуля! Успейте занять свое место!
Когда в июле запускался первый модуль курса, я писал, что к осени ученики могут получить крепкую основу для дальнейшего изучения Solidity, и что не стоит откладывать на потом свои желания начать что-либо.
Здорово, что многие тогда получили хороший заряд мотивации и пошли дальше программы. Некоторые из них уже пробуют получить первую работу или устроиться в зарубежную компанию на стажировку! Я верю в вас!
До нового года планируется еще два модуля - 3 (практический) и 4 (более специализированный). За это время вы сможете укрепить свои знания в Solidity, создать портфолио, которое можно показать работодателям, и, возможно, найти новую работу.
С третьим модулем мы начнем также создавать ваше резюме, которое можно будет показывать на собеседованиях. Работодатель будет видеть ваши наработки и уровень знаний!
Не теряйте время, пора начинать! Присоединяйтесь!
Программа модуля. Реквизиты для оплаты
Старт 2 октября.
Продажи только до конца недели!
#курс
👍1
Где и как искать работу в web3?
Популярный вопрос от учеников курса и участников данного канала. В этом посте хочу собрать некоторую общую информацию по вакансиям, требованиям и ресурсам для соискателей.
Сначала пройдемся по требованиям к разработчикам web3.
Прежде всего в вакансиях доминируют два языка: Solidity и Rust. Реже можно встретить требования к знаниям C, C++, Go, Huff и Vyper. Тем не менее, знание этих языков будет хорошим плюсом.
В некоторых компаниях разработчики смарт контрактов должны еще подключать фронтенд к смарт контрактам, поэтому встречаются требования JavaScript, TypeScript, React а также популярных библиотек, типа web3.js, ethers.js.
Также зачастую в мелких и средних компаниях разработчики должны писать тесты для своих контрактов. В связи с этим требуются знания одной из программ: Hardhat, Foundry, Truffle (уже крайне редко). На своем опыте могу сказать, что чаще всего в вакансиях требуется Foundry, так как он чуть быстрее и проще двух других.
Не меньшим плюсом, будут навыки работы с GitHub, Python, NPM.
При заполнении форм на какую-либо вакансию, с вероятностью 60-70%, вас попросят дать ссылку на ваш аккаунт в LinkedIn, Twitter и на GitHub.
Кстати, на GitHub лучше бы иметь пару тройку проектов, которые вы писали. За рубежом Ваш GitHub скажет намного больше, чем любое резюме.
Что же касается опыта в 2-3 года, то тут скорее происходит отсев не уверенных кандидатов. Вы вполне можете подавать свои резюме на эти позиции и пытаться пройти собеседование. При этом помните, кандидата без опыта раскусят сразу. Будьте готовы отвечать на каверзные вопросы и писать код прямо на собеседовании!
Где искать работу?
Для начала можно попробовать поискать тут:
1. https://cyberacademy.dev/jobs
2. https://career.habr.com/vacancies
3. Ну и наш хедхантер, хоть я к нему и отношусь не очень (тупой поиск и фильтр)
P.S. Есть еще фриланс сайты, типа upwork, но рекомендовать не стану, так как у самого там не особо получалось. Но некоторые находити там подработку.
Больше вакансий можно найти на зарубежных порталах:
1. https://cryptojobslist.com/solidity
2. https://cryptocurrencyjobs.co/
3. https://crypto.jobs/
4. https://web3.career/crypto-jobs
5. https://www.indeed.com/q-Blockchain-Developer-jobs.html
6. https://beincrypto.com/jobs/
7. https://www.glassdoor.co.in/
Ну, и, конечно, LinkedIn с разделом вакансий по региону. Вероятно, это одно из самых популярных мест для поиска на западном рынке.
Можно также отслеживать новые вакансии на проектах, которые вам нравятся, типа Bibance, Immunefi и т.д. Только учтите, что на популярных проектах требования гораздо выше, как и конкуренция.
Также я крайне рекомендую зарегистрироваться в Дискорде и вступить в группы:
1. Web3SecurityDAO;
2. Guardian Audits;
3. Code4rena;
4. Immunefi;
Иногда там в чатах, или даже в отдельных топиках, проскальзывают вакансии от компаний, которые больше нигде не публикуются.
Можно также подписаться на некоторые чаты в Телеграм, где также иногда размещаются вакансии:
1. https://news.1rj.ru/str/eth_ru
2. https://news.1rj.ru/str/eth_jobs
3. https://news.1rj.ru/str/eth_dev
4. https://news.1rj.ru/str/cyberacademy
5. https://news.1rj.ru/str/lobsters_hr
6. https://news.1rj.ru/str/blockchainjunauditors
Главный вопрос: Можно ли найти работу, зная только Solidity?
Можно. Но будет чуть труднее.
Главным козырем у вас должен стать ваш GitHub, на котором будут размещены ваши проекты, наработки, тесты, решения задач и т.д.
Поэтому, если давать только один совет для поиска работы, то он будет звучать как - оформите свой GitHub! Считайте это как Инстаграм для мастера по ноготочкам, или отзыв близкого друга об автомастерской.
Ну, вот как бы так. Если у вас есть, что добавить, напишите в комментариях для других участников чата. Давайте вместе создадим крутой гайд по поиску работы!
P.S. Сохраняйте себе, чтобы не потерять. Буду благодарен репостам)
#job
Популярный вопрос от учеников курса и участников данного канала. В этом посте хочу собрать некоторую общую информацию по вакансиям, требованиям и ресурсам для соискателей.
Сначала пройдемся по требованиям к разработчикам web3.
Прежде всего в вакансиях доминируют два языка: Solidity и Rust. Реже можно встретить требования к знаниям C, C++, Go, Huff и Vyper. Тем не менее, знание этих языков будет хорошим плюсом.
В некоторых компаниях разработчики смарт контрактов должны еще подключать фронтенд к смарт контрактам, поэтому встречаются требования JavaScript, TypeScript, React а также популярных библиотек, типа web3.js, ethers.js.
Также зачастую в мелких и средних компаниях разработчики должны писать тесты для своих контрактов. В связи с этим требуются знания одной из программ: Hardhat, Foundry, Truffle (уже крайне редко). На своем опыте могу сказать, что чаще всего в вакансиях требуется Foundry, так как он чуть быстрее и проще двух других.
Не меньшим плюсом, будут навыки работы с GitHub, Python, NPM.
При заполнении форм на какую-либо вакансию, с вероятностью 60-70%, вас попросят дать ссылку на ваш аккаунт в LinkedIn, Twitter и на GitHub.
Кстати, на GitHub лучше бы иметь пару тройку проектов, которые вы писали. За рубежом Ваш GitHub скажет намного больше, чем любое резюме.
Что же касается опыта в 2-3 года, то тут скорее происходит отсев не уверенных кандидатов. Вы вполне можете подавать свои резюме на эти позиции и пытаться пройти собеседование. При этом помните, кандидата без опыта раскусят сразу. Будьте готовы отвечать на каверзные вопросы и писать код прямо на собеседовании!
Где искать работу?
Для начала можно попробовать поискать тут:
1. https://cyberacademy.dev/jobs
2. https://career.habr.com/vacancies
3. Ну и наш хедхантер, хоть я к нему и отношусь не очень (тупой поиск и фильтр)
P.S. Есть еще фриланс сайты, типа upwork, но рекомендовать не стану, так как у самого там не особо получалось. Но некоторые находити там подработку.
Больше вакансий можно найти на зарубежных порталах:
1. https://cryptojobslist.com/solidity
2. https://cryptocurrencyjobs.co/
3. https://crypto.jobs/
4. https://web3.career/crypto-jobs
5. https://www.indeed.com/q-Blockchain-Developer-jobs.html
6. https://beincrypto.com/jobs/
7. https://www.glassdoor.co.in/
Ну, и, конечно, LinkedIn с разделом вакансий по региону. Вероятно, это одно из самых популярных мест для поиска на западном рынке.
Можно также отслеживать новые вакансии на проектах, которые вам нравятся, типа Bibance, Immunefi и т.д. Только учтите, что на популярных проектах требования гораздо выше, как и конкуренция.
Также я крайне рекомендую зарегистрироваться в Дискорде и вступить в группы:
1. Web3SecurityDAO;
2. Guardian Audits;
3. Code4rena;
4. Immunefi;
Иногда там в чатах, или даже в отдельных топиках, проскальзывают вакансии от компаний, которые больше нигде не публикуются.
Можно также подписаться на некоторые чаты в Телеграм, где также иногда размещаются вакансии:
1. https://news.1rj.ru/str/eth_ru
2. https://news.1rj.ru/str/eth_jobs
3. https://news.1rj.ru/str/eth_dev
4. https://news.1rj.ru/str/cyberacademy
5. https://news.1rj.ru/str/lobsters_hr
6. https://news.1rj.ru/str/blockchainjunauditors
Главный вопрос: Можно ли найти работу, зная только Solidity?
Можно. Но будет чуть труднее.
Главным козырем у вас должен стать ваш GitHub, на котором будут размещены ваши проекты, наработки, тесты, решения задач и т.д.
Поэтому, если давать только один совет для поиска работы, то он будет звучать как - оформите свой GitHub! Считайте это как Инстаграм для мастера по ноготочкам, или отзыв близкого друга об автомастерской.
Ну, вот как бы так. Если у вас есть, что добавить, напишите в комментариях для других участников чата. Давайте вместе создадим крутой гайд по поиску работы!
P.S. Сохраняйте себе, чтобы не потерять. Буду благодарен репостам)
#job
👍34🔥3
Три дня до конца продаж на 3 модуль курса
На следующей неделе, уже с понедельника, стартует обучение на третьем модуле нашего курса.
За один месяц вы сможете прокачать свои навыки Solidity разработчика, как если бы обучались сами несколько месяцев!
Это будет самая интенсивная группа, направленная именно на практику с кодом и сопутствующими программами.
Конечно, всю информацию можно найти и в сети на профильных порталах, но здесь она собрана и организована так, чтобы ученики не бросали обучение после первых трудностей. Вы всегда сможете задать вопрос в чате курса или мне в личные сообщения и разобраться с проблемой.
Если вы хотели попробовать что-то новое этой осенью, пусть это будет третий модуль курса!
Программа модуля. Реквизиты для оплаты
Старт 2 октября.
Продажи только до конца недели!
#курс
На следующей неделе, уже с понедельника, стартует обучение на третьем модуле нашего курса.
За один месяц вы сможете прокачать свои навыки Solidity разработчика, как если бы обучались сами несколько месяцев!
Это будет самая интенсивная группа, направленная именно на практику с кодом и сопутствующими программами.
Конечно, всю информацию можно найти и в сети на профильных порталах, но здесь она собрана и организована так, чтобы ученики не бросали обучение после первых трудностей. Вы всегда сможете задать вопрос в чате курса или мне в личные сообщения и разобраться с проблемой.
Если вы хотели попробовать что-то новое этой осенью, пусть это будет третий модуль курса!
Программа модуля. Реквизиты для оплаты
Старт 2 октября.
Продажи только до конца недели!
#курс
👍3🔥2👎1😁1🤣1
Цикл постов на канале по Foundry
К планируемому запуску проекта этой осенью, о котором писал ранее, я хочу сам еще раз пройтись по программе Foundry и повторить многие моменты с написанием тестов для смарт контрактов.
И я подумал, а что если на канале в бесплатном формате сделать цикл постов-уроков по работе с Foundry с нуля?
Показать, как пишутся тесты, фаз и инвариант тесты, подключение defi контрактов, форки и т.д. Сначала по каждому из пунктов в отдельности, потом уже практическая часть.
Так я смогу повторить основные моменты Foundry, многие из вас начнут осваивать тесты с этой средой, а другие - подскажут, как сделать лучше.
В итоге получится детальный гайд по работе с данной программой на русском языке.
P.S. Думаю начать писать уроки где-то через неделю-две, после того как разберусь с текущими задачами.
#foundry
К планируемому запуску проекта этой осенью, о котором писал ранее, я хочу сам еще раз пройтись по программе Foundry и повторить многие моменты с написанием тестов для смарт контрактов.
И я подумал, а что если на канале в бесплатном формате сделать цикл постов-уроков по работе с Foundry с нуля?
Показать, как пишутся тесты, фаз и инвариант тесты, подключение defi контрактов, форки и т.д. Сначала по каждому из пунктов в отдельности, потом уже практическая часть.
Так я смогу повторить основные моменты Foundry, многие из вас начнут осваивать тесты с этой средой, а другие - подскажут, как сделать лучше.
В итоге получится детальный гайд по работе с данной программой на русском языке.
P.S. Думаю начать писать уроки где-то через неделю-две, после того как разберусь с текущими задачами.
#foundry
👍28🔥9
Цикл постов про Foundry - 2
Рад, что так позитивно восприняли идею о постах-уроках по Foundry.
Потихоньку собираю кейсы, которые нужно будет осветить в практике. И тут вопрос для вас:
Какие были проблемы с тестами Foundry? Что не получалось и что вызывало вопросы?
Просто в комментах напишите.
#foundry
Рад, что так позитивно восприняли идею о постах-уроках по Foundry.
Потихоньку собираю кейсы, которые нужно будет осветить в практике. И тут вопрос для вас:
Какие были проблемы с тестами Foundry? Что не получалось и что вызывало вопросы?
Просто в комментах напишите.
#foundry
👍1
⚡️⚡️⚡️ Менее 12 часов до закрытия продаж! ⚡️⚡️⚡️
Сегодня последний день продаж доступа на третий модуль курса. Если опоздаете, то придется ждать следующего потока!
Напомню, в этот раз мы будем настраивать рабочую среду для профессиональной разработки смарт контрактов, изучать протоколы и многие аспекты кода, работать с безопасностью и решать задачи .
У нас уже набралась достаточно большая группа учеников, поэтому с понедельника, с началом курса, продаж не будет совсем!
Успейте занять свое место!
Программа модуля
Условия и оплата
Старт 2 октября!
#курс
Сегодня последний день продаж доступа на третий модуль курса. Если опоздаете, то придется ждать следующего потока!
Напомню, в этот раз мы будем настраивать рабочую среду для профессиональной разработки смарт контрактов, изучать протоколы и многие аспекты кода, работать с безопасностью и решать задачи .
У нас уже набралась достаточно большая группа учеников, поэтому с понедельника, с началом курса, продаж не будет совсем!
Успейте занять свое место!
Программа модуля
Условия и оплата
Старт 2 октября!
#курс
👍1
Темы для цикла постов по Foundry
Я продолжаю собирать темы для небольшого цикла обучающих постов по написанию тестов на Foundry. Пока что удалось собрать небольшой список:
1. Установка и настройка Foundry;
2. Основные команды в терминале;
3. Настройка remapping;
4. Взаимодействие hardhat и Foundry;
5. Популярные команды cast;
6. Локальный блокчейн Anvil;
7. Разбор читкодов;
8. Разбор библиотек для тестов;
9. Разбор traces;
10. Простые тесты;
11. Fuzz тесты;
12. Тесты инвариантов;
13. Differential Testing;
14. Работа с форками;
15. Деплой и верификация;
16. Дебаггер;
17. Работа с компилятором в тестах;
18. Отправка транзакций в разных блоках;
19. Тестирование для L2 сетей;
20. Тестирование для ZK Sync;
21. Работа с газом;
22. Разбор уже написанных тестов на протоколе;
23. Работа с отчетами;
24. Проведение прицельных тестов: на контракт, на функцию.
25. Подключение etherscan, infura, alchemy для тестов;
UPD. 26. Тестирование прокси контрактов
UPD. 27. Тестирование работы с chainlink
UPD. 28. Тестирование мостов
Начну выкладывать цикл недели через две, когда на основном курсе от канала пройдем темы с программами для тестов.
Пока что, буду рад, если накидаете еще темы или вопросы, которые у вас возникали при написании тестов.
У меня пока что самая большая проблема в способности быстро разобраться с уже готовыми тестами протокола и подключить свои. В том плане, что обычно уходит несколько часов или даже день для этого, а хотелось бы выработать стратегия, чтобы все получалось быстрее.
#foundry
Я продолжаю собирать темы для небольшого цикла обучающих постов по написанию тестов на Foundry. Пока что удалось собрать небольшой список:
1. Установка и настройка Foundry;
2. Основные команды в терминале;
3. Настройка remapping;
4. Взаимодействие hardhat и Foundry;
5. Популярные команды cast;
6. Локальный блокчейн Anvil;
7. Разбор читкодов;
8. Разбор библиотек для тестов;
9. Разбор traces;
10. Простые тесты;
11. Fuzz тесты;
12. Тесты инвариантов;
13. Differential Testing;
14. Работа с форками;
15. Деплой и верификация;
16. Дебаггер;
17. Работа с компилятором в тестах;
18. Отправка транзакций в разных блоках;
19. Тестирование для L2 сетей;
20. Тестирование для ZK Sync;
21. Работа с газом;
22. Разбор уже написанных тестов на протоколе;
23. Работа с отчетами;
24. Проведение прицельных тестов: на контракт, на функцию.
25. Подключение etherscan, infura, alchemy для тестов;
UPD. 26. Тестирование прокси контрактов
UPD. 27. Тестирование работы с chainlink
UPD. 28. Тестирование мостов
Начну выкладывать цикл недели через две, когда на основном курсе от канала пройдем темы с программами для тестов.
Пока что, буду рад, если накидаете еще темы или вопросы, которые у вас возникали при написании тестов.
У меня пока что самая большая проблема в способности быстро разобраться с уже готовыми тестами протокола и подключить свои. В том плане, что обычно уходит несколько часов или даже день для этого, а хотелось бы выработать стратегия, чтобы все получалось быстрее.
#foundry
👍10🔥7❤1
Рекомендации по работе с биржей
Не так давно на канале появилась небольшая биржа с участниками, у которых вы можете заказать разработку смарт контрактов, написание тестов, аудит или даже частные уроки.
Хотел бы дать несколько советов по организации работы в случае заказа.
1. Когда обращаетесь к исполнителю имейте четкое Техническое задание на руках, что бы разработчик смог оценить сроки и стоимость более адекватно. Если же у вас нет ТЗ, то оговорите это с исполнителем и попросите помочь составить грамотное ТЗ.
При этом не обижайтесь и не беситесь, если исполнитель не захочет этого делать по какой-либо причине.
2. Оговаривайте сроки исполнения. Всегда должны быть четкие рамки по выполнению услуг. Даже на простой контракт нужно выделить минимум неделю.
3. Оговаривайте стоимость и процесс оплаты. Тут уже на свое усмотрение: либо с авансовым платежом, либо по факту выполеных работы, либо 100% предоплата.
Лично я люблю работать по системе каскадных платежей: когда срок работ разбивается на несколько фаз, и каждая оплачивается по факту выполнения. Это может подойти не для всех, просто описываю свой способ работы.
4. Фиксируйте договоренности! Создавайте простой договор на исполнение услуг, где, за подписями обеих сторон, укажите объем работ, сроки, стоимость, сроки оплаты, ожидаемые результаты и детальное ТЗ.
5. Описывайте результаты и ожидания от выполненных работ. Взгляды на мир, как и на результат работ, может быть разным у исполнителя и заказчика. Вы должны описать, что хотите получить в результате и как это будет работать.
6. Не бойтесь прописывать штрафы за несоблюдение сроков. Это очень спорный момент при работе с заказами, но я считаю, что он должен быть зафиксирован. Штраф может быть, как за затяжку разработки, так и за затяжку оплаты.
7. Перед выбором исполнителя, попробуйте сделать небольшой поиск по нему в группах. Посмотрите, как он отвечал на вопросы, какие советы давал, чем делился. Обязательно посмотрите его GitHub или другое портфолио.
8. Не "долбите" в личку исполнителю. Это частая проблема, когда заказчик хочет контролировать весь процесс поминутно, и ожидает, что исполнитель должен быть на связи каждый день с 6 утра и до 1 часу ночи. Это не так. Лучше оговорите с ним, в какие дни и в какое время вы будете просить отчет о проделанной работе.
9. Любые дополнения к работе, "хотелки" и правки должны оплачиваться отдельно, а сроки исполнения договора увеличиваться. Не ждите, что по ходу исполнения первоначального заказа, вы сможете повышать объем работ и их сложность за ту же цену. Это все занимает время исполнителя.
Такие пункты должны фиксироваться с отдельном, дополнительном договоре.
10. Отзывы об исполнителе. После выполнения работ, вы можете поделиться отзывом на канале. Наш рынок web3 разработчиков довольно маленький, и репутация здесь крайне важна.
11. В случае возникновения споров, вы всегда можете спросить совета в чате этого канала или любого другого, описав ситуацию и проблему, без перехода на личности. Сообщество поможет разобраться и подсказать выход из сложившейся ситуации.
Работайте честно и адекватно!
Напомню, ссылку на пост с исполнителями, там вы сможете заказать услугу:
https://news.1rj.ru/str/solidityset/874
Всем приятной недели!
#market
Не так давно на канале появилась небольшая биржа с участниками, у которых вы можете заказать разработку смарт контрактов, написание тестов, аудит или даже частные уроки.
Хотел бы дать несколько советов по организации работы в случае заказа.
1. Когда обращаетесь к исполнителю имейте четкое Техническое задание на руках, что бы разработчик смог оценить сроки и стоимость более адекватно. Если же у вас нет ТЗ, то оговорите это с исполнителем и попросите помочь составить грамотное ТЗ.
При этом не обижайтесь и не беситесь, если исполнитель не захочет этого делать по какой-либо причине.
2. Оговаривайте сроки исполнения. Всегда должны быть четкие рамки по выполнению услуг. Даже на простой контракт нужно выделить минимум неделю.
3. Оговаривайте стоимость и процесс оплаты. Тут уже на свое усмотрение: либо с авансовым платежом, либо по факту выполеных работы, либо 100% предоплата.
Лично я люблю работать по системе каскадных платежей: когда срок работ разбивается на несколько фаз, и каждая оплачивается по факту выполнения. Это может подойти не для всех, просто описываю свой способ работы.
4. Фиксируйте договоренности! Создавайте простой договор на исполнение услуг, где, за подписями обеих сторон, укажите объем работ, сроки, стоимость, сроки оплаты, ожидаемые результаты и детальное ТЗ.
5. Описывайте результаты и ожидания от выполненных работ. Взгляды на мир, как и на результат работ, может быть разным у исполнителя и заказчика. Вы должны описать, что хотите получить в результате и как это будет работать.
6. Не бойтесь прописывать штрафы за несоблюдение сроков. Это очень спорный момент при работе с заказами, но я считаю, что он должен быть зафиксирован. Штраф может быть, как за затяжку разработки, так и за затяжку оплаты.
7. Перед выбором исполнителя, попробуйте сделать небольшой поиск по нему в группах. Посмотрите, как он отвечал на вопросы, какие советы давал, чем делился. Обязательно посмотрите его GitHub или другое портфолио.
8. Не "долбите" в личку исполнителю. Это частая проблема, когда заказчик хочет контролировать весь процесс поминутно, и ожидает, что исполнитель должен быть на связи каждый день с 6 утра и до 1 часу ночи. Это не так. Лучше оговорите с ним, в какие дни и в какое время вы будете просить отчет о проделанной работе.
9. Любые дополнения к работе, "хотелки" и правки должны оплачиваться отдельно, а сроки исполнения договора увеличиваться. Не ждите, что по ходу исполнения первоначального заказа, вы сможете повышать объем работ и их сложность за ту же цену. Это все занимает время исполнителя.
Такие пункты должны фиксироваться с отдельном, дополнительном договоре.
10. Отзывы об исполнителе. После выполнения работ, вы можете поделиться отзывом на канале. Наш рынок web3 разработчиков довольно маленький, и репутация здесь крайне важна.
11. В случае возникновения споров, вы всегда можете спросить совета в чате этого канала или любого другого, описав ситуацию и проблему, без перехода на личности. Сообщество поможет разобраться и подсказать выход из сложившейся ситуации.
Работайте честно и адекватно!
Напомню, ссылку на пост с исполнителями, там вы сможете заказать услугу:
https://news.1rj.ru/str/solidityset/874
Всем приятной недели!
#market
❤2👍1
Бесплатный курс от Statemind
Ребята из Statemind попросили поделиться информацией о наборе на свой бесплатный курс Smart Contract Security Specialist.
Кратно об обучении:
• Обучение онлайн
• Длительность 4 недели
• Обучение на английском/русском языках
• Отбор проводим по входному тесту (в форме)
• После успешного прохождения программы проводим интервью и по результатам предлагаем возможность присоединиться к нашей команде в качестве интерна (мы работаем удаленно)
• Обучение с нашей стороны бесплатное, потому что основная наша задача - найти единомышленников
• Помогаем с релокацией
В программе курса:
• Introduction to blockchain
• DeFi primitives
• DeFi security
Подробная информация и форма для заполнения для тех, кому будет интересно
https://docs.google.com/forms/d/e/1FAIpQLSfdCWi1HYlU1nZs62WwwYA-PZZi7msTqpHnpBtMOARFPer2vg/viewform?usp=sf_link
Залетайте!
P.S. Подчеркну, что потребуется знание английского языка!
#statemind #security
Ребята из Statemind попросили поделиться информацией о наборе на свой бесплатный курс Smart Contract Security Specialist.
Кратно об обучении:
• Обучение онлайн
• Длительность 4 недели
• Обучение на английском/русском языках
• Отбор проводим по входному тесту (в форме)
• После успешного прохождения программы проводим интервью и по результатам предлагаем возможность присоединиться к нашей команде в качестве интерна (мы работаем удаленно)
• Обучение с нашей стороны бесплатное, потому что основная наша задача - найти единомышленников
• Помогаем с релокацией
В программе курса:
• Introduction to blockchain
• DeFi primitives
• DeFi security
Подробная информация и форма для заполнения для тех, кому будет интересно
https://docs.google.com/forms/d/e/1FAIpQLSfdCWi1HYlU1nZs62WwwYA-PZZi7msTqpHnpBtMOARFPer2vg/viewform?usp=sf_link
Залетайте!
P.S. Подчеркну, что потребуется знание английского языка!
#statemind #security
👍13❤6🔥1👌1
Event argument indexing
event Transfer(address from, address to, uint256 amount);
События в Solidity являются своего рода абстракцией над системой логирования для Ethereum Virtual Machine. DApps могут подписываться и слушать события через RPC-интерфейс клиента Ethereum. При отправке события, параметры сохраняются в специальный журнал транзакций.
Для чего нужны Events?
1. Прослушивание событий. Необходимо для оперативного реагирования на изменения во внешнем интерфейсе.
2. Для тестирования. В тестах можно получать события со смарт-контрактов с данными транзакции и проверять их.
3. Для восстановления состояния хранилища. Все события хранятся в журнале EVM и могут быть прочитаны.
4. Создание сабграфов. Для агрегации, конвертации и упрощения чтения данных из блокчейна.
Возможны и другие области применения событий.
Чуть глубже в события
Сама запись в журнале EVM может состоять из двух частей:
- topic
- data
Topic – это 32-байтные слова, которые используются для описания того, что происходит в событии. Например, трансфер от одного адреса к другому.
Data – это закодированные данные. Например, количество токенов переданных при трансфере.
EVM предоставляет 5 opcodes для логирования событий в журнал.
LOG0, LOG1, LOG2, LOG3, LOG4
Каждый код операции (LOG0 … LOG4) служит для указания количества тем, которые необходимо включить в запись журнала. Например, LOG1 включает один topic, а LOG4 включает четыре topics. Таким образом, максимальное количество topics, которые могут быть включены в одну запись журнала, равно четырем.
Первый topic всегда является signature события с типами. Другими словами он представлен, как hash keccak(Transfer(address,address,uint256)). Таким образом для своих событий остается возможность добавить еще 3 параметра в topics.
В Solidity для того, чтобы указать, какой параметр необходимо добавить в topic используется ключевое слово indexed перед названием параметра. Например,
Transfer(address indexed from, address indexed to, uint256 value)
Получается, параметры параметры событий бывают двух типов:
1. indexed
2. non-indexed
Параметры с атрибутом indexed будут записаны в topic записи журнала EVM. Все остальные параметры автоматически становятся non-indexed и будут добавлены в специальную структуру данных(data) записи журнала EVM.
Для чего нужны indexed параметры?
Каждый indexed параметр создает topic. Этот параметр исключается из данных и не кодируется. По этому параметру можно обеспечить эффективный поиск. Для этого используются фильтры Блума.
P.S. Из цикла для приглашенных авторов.
Полную версию статьи можно почитать в репо команды MetaLamp. Добавляйте их wiki к себе в избранное и не пропускайте новые материалы.
#indexed #bloom #events
event Transfer(address from, address to, uint256 amount);
События в Solidity являются своего рода абстракцией над системой логирования для Ethereum Virtual Machine. DApps могут подписываться и слушать события через RPC-интерфейс клиента Ethereum. При отправке события, параметры сохраняются в специальный журнал транзакций.
Для чего нужны Events?
1. Прослушивание событий. Необходимо для оперативного реагирования на изменения во внешнем интерфейсе.
2. Для тестирования. В тестах можно получать события со смарт-контрактов с данными транзакции и проверять их.
3. Для восстановления состояния хранилища. Все события хранятся в журнале EVM и могут быть прочитаны.
4. Создание сабграфов. Для агрегации, конвертации и упрощения чтения данных из блокчейна.
Возможны и другие области применения событий.
Чуть глубже в события
Сама запись в журнале EVM может состоять из двух частей:
- topic
- data
Topic – это 32-байтные слова, которые используются для описания того, что происходит в событии. Например, трансфер от одного адреса к другому.
Data – это закодированные данные. Например, количество токенов переданных при трансфере.
EVM предоставляет 5 opcodes для логирования событий в журнал.
LOG0, LOG1, LOG2, LOG3, LOG4
Каждый код операции (LOG0 … LOG4) служит для указания количества тем, которые необходимо включить в запись журнала. Например, LOG1 включает один topic, а LOG4 включает четыре topics. Таким образом, максимальное количество topics, которые могут быть включены в одну запись журнала, равно четырем.
Первый topic всегда является signature события с типами. Другими словами он представлен, как hash keccak(Transfer(address,address,uint256)). Таким образом для своих событий остается возможность добавить еще 3 параметра в topics.
В Solidity для того, чтобы указать, какой параметр необходимо добавить в topic используется ключевое слово indexed перед названием параметра. Например,
Transfer(address indexed from, address indexed to, uint256 value)
Получается, параметры параметры событий бывают двух типов:
1. indexed
2. non-indexed
Параметры с атрибутом indexed будут записаны в topic записи журнала EVM. Все остальные параметры автоматически становятся non-indexed и будут добавлены в специальную структуру данных(data) записи журнала EVM.
Для чего нужны indexed параметры?
Каждый indexed параметр создает topic. Этот параметр исключается из данных и не кодируется. По этому параметру можно обеспечить эффективный поиск. Для этого используются фильтры Блума.
P.S. Из цикла для приглашенных авторов.
Полную версию статьи можно почитать в репо команды MetaLamp. Добавляйте их wiki к себе в избранное и не пропускайте новые материалы.
#indexed #bloom #events
🔥4❤1👏1
Function pointer как аргумент
Для начала посмотрите на код ниже:
В предыдущем примере у нас есть три функции. f1 - самая простая и возвращает то, что получает в аргументах.
f2 функция с function pointer a ожидает в качестве аргумента функцию со специальной сигнатурой.
В f3 мы вызываем функцию f2 и передаем функцию f1, как параметр. И в данном примере она просто вернет число 27.
Достаточно необычный и редкий формат функций в смарт контрактах. Даже в конкурсных аудитах за все время я встречал их один или два раза.
#function #pointer
Для начала посмотрите на код ниже:
contract FunctionPointer {
function f1(uint256 x) internal pure returns(uint256) {
return x;
}
function f2(function(uint256) internal pure returns(uint256) a) internal pure returns(uint256) {
return a(27);
}
function f3() public pure returns(uint256) {
return f2(f1);
}
}
В Solidity вы можете создавать функции, которые будут принимать другие функции в качестве аргументов. Они называются function pointer.В предыдущем примере у нас есть три функции. f1 - самая простая и возвращает то, что получает в аргументах.
f2 функция с function pointer a ожидает в качестве аргумента функцию со специальной сигнатурой.
В f3 мы вызываем функцию f2 и передаем функцию f1, как параметр. И в данном примере она просто вернет число 27.
Достаточно необычный и редкий формат функций в смарт контрактах. Даже в конкурсных аудитах за все время я встречал их один или два раза.
#function #pointer
👍3🔥2
ERC-1363: Payable Token
Стандарт ERC-1363 реализует расширение токена ERC-20 для выполнения произвольного кода сразу после вызова
Важно! Стандарт ERC-1363 является расширением стандарта ERC-20 и полностью обратно совместимым. То есть, он не переопределяет стандартные функции
Стандарт IERC1363.sol расширяет реализацию токена ERC-20 новыми функциями.
Для выполнения кода после вызова
P.S. Про другие стандарты, такие как ERC-165 и ERC-4337 можно почитать в wiki от студии web3 разработки MetaLamp.
#erc1363 #token
Стандарт ERC-1363 реализует расширение токена ERC-20 для выполнения произвольного кода сразу после вызова
transfer(), transferFrom() или approve() в рамках одной транзакции. Этот стандарт позволяет выполнить две транзакции в одной и избежать излишней оплаты за газ.Важно! Стандарт ERC-1363 является расширением стандарта ERC-20 и полностью обратно совместимым. То есть, он не переопределяет стандартные функции
transfer(), transferFrom() или approve().Стандарт IERC1363.sol расширяет реализацию токена ERC-20 новыми функциями.
interface IERC1363 is IERC20, IERC165 {
function transferAndCall(address to, uint256 amount) external returns (bool);
function transferAndCall(address to, uint256 amount, bytes calldata data) external returns (bool);
function transferFromAndCall(address from, address to, uint256 amount) external returns (bool);
function transferFromAndCall(address from, address to, uint256 amount, bytes calldata data) external returns (bool);
function approveAndCall(address spender, uint256 amount) external returns (bool);
function approveAndCall(address spender, uint256 amount, bytes calldata data) external returns (bool);
}
Работает это следующим образом: вызов любой из этих функций сначала выполняет вызов соответсвующей функции в ERC-20, а затем делает дополнительный вызов на адресе получателя токенов или кому выдавался approve(). Например, transferAndCall(), под капотом, делает стандартный вызов функции transfer(), а затем делает дополнительный вызов функции на адресе получателя токена.Для выполнения кода после вызова
transfer() или transferFrom() получатель токена должен быть контрактом и реализовывать интерфейс IERC1363Receiver.solinterface IERC1363Receiver {
function onTransferReceived(address spender, address sender, uint256 amount, bytes ?calldata data) external returns (bytes4);
}
Репозиторий и документация с примерами реализации стандарта от Vittorio Minacori, который является автором стандарта ERC-1363: Payable TokenP.S. Про другие стандарты, такие как ERC-165 и ERC-4337 можно почитать в wiki от студии web3 разработки MetaLamp.
#erc1363 #token
👍2
RACE #22 Of The Secureum Bootcamp Epoch
Не теряйте, у меня очень много событий сейчас происходит, что времени остаётся только на основной курс и немного на конкурсные аудиты. С понедельника уже пойдем по Foundry.
А сейчас хочу предложить вам немного попрактиковаться с кодом и пройти небольшой тест Race. В этот раз его написал Tincho - ментор Secureum, создатель Damn Vulnerable DeFi и The Red Guild.
Мини тест, как всегда прекрасен!
RACE #22 Of The Secureum Bootcamp Epoch
У кого сколько получилось?
#race
Не теряйте, у меня очень много событий сейчас происходит, что времени остаётся только на основной курс и немного на конкурсные аудиты. С понедельника уже пойдем по Foundry.
А сейчас хочу предложить вам немного попрактиковаться с кодом и пройти небольшой тест Race. В этот раз его написал Tincho - ментор Secureum, создатель Damn Vulnerable DeFi и The Red Guild.
Мини тест, как всегда прекрасен!
RACE #22 Of The Secureum Bootcamp Epoch
У кого сколько получилось?
#race
👍2
Foundry с нуля: Установка. Часть 0
С сегодняшнего дня мы постепенно начинаем изучать Foundry на канале.
Я готовлю проект на эту тему и хотел бы сам все повторить с нуля и разобраться в некоторых тонкостях тестирования смарт контрактов. Примерные темы, которые ожидаются можно найти в этом посте:
https://news.1rj.ru/str/solidityset/898
Как будет строиться прохождение?
Сначала пройдемся по документации Foundry, чтобы вы знали, что там представлено, и где найти информацию в случае необходимости. Поговорим об установке, о chisel и anvil, опишем некоторые cast команды и читкоды.
После этого уже приступим к самим тестам.
Я постараюсь к каждому посту, где будет идти речь о тестах, прикладывать файлы, для более визуального представление и практики.
В целом, хочется чтобы получился детальный цикл постов "от А до Я".
Установка Foundry
Сразу скажу, для того, чтобы работать с Foundry вам нужно будет знать Solidity, так как тесты для контрактов пишутся именно на этом языке.
Полный процесс установки можно найти по этой ссылке:
https://book.getfoundry.sh/getting-started/installation
Обычно установка может быть осуществлена с помощью простой команды:
curl -L https://foundry.paradigm.xyz | bash
Это установит FoundryUp - установщик Foundry, который после сможет обновлять и поддерживать среду с более простыми командами.
Нужно сказать, что FoundryUp пока не поддерживается терминалами CMD или PowerShell, которые идут в Windows, поэтому установка там чуть сложнее.
Для этого предусмотрен немного другой пошаговый гайд:
1. Скачиваем Rust и его пакетный менеджер Cargo:
https://www.rust-lang.org/learn/get-started
2. Скачиваем Visual Studio с опцией "Desktop Development With C++"
https://visualstudio.microsoft.com/downloads/
3. Ну, и Git Bash, если у кого еще нет:
https://gitforwindows.org/
После этого можно будет выполнить команду:
P.S. Для слабых и средних по мощности компьютеров весь процесс может занять до 1,5 - 2 часов!
Также для пользователей Docker есть возможность установки Foundry с командой:
https://book.getfoundry.sh/tutorials/foundry-docker
Проверить, что все установилось правильно можно попытавшись создать новый проект Foundry:
1. Создайте новую папку и откройте ее в редакторе кода;
2. В терминале редактора выполните команду: forge init
3. Если в папке появились файлы типа src, test, foundry.toml, то все ок. Если же нет - спрашивайте в чате совета или смотрите документацию.
Задание
1. Установить Foundry на свой компьютер.
#foundry #lesson0
С сегодняшнего дня мы постепенно начинаем изучать Foundry на канале.
Я готовлю проект на эту тему и хотел бы сам все повторить с нуля и разобраться в некоторых тонкостях тестирования смарт контрактов. Примерные темы, которые ожидаются можно найти в этом посте:
https://news.1rj.ru/str/solidityset/898
Как будет строиться прохождение?
Сначала пройдемся по документации Foundry, чтобы вы знали, что там представлено, и где найти информацию в случае необходимости. Поговорим об установке, о chisel и anvil, опишем некоторые cast команды и читкоды.
После этого уже приступим к самим тестам.
Я постараюсь к каждому посту, где будет идти речь о тестах, прикладывать файлы, для более визуального представление и практики.
В целом, хочется чтобы получился детальный цикл постов "от А до Я".
Установка Foundry
Сразу скажу, для того, чтобы работать с Foundry вам нужно будет знать Solidity, так как тесты для контрактов пишутся именно на этом языке.
Полный процесс установки можно найти по этой ссылке:
https://book.getfoundry.sh/getting-started/installation
Обычно установка может быть осуществлена с помощью простой команды:
curl -L https://foundry.paradigm.xyz | bash
Это установит FoundryUp - установщик Foundry, который после сможет обновлять и поддерживать среду с более простыми командами.
Нужно сказать, что FoundryUp пока не поддерживается терминалами CMD или PowerShell, которые идут в Windows, поэтому установка там чуть сложнее.
Для этого предусмотрен немного другой пошаговый гайд:
1. Скачиваем Rust и его пакетный менеджер Cargo:
https://www.rust-lang.org/learn/get-started
2. Скачиваем Visual Studio с опцией "Desktop Development With C++"
https://visualstudio.microsoft.com/downloads/
3. Ну, и Git Bash, если у кого еще нет:
https://gitforwindows.org/
После этого можно будет выполнить команду:
cargo install --git https://github.com/foundry-rs/foundry --profile local --locked forge cast chisel anvilкоторая и установит Foundry на ваш компьютер.
P.S. Для слабых и средних по мощности компьютеров весь процесс может занять до 1,5 - 2 часов!
Также для пользователей Docker есть возможность установки Foundry с командой:
docker pull ghcr.io/foundry-rs/foundry:latestЯ сам не особо работал с Docker, поэтому более детальные гайды по нему можно прочитать тут:
https://book.getfoundry.sh/tutorials/foundry-docker
Проверить, что все установилось правильно можно попытавшись создать новый проект Foundry:
1. Создайте новую папку и откройте ее в редакторе кода;
2. В терминале редактора выполните команду: forge init
3. Если в папке появились файлы типа src, test, foundry.toml, то все ок. Если же нет - спрашивайте в чате совета или смотрите документацию.
Задание
1. Установить Foundry на свой компьютер.
#foundry #lesson0
🔥7👍4❤1
Foundry с 0. Часть 1
Теперь давайте кратко поговорим о том, что установилось у нас вместе с Foundry.
Во-первых, это Cast - специальный инструмент для исполнения RPC вызовов в сети Эфириум.
RPC, от Remote Procedure Call, это протокол удаленного вызова процедур в Эфире: вы можете отправлять транзакции, делать вызовы в смарт контрактах, "доставать" какую-либо информацию из блокчейна - и все это с помощью командной строки в терминале!
Например, выполнив следующую команду:
cast call 0x6b175474e89094c44da98b954eedeac495271d0f "totalSupply()(uint256)" --rpc-url https://eth-mainnet.alchemyapi.io/v2/Lc7oIGYeL_QvInzI0Wiu_pOZZDEKBrdf
8603853182003814300330472690
мы узнаем значение totalSupply у токена DAI. И нам не потребуется посещать другие сайты или использовать API для выполнения этой задачи.
Cast командам будут посвящены отдельные посты, а сейчас пойдем дальше.
Во-вторых, у нас установился Anvil.
Anvil - это локальный тестовый узел блокчейна, который идет только с Foundry. Служит для проведения тестов для ваших смарт контрактов.
P.S. Некоторые антивирусы, например Касперский, ругаются на Anvil по какой-то причине. Поискав в сети, никаких претензий к Anvil по теме безопасности системы я не нашел, поэтому просто поставил его в "доверие" к антивирусу.
В-третьих, также загрузился Chisel.
Chisel - это продвинутый Solidity REPL (read-eval-print loop: программа, которая работает как командная оболочка).
Для меня самого Chisel остается некоторой загадкой, поэтому в свое время будем разбираться с ним вместе.
Если я правильно понимаю на данный момент, с Chisel вы сможете выполнять код Solidity прямо в терминале.
В следующей части мы поговорим о Cast командах, а потом затронем Chisel, так как первый - порой требуется для проведения тестов, со вторым - думаю, можно будет проще проверять некоторые вводные данные.
#foundry #lesson1
Теперь давайте кратко поговорим о том, что установилось у нас вместе с Foundry.
Во-первых, это Cast - специальный инструмент для исполнения RPC вызовов в сети Эфириум.
RPC, от Remote Procedure Call, это протокол удаленного вызова процедур в Эфире: вы можете отправлять транзакции, делать вызовы в смарт контрактах, "доставать" какую-либо информацию из блокчейна - и все это с помощью командной строки в терминале!
Например, выполнив следующую команду:
cast call 0x6b175474e89094c44da98b954eedeac495271d0f "totalSupply()(uint256)" --rpc-url https://eth-mainnet.alchemyapi.io/v2/Lc7oIGYeL_QvInzI0Wiu_pOZZDEKBrdf
8603853182003814300330472690
мы узнаем значение totalSupply у токена DAI. И нам не потребуется посещать другие сайты или использовать API для выполнения этой задачи.
Cast командам будут посвящены отдельные посты, а сейчас пойдем дальше.
Во-вторых, у нас установился Anvil.
Anvil - это локальный тестовый узел блокчейна, который идет только с Foundry. Служит для проведения тестов для ваших смарт контрактов.
P.S. Некоторые антивирусы, например Касперский, ругаются на Anvil по какой-то причине. Поискав в сети, никаких претензий к Anvil по теме безопасности системы я не нашел, поэтому просто поставил его в "доверие" к антивирусу.
В-третьих, также загрузился Chisel.
Chisel - это продвинутый Solidity REPL (read-eval-print loop: программа, которая работает как командная оболочка).
Для меня самого Chisel остается некоторой загадкой, поэтому в свое время будем разбираться с ним вместе.
Если я правильно понимаю на данный момент, с Chisel вы сможете выполнять код Solidity прямо в терминале.
В следующей части мы поговорим о Cast командах, а потом затронем Chisel, так как первый - порой требуется для проведения тестов, со вторым - думаю, можно будет проще проверять некоторые вводные данные.
#foundry #lesson1
👍7🔥5❤1
Foundry с 0: Cast команды. Часть 2
Сейчас существует достаточно большое количество Cast команд для самых разных задач: от простых запросов о получении баланса токена до работы с calldata и шифрованием.
Думаю, для начала пройдемся по тем, что чаще всего используют в своей работе, а оставшиеся будем изучать уже по мере необходимости.
Итак, мы можем открыть терминал и ввести команду:
Тут стоит сделать отступление и уточнить, что для выполнения некоторых команд, нам потребуется специальная RPC ссылка для доступа к блокчейн сетям. Получить такую бесплатно можно на таких популярных проектах как Alchemy или Infura.
По сути, процесс получения ссылок у них похож: регистрируетесь на портале, ищите кнопку Get API key или похожую со словом API, и потом генерируется ваша индивидуальная ссылка для rpc запросов. Выглядит она примерно так:
https://mainnet.infura.io/v3/apiKey
apiKey - ваш уникальный api ключ, показывать который нежелательно никому.
Там же можно получить ссылку на различные сети: Ethereum, Optimism, Arbitrum и т.д.
Именно эту ссылку и нужно будет добавлять в конце наших cast команд.
Если вы работаете в редакторе кода, а не в обычном терминале, то есть возможность создать .env файл и поместить туда ссылки, создав для них специальные переменные среды, и уже их использовать в cast командах.
Для небольшой тренировки, попробуем сегодня выполнить несколько команд для получения информации о сети.
Chain команды
Итак, нам доступны три команды:
cast chain-id
cast chain
cast client
Первая выдаст нам номер блокчейна (например, для Эфириума - это 1, для Оптимизма - 10), вторая - название сети, третья - клиента, через который отправляются запросы (например, для Infura - клиент GETH).
Для того чтобы выполнить команду в консоли потребуется прописать:
Также, думаю, сегодня можно рассмотреть и команды для блоков.
Block команды
Всего на данный момент их шесть:
https://book.getfoundry.sh/reference/cast/block-commands
1. cast find-block
2. cast gas-price
3. cast block-number
4. cast basefee
5. cast block
6. cast age
Первая ищет блок, который был ближе всего к нужной дате, например
Обратите внимание, что время указывается в формате unix (количество секунд прошедшее с момента 1 января 1970 года).
Вторая команда показывает текущую стоимость газа в нужной сети, например:
Пятая - получение информации о блоке, например:
earliest, finalized, safe, latest или pending.
При этом можно получить не всю информацию о блоке, а только необходимое поле. Попробуйте выполнить предыдущую команду, чтобы понять, о чем я говорю.
Получить информацию о конкретном поле можно с помощью модификации команды, а именно добавления --field опции:
Дальше мы продолжим говорить о командах cast и разберем другие примеры.
Задание
1. Зарегистрироваться на Alchemy или Infura;
2. Получить rpc ссылку;
3. Попробовать несколько команд из поста;
4. Настроить .env файл для rpc ссылок;
#foundry #cast #block #chain #lesson2
Сейчас существует достаточно большое количество Cast команд для самых разных задач: от простых запросов о получении баланса токена до работы с calldata и шифрованием.
Думаю, для начала пройдемся по тем, что чаще всего используют в своей работе, а оставшиеся будем изучать уже по мере необходимости.
Итак, мы можем открыть терминал и ввести команду:
cast helpона покажет нам все доступные cast команды.
Тут стоит сделать отступление и уточнить, что для выполнения некоторых команд, нам потребуется специальная RPC ссылка для доступа к блокчейн сетям. Получить такую бесплатно можно на таких популярных проектах как Alchemy или Infura.
По сути, процесс получения ссылок у них похож: регистрируетесь на портале, ищите кнопку Get API key или похожую со словом API, и потом генерируется ваша индивидуальная ссылка для rpc запросов. Выглядит она примерно так:
https://mainnet.infura.io/v3/apiKey
apiKey - ваш уникальный api ключ, показывать который нежелательно никому.
Там же можно получить ссылку на различные сети: Ethereum, Optimism, Arbitrum и т.д.
Именно эту ссылку и нужно будет добавлять в конце наших cast команд.
Если вы работаете в редакторе кода, а не в обычном терминале, то есть возможность создать .env файл и поместить туда ссылки, создав для них специальные переменные среды, и уже их использовать в cast командах.
Для небольшой тренировки, попробуем сегодня выполнить несколько команд для получения информации о сети.
Chain команды
Итак, нам доступны три команды:
cast chain-id
cast chain
cast client
Первая выдаст нам номер блокчейна (например, для Эфириума - это 1, для Оптимизма - 10), вторая - название сети, третья - клиента, через который отправляются запросы (например, для Infura - клиент GETH).
Для того чтобы выполнить команду в консоли потребуется прописать:
cast chain-id --rpc-url linkгде вместо link - указать вашу ссылку rpc, которую мы получали выше.
Также, думаю, сегодня можно рассмотреть и команды для блоков.
Block команды
Всего на данный момент их шесть:
https://book.getfoundry.sh/reference/cast/block-commands
1. cast find-block
2. cast gas-price
3. cast block-number
4. cast basefee
5. cast block
6. cast age
Первая ищет блок, который был ближе всего к нужной дате, например
cast find-block 1609459200покажет блок, который был ближе всего к Новому Году 2021.
Обратите внимание, что время указывается в формате unix (количество секунд прошедшее с момента 1 января 1970 года).
Вторая команда показывает текущую стоимость газа в нужной сети, например:
cast gas-price --rpc-url linkТретья - последний на данный момент блок:
cast block-number --rpc-url linkЧетвертая - basefee блока (кто не знает, что это, то почитайте про Лондонское обновление):
cast base-fee blockNum --rpc-url linkblockNum - это номер блока, basefee которого нам нужно получить. Вместо числа - 1, 443, 2343242 - можно указать одно из теговых значений: earliest, finalized, safe, latest или pending. По умолчанию идет latest.
Пятая - получение информации о блоке, например:
cast block finalized --rpc-url linkТут также можно указывать номер блока числом или одним из тегов:
earliest, finalized, safe, latest или pending.
При этом можно получить не всю информацию о блоке, а только необходимое поле. Попробуйте выполнить предыдущую команду, чтобы понять, о чем я говорю.
Получить информацию о конкретном поле можно с помощью модификации команды, а именно добавления --field опции:
cast block latest -f hash --rpc-url linkНу, и шестая команда служит для получения timestamp блока:
cast age blockNum --rpc-url linkгде blockNum это номер блока или его теговое значение.
Дальше мы продолжим говорить о командах cast и разберем другие примеры.
Задание
1. Зарегистрироваться на Alchemy или Infura;
2. Получить rpc ссылку;
3. Попробовать несколько команд из поста;
4. Настроить .env файл для rpc ссылок;
#foundry #cast #block #chain #lesson2
👍5🔥5
Foundry с 0. Часть 3
Продолжаем узнавать разнообразие cast команд и сегодня поговорим о тех, что помогают работать с аккаунтами, кошельками и транзакциями, и, на закуску, узнаем, как получить source код контракта с Etherscan.
Account команды
На данный момент существуют 6 команд cast для работы с аккаунтами:
1. cast balance - позволяет узнать количество нативных токенов сети на аккаунте в wei. Тут, кстати, можно уточнить номер блока, на момент которого был тот или иной баланс. Полная команда выглядит так:
Если при написании тестов нам будут требоваться эти команды, мы обязательно вернемся к ним и разберем подробнее.
4. cast nonce - тут все просто, получаем nonce аккаeнта, команда предельно простая:
P.S. В большинстве команд, где запросы идут в сеть, нужно добавлять свою rpc-url!
Теперь несколько слов о командах для работы с кошельком.
Wallet команды
1. cast wallet new - создать новый кошелек: адрес и приватный ключ.
2. cast wallet address - конвертация приватного ключа в адрес кошелька. Интересная команда, которая принимает достаточно большое количество опций для генерации адреса: на основе приватного ключа, mnemonic derivation path, mnemonic passphrase, обычного mnemonic. При этом вы также можете указывать, где хранится ключ, который нужно использовать для генерации адреса.
Самая простая команда звучит так:
https://book.getfoundry.sh/reference/cast/cast-wallet-address
3. cast wallet sign - с ней вы можете подписать сообщение с вашего кошелька. Также, помимо приватных ключей, можно использовать mnemonic опции. Простая команда выглядит так:
Далее несколько команд для работы с транзакциями.
Transaction команды
Для начала пройдемся по командам, которые позволяют получать информацию о проведенных транзакциях:
1. cast receipt - получения "чека" о транзакции. Потребуется указать хэш транзакции:
Вместо deposit - вы можете вставить calldata с селектором вызываемой функции и аргументами для нее.
Продолжаем узнавать разнообразие cast команд и сегодня поговорим о тех, что помогают работать с аккаунтами, кошельками и транзакциями, и, на закуску, узнаем, как получить source код контракта с Etherscan.
Account команды
На данный момент существуют 6 команд cast для работы с аккаунтами:
1. cast balance - позволяет узнать количество нативных токенов сети на аккаунте в wei. Тут, кстати, можно уточнить номер блока, на момент которого был тот или иной баланс. Полная команда выглядит так:
cast balance account --block blockNum --rpc-url RpcUrl2. cast storage - крутая команда, чтобы получить значения в storage контракта. Можно уточнить слот, в котором лежит значение, и скастовать информацию только из него. Например для WETH контракта:
cast storage 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 0или просто
cast storage 0x5Af0D9827E0c53E4799BB226655A1de152A425a53. cast proof - получение storage proof аккаунта. Не очень понял, что каких целей это может потребоваться. С этой командой вы получить proof таких полей как: accountProof, account address, account balance, codeHash, nonce, storageHash, storageProof, storageProof.key, storageProof.proof, storageProof.value.
Если при написании тестов нам будут требоваться эти команды, мы обязательно вернемся к ним и разберем подробнее.
4. cast nonce - тут все просто, получаем nonce аккаeнта, команда предельно простая:
cast nonce account5. cast code - получение байткода контракта. Пример с Weth:
cast code 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc26. cast codesize - получение runtime bytecode size контракта.
P.S. В большинстве команд, где запросы идут в сеть, нужно добавлять свою rpc-url!
Теперь несколько слов о командах для работы с кошельком.
Wallet команды
1. cast wallet new - создать новый кошелек: адрес и приватный ключ.
2. cast wallet address - конвертация приватного ключа в адрес кошелька. Интересная команда, которая принимает достаточно большое количество опций для генерации адреса: на основе приватного ключа, mnemonic derivation path, mnemonic passphrase, обычного mnemonic. При этом вы также можете указывать, где хранится ключ, который нужно использовать для генерации адреса.
Самая простая команда звучит так:
cast wallet address --private-key PRIVATE_KEYвесь список опция можно найти тут:
https://book.getfoundry.sh/reference/cast/cast-wallet-address
3. cast wallet sign - с ней вы можете подписать сообщение с вашего кошелька. Также, помимо приватных ключей, можно использовать mnemonic опции. Простая команда выглядит так:
cast wallet sign --private-key PRIV_KEY "hello"4. cast wallet verify - раз можно подписать сообщение, то есть возможность и проверки этого действия. С этой командой можно проверить адресата подписанного сообщения. Команда:
cast wallet verify --address account --address addressMessageSignature5. cast wallet vanity - интересная команда, которая позволяет сгенерировать адрес по специальным критериям: с определенным окончанием или началом, или nonce. Выглядит так:
cast wallet vanity --ends-with beefгде beef - это то, на что должен заканчиваться требуемый адрес.
Далее несколько команд для работы с транзакциями.
Transaction команды
Для начала пройдемся по командам, которые позволяют получать информацию о проведенных транзакциях:
1. cast receipt - получения "чека" о транзакции. Потребуется указать хэш транзакции:
cast receipt TX_HASH2. cast tx - похожая на первую и выдает информацию о транзакции.
cast tx TX_HASH3. cast-estimate - с ней можно оценить стоимость проведения транзакции по газу. Также можно указать, если с ней потребуется переслать нативную валюту, типа Эфира. Команда немного сложнее предыдущих и выглядит так:
cast estimate 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 --value 0.1ether "deposit()" --rpc-url rpcUrl0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 - адрес контракта, куда пойдет вызов, value - количество отправляемого с транзакцией Эфира, deposit - функция, которую будем вызывать.
Вместо deposit - вы можете вставить calldata с селектором вызываемой функции и аргументами для нее.
👍7❤1🔥1
4. cast run - команда, которая позволяет эмулировать транзакцию из сети на своей локальной сети, и расписать все traces (ее пути). Полезна для дебаггинга, поэтому будем обращаться к ней позже.
5. cast call - еще одна команда, которая сильно поможет при дебаггинге транзакций, так как выполняет вызов на адрес без публикации транзакции в сети. Много опций для тонкой настройки. Вернемся к ней в соответствующем уроке - посте.
6. cast publish - команда для публикации в сети предварительно подписанной транзакции. Выглядит так:
7. cast send - похожая на предыдущую команда, которая уже подписывает и публикует транзакцию в сети. Куча настроек. Вернемся к ней позже.
Ну, и последняя на сегодня, команда для получения кода контракта прямо с Etherscan. Тут вам потребуется предварительная регистрация на ресурсе и получение специального кода API. Команда выглядит так:
Завтра поговорим о cast командах для работы с ABI и другие полезные инструменты.
#foundry #cast #lesson3
5. cast call - еще одна команда, которая сильно поможет при дебаггинге транзакций, так как выполняет вызов на адрес без публикации транзакции в сети. Много опций для тонкой настройки. Вернемся к ней в соответствующем уроке - посте.
6. cast publish - команда для публикации в сети предварительно подписанной транзакции. Выглядит так:
cast publish --rpc-url RPC TXP.S. не помню, чтобы встречал ее практического применения. Будем разбираться.
7. cast send - похожая на предыдущую команда, которая уже подписывает и публикует транзакцию в сети. Куча настроек. Вернемся к ней позже.
Ну, и последняя на сегодня, команда для получения кода контракта прямо с Etherscan. Тут вам потребуется предварительная регистрация на ресурсе и получение специального кода API. Команда выглядит так:
cast etherscan-source 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 --etherscan-api-key ETHERSCAN_API_KEYПолучился довольно большой пост сегодня, но хотелось бы на этой недели пройти все cast команды, чтобы со следующей недели уже двигаться дальше.
Завтра поговорим о cast командах для работы с ABI и другие полезные инструменты.
#foundry #cast #lesson3
👍6🔥1
Foundry с 0. Часть 4
Сегодня мы закончим узнавать новые cast команды и пройдем последние три раздела: ABI, конвертация и полезные инструменты.
ABI команды
1. cast abi-encode / cast abi-decode - шифрует или расшифровывает данные. Например:
9. cast keccak - получить зашифрованные через keccak256 данные.
12. cast interface - создать интерфес контракта из ABI:
13. cast max-int / cast min-int / cast max-uint - получение максимальных значений uint256 / int256.
Команды для конвертации данных
Здесь очень много разных команд для конвертации, думаю, некоторые из них мы будем использовать при работе с тестами. В данном посте я просто представлю возможности данных cast команд.
Итак, вы можете конвертировать:
1. Бинарные данные в hex;
2. Fixed point number в integer;
3. Расшифровывать RLP данные;
4. UTF8 text в hex;
5. Количество wei в Эфир;
6. Получать адрес из bytes32;
7. Получать строку из bytes32;
8. hex в строку ASCII;
9. Из hex в числа;
10. Из hex в bytes32;
11. Из hex в RLP;
12. Совершать побитовые операции со сдвигом влево-вправо;
Полные список команд можно найти по ссылке:
https://book.getfoundry.sh/reference/cast/cast-shl
Крайне рекомендую попробовать поработать со всеми командами в свободное время, чтобы понять, как это все работает и привыкнуть работать с cast.
Задание
1. Попробовать выполнить 10 разны команд cast.
#foundry #cast #lesson4
Сегодня мы закончим узнавать новые cast команды и пройдем последние три раздела: ABI, конвертация и полезные инструменты.
ABI команды
1. cast abi-encode / cast abi-decode - шифрует или расшифровывает данные. Например:
cast abi-encode "someFunc(address,uint256)" 0x... 1 2342. cast 4byte - можно получить функцию по селектору.
cast abi-decode "balanceOf(address)(uint256)" 0x000000000000000000000000000000000000000000000000000000000000000a
cast 4byte 0x8cc5ce993. cast 4byte-decode - расшифровать функцию и ее аргументы из calldata:
cast 4byte-decode 0xa9059cbb000000000000000000000000e78388b4ce79068e89bf8aa7f218ef6b9ab0e9d00000000000000000000000000000000000000000000000000174b37380cea0004. cast 4byte-event - получить функцию event из calldata
cast 4byte-event 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5. cast calldata - создать calldata из функции и аргументов. Например,
cast calldata "someFunc(address,uint256)" 0x... 16. cast calldata-decode - расшифровать calldata
cast calldata-decode "transfer(address,uint256)" 0xa9059cbb000000000000000000000000e78388b4ce79068e89bf8aa7f218ef6b9ab0e9d0000000000000000000000000000000000000000000000000008a8e4b1a3d80007. cast-pretty-calldata - еще одна команда для расшифровки calldata, например:
cast pretty-calldata 0xa9059cbb000000000000000000000000e78388b4ce79068e89bf8aa7f218ef6b9ab0e9d00000000000000000000000000000000000000000000000000174b37380cea0008. cast upload-signature / cast sig - получить селектор функции:
cast upload-signature 'function approve(address,uint256)'можно указывать несколько подряд
9. cast keccak - получить зашифрованные через keccak256 данные.
cast keccak abcsdfg10. cast compute-address - сгенерировать адрес на основе nonce и адреса деплоера, например:
cast compute-address --nonce 0 --rpc-url yourUrl11. cast create2 - создать адрес через опкод creat2.
12. cast interface - создать интерфес контракта из ABI:
cast interface -o IWETH.sol 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2Также можно использовать ABI с Etherscan, но для этого придется получать API и использовать дополнительную опцию --etherscan-api-key.
13. cast max-int / cast min-int / cast max-uint - получение максимальных значений uint256 / int256.
Команды для конвертации данных
Здесь очень много разных команд для конвертации, думаю, некоторые из них мы будем использовать при работе с тестами. В данном посте я просто представлю возможности данных cast команд.
Итак, вы можете конвертировать:
1. Бинарные данные в hex;
2. Fixed point number в integer;
3. Расшифровывать RLP данные;
4. UTF8 text в hex;
5. Количество wei в Эфир;
6. Получать адрес из bytes32;
7. Получать строку из bytes32;
8. hex в строку ASCII;
9. Из hex в числа;
10. Из hex в bytes32;
11. Из hex в RLP;
12. Совершать побитовые операции со сдвигом влево-вправо;
Полные список команд можно найти по ссылке:
https://book.getfoundry.sh/reference/cast/cast-shl
Крайне рекомендую попробовать поработать со всеми командами в свободное время, чтобы понять, как это все работает и привыкнуть работать с cast.
Задание
1. Попробовать выполнить 10 разны команд cast.
#foundry #cast #lesson4
👍11❤1
Foundry с 0. Chisel. Часть 5
Сегодня, наконец, поговорим о Chisel.
По правде сказать, для меня он стал неким вызовом: материала по нему крайне мало, а описаний его практического применения и того меньше. Я потратил несколько дней, чтобы по частям собрать этот пост и показать возможности данной программы.
К слову сказать, после всех изысканий я примерно понял, почему так мало информации по нему. В целом, cast команды и remix ide могут полностью заменить его. Но для любителей работать в терминале, chisel может, вполне, стать новым инструментом.
Итак, chisel появляется у нас в системе вместе с установкой Foundry. Это также опенсорсный продукт, который разрабатывается, как я понял, сообществом, а не какой-либо коммерческой компанией.
Для того, чтобы начать с ним работать, достаточно открыть терминал и написать команду
Все доступные команды можно посмотреть, как это обычно бывает, с помощью
Из списка не особо понятно, что может делать chisel и как с ним обращаться, поэтому дадим несколько примеров.
1. Математические операции
С chisel можно выполнять не только математические операции, но также и побитовые.
Очень удобно получать значения вычислений побитовых сдвигов влево / вправо, или такие как "побитовое И" или "побитовое ИЛИ".
Достаточно в терминале написать запрос операции, типа:
2. Работа с ABI
Вы также можете получать зашифрованные данные через abi.encode и keccak256. Например,
Например, команда выше с abi.encode покажется как:
├ Hex (Tuple Encoded):
├─ Pointer ([0x00:0x20]): 0x0000000000000000000000000000000000000000000000000000000000000020
├─ Length ([0x20:0x40]): 0x00000000000000000000000000000000000000000000000000000000000000a0
└─ Contents ([0x40:..]): 0x000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000743686973656c2100000000000000000000000000000000000000000000000000
3. Переменные в chisel
В chisel можно создавать свои переменные и позже работать с ними. Например, вы можете создать переменную:
В chisel вы также можете создавать полноценные контракты и функции в них, а позже отслеживать пути работы!
Создадим простейший контракт прямо в терминале:
5. Получение интерфейсов контрактов с Etherscan
С помощью простой команды мы можем получить интерфейс любого контракта и сохранить его в файле. Однако тут есть ограничения: сохранить можно только интерфейс верифицированных контрактов в сети Ethereum, но вскоре обещают поддержку и других сетей. Команда простая:
Сегодня, наконец, поговорим о Chisel.
По правде сказать, для меня он стал неким вызовом: материала по нему крайне мало, а описаний его практического применения и того меньше. Я потратил несколько дней, чтобы по частям собрать этот пост и показать возможности данной программы.
К слову сказать, после всех изысканий я примерно понял, почему так мало информации по нему. В целом, cast команды и remix ide могут полностью заменить его. Но для любителей работать в терминале, chisel может, вполне, стать новым инструментом.
Итак, chisel появляется у нас в системе вместе с установкой Foundry. Это также опенсорсный продукт, который разрабатывается, как я понял, сообществом, а не какой-либо коммерческой компанией.
Для того, чтобы начать с ним работать, достаточно открыть терминал и написать команду
chiselМы войдем в режим работы программы.
Все доступные команды можно посмотреть, как это обычно бывает, с помощью
chisel !helpОбратите внимание, что тут все системные команды начинаются с восклицательного знака.
Из списка не особо понятно, что может делать chisel и как с ним обращаться, поэтому дадим несколько примеров.
1. Математические операции
С chisel можно выполнять не только математические операции, но также и побитовые.
Очень удобно получать значения вычислений побитовых сдвигов влево / вправо, или такие как "побитовое И" или "побитовое ИЛИ".
Достаточно в терминале написать запрос операции, типа:
100 ^ 4Единственное то, нужно быть аккуратными с делением, так как программа эмулирует работу с Solidity. Например, если попытаться выполнить операцию 3/2, то chisel не покажет результата.
100 << 5
2. Работа с ABI
Вы также можете получать зашифрованные данные через abi.encode и keccak256. Например,
abi.encode(256, bytes32(0), "Chisel!")или
keccak256(abi.encode(256, bytes32(0), "Chisel!"))Что классно с chisel, так это то, что он показывает, как это будет храниться в памяти (memory) с указание на поинтеры.
Например, команда выше с abi.encode покажется как:
├ Hex (Tuple Encoded):
├─ Pointer ([0x00:0x20]): 0x0000000000000000000000000000000000000000000000000000000000000020
├─ Length ([0x20:0x40]): 0x00000000000000000000000000000000000000000000000000000000000000a0
└─ Contents ([0x40:..]): 0x000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000743686973656c2100000000000000000000000000000000000000000000000000
3. Переменные в chisel
В chisel можно создавать свои переменные и позже работать с ними. Например, вы можете создать переменную:
uint a = 1;А потом попробовать выполнить математическую операцию, типа:
uint b = a << 0x08;4. Функции и контракты
В chisel вы также можете создавать полноценные контракты и функции в них, а позже отслеживать пути работы!
Создадим простейший контракт прямо в терминале:
contract Test {
function get() external view returns (uint) {
return 256;
}
}
затем потребуется сохранить его в переменную, чтобы можно было позже вызывать функции оттуда:Test t = new Test()Теперь мы можем обращаться к контракту, вызывая функции из него:
t.get()Более того, если мы добавим !traces перед вызовом функции, то сможем получить расшифровку "пути" вызова! Не большой аналог -vvv при тестах в Foundry, кто знает.
5. Получение интерфейсов контрактов с Etherscan
С помощью простой команды мы можем получить интерфейс любого контракта и сохранить его в файле. Однако тут есть ограничения: сохранить можно только интерфейс верифицированных контрактов в сети Ethereum, но вскоре обещают поддержку и других сетей. Команда простая:
!fetch 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 IWETHтут мы указываем адрес контракта, интерфейс которого хотим скачать и название для файла, который будет создан для этого.
👍3🔥1