├── junior-1 ├── practice │ ├── img │ │ └── vault-formula.png │ ├── 3-erc-721.md │ ├── 1-fund-me.md │ ├── 4-marketplace.md │ ├── 2-erc-20.md │ └── 5-vault.md ├── tools │ ├── images │ │ ├── etherscan-search.png │ │ ├── etherscnan-code.png │ │ └── etherscnan-interact.png │ └── README.md ├── code-style │ ├── code-comments.md │ ├── readme.md │ ├── style-guides.md │ └── linting-and-formatting.md ├── README.md ├── testing │ └── README.md └── solidity │ └── README.md ├── junior-2 ├── practice │ ├── images │ │ ├── use-case-swap.png │ │ └── use-case-liquidity-provider.png │ ├── 1-erc-1155.md │ └── 2-dex.md ├── README.md ├── foundry │ └── README.md ├── dex │ └── README.md └── solidity │ └── README.md ├── junior-3 ├── README.md ├── oracles │ └── README.md ├── dao │ └── README.md ├── lending │ └── README.md ├── gas │ └── README.md ├── meta-transactions │ └── README.md └── solidity │ └── README.md ├── README.md └── self-test-of readiness-to start-roadmap.md /junior-1/practice/img/vault-formula.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fullstack-development/solidity-developer-roadmap/HEAD/junior-1/practice/img/vault-formula.png -------------------------------------------------------------------------------- /junior-1/tools/images/etherscan-search.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fullstack-development/solidity-developer-roadmap/HEAD/junior-1/tools/images/etherscan-search.png -------------------------------------------------------------------------------- /junior-1/tools/images/etherscnan-code.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fullstack-development/solidity-developer-roadmap/HEAD/junior-1/tools/images/etherscnan-code.png -------------------------------------------------------------------------------- /junior-2/practice/images/use-case-swap.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fullstack-development/solidity-developer-roadmap/HEAD/junior-2/practice/images/use-case-swap.png -------------------------------------------------------------------------------- /junior-1/tools/images/etherscnan-interact.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fullstack-development/solidity-developer-roadmap/HEAD/junior-1/tools/images/etherscnan-interact.png -------------------------------------------------------------------------------- /junior-2/practice/images/use-case-liquidity-provider.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fullstack-development/solidity-developer-roadmap/HEAD/junior-2/practice/images/use-case-liquidity-provider.png -------------------------------------------------------------------------------- /junior-3/README.md: -------------------------------------------------------------------------------- 1 | # Solidity Junior 3 level 2 | 3 | ## Theory 4 | 5 | - [Solidity](./solidity/README.md) 6 | - [Meta transactions](./meta-transactions/README.md) 7 | - [Oracles](./oracles/README.md) 8 | - [Lending protocols](./lending/README.md) 9 | - [DAO](./dao/README.md) 10 | - [Gas](./gas/README.md) -------------------------------------------------------------------------------- /junior-2/README.md: -------------------------------------------------------------------------------- 1 | # Solidity Junior 2 level 2 | 3 | ## Theory 4 | 5 | - [Solidity](./solidity/README.md) 6 | - [DEX](./dex/README.md) 7 | 8 | ## Specific to our stack 9 | 10 | - [Foundry](./foundry/README.md) 11 | 12 | ## Practice 13 | 14 | - [ERC-1155](./practice/1-erc-1155.md) 15 | - [DEX](./practice/2-dex.md) 16 | 17 | ## Recommendations 18 | 19 | - [How to DEFI: Advanced](https://landing.coingecko.com/how-to-defi/) -------------------------------------------------------------------------------- /junior-1/code-style/code-comments.md: -------------------------------------------------------------------------------- 1 | # Комментирование кода 2 | 3 | > Все слышали выражение: "Хороший код не нуждается в комментариях". Это неоспоримая истина и ложь одновременно. 4 | 5 | Согласно [официальной документации](https://docs.soliditylang.org/en/v0.8.18/natspec-format.html) в Solidity можно использовать специальную форму написания комментариев. Эта специальная форма называется Ethereum Natural Language Specification Format (NatSpec). 6 | 7 | Основным ориентиром при создание NatSpec был [Doxygen](https://www.doxygen.nl/). 8 | 9 | _Важно!_ Рекомендуется, чтобы контракты Solidity были полностью аннотированы с использованием NatSpec для всех общедоступных интерфейсов (все что будет определено в ABI) 10 | 11 | ## Автогенерация документации 12 | 13 | На основе комментариев можно сгенерировать документацию для смарт-контрактов при помощи: 14 | 1. [Компилятор Solidity](https://docs.soliditylang.org/en/v0.8.18/natspec-format.html#documentation-output). 15 | 2. [Решение от OpenZeppelin](https://github.com/OpenZeppelin/solidity-docgen) по генерации документации. 16 | -------------------------------------------------------------------------------- /junior-1/code-style/readme.md: -------------------------------------------------------------------------------- 1 | # Code Style 2 | 3 | Этот блок является необязательным. Скорее он позиционируется, как рекомендация к прочтению и изучению. Он должен помочь быстрее научиться читать и писать смарт-контракты. Так как блокчейн является прозрачным, сложность прочтения твоего контракта может напрямую влиять на уровень доверия к твоему коду. 4 | 5 | На сам деле понятие **code style** более емкое и глубокое. В сети можно найти множество гайдов, которые расскажут, как писать Solidity код. Мы в свою очередь приведем несколько, которые на наш взгляд могут быть полезными для начинающего Solidity разработчика. Также рекомендуем список инструментов, которые облегчат написание чистого и читаемого кода. 6 | 7 | Обоснование важности **code style** можно прочитать [тут](https://habr.com/ru/company/manychat/blog/468953/). 8 | 9 | Если тебя заинтересует тема чистого кода, мы советуем прочитать книгу "Чистый код. Создание, анализ и рефакторинг" Боба Мартина, известного, как "дядюшка" Боб. 10 | 11 | ## Navigation 12 | 13 | - [Style guides](./style-guides.md) 14 | - [Комментирование кода](./code-comments.md) 15 | - [Linting и Formatting](./linting-and-formatting.md) -------------------------------------------------------------------------------- /junior-2/foundry/README.md: -------------------------------------------------------------------------------- 1 | # Вопросы по Foundry 2 | 3 | ## Общие вопросы 4 | 5 | 1. Что такое Foundry? Для чего используют forge, anvil, cast? 6 | 2. Чем Foundry отличается от Hardhat? 7 | 3. Как forge управляет зависимостями библиотек в проекте? 8 | - Что такое remapping dependencies? 9 | 4. Как можно дебажить вместе с Foundry? 10 | 5. Какими способами можно деплоить контракты с Foundry? 11 | 12 | ## Тестирование 13 | 14 | 1. Как в Foundry реализовать процесс тестирования контракта? Что такое Forge Std библиотека? Для чего она нужна? 15 | 2. Какие префиксы бывают у имен тестовых функций? 16 | 3. Будет ли протестирована функция если указать ее видимость как internal или private? 17 | 4. Можно ли использовать вспомогательные контракты для хранения функций и переменных применяемые при тестировании? Как это сделать? 18 | 5. Что делает функция setUp()? Она обязательная? 19 | 6. Что такое cheatcodes и для чего они нужны? Назови cheatcode для каждой ситуации: 20 | - Вызов функции от имени другого адреса? 21 | - Проверить, что функция возвратить ошибку? 22 | - Проверить, что функция генерирует ивент? Расскажи про boolean параметры в cheatcode vm.expectEmit(topic1, topic2, topic3, topic4). Что за topic и для чего они нужны? 23 | 7. Как работают cheatcodes vm.roll и vm.warp? 24 | 8. Поддерживает ли Foundry Fork testing? Какие есть способы? 25 | 9. Что такое Fuzz Testing? Для чего это может быть полезно? 26 | 10. Что такое Invariant Testing? 27 | 11. Что такое Differential Testing? 28 | 12. Как тестировать подписи сообщений? 29 | 30 | - [Foundry documentation](https://book.getfoundry.sh/) -------------------------------------------------------------------------------- /junior-3/oracles/README.md: -------------------------------------------------------------------------------- 1 | # Вопросы по oracles 2 | 3 | 1. Что такое оракул? 4 | - Для чего нужны оракулы? 5 | 2. Как технически можно организовать работу оракула? (Желательно подготовить схему работы для объяснения) 6 | - Сколько смарт-контрактов необходимо? 7 | - Какие предъявляются требования к off-chain части оракула? 8 | - Есть ли затраты на использование оракула и кто оплачивает эти расходы? 9 | 3. Мы подготовили несколько вариантов классификации оракулов. Расскажи, как ты понимаешь такое разбиение? Согласен ли ты с ним? 10 | - Централизованные vs децентрализованные? 11 | - Immediate read oracles vs publish-subscribe oracles vs request-response oracles? 12 | 4. Одним из самых популярных сервисов среди оракулов является chainlink. Что можешь рассказать про него? 13 | - Какую роль в экосистеме играет токен Link? 14 | - Что такое "Basic request model"? 15 | - Что такое "Off-Chain Reporting"? 16 | - Как работают price feeds? 17 | - Что такое VRF? 18 | - Для чего используются Keepers? 19 | 5. Творческий вопрос. Как ты считаешь оракулы это больше про "возможности" или "опасности"? Это безопасный способ взаимодействия смарт-контрактов с внешним миром или это потенциально узкое место, которое вредит децентрализации и к тому же подобное решение легко взломать? Здесь нужно рассказать собственное отношение к оракулам. 20 | 21 | ## Links 22 | 23 | - [WHY DO SMART CONTRACTS NEED ORACLES?](https://ethereum.org/en/developers/docs/oracles/#why-do-smart-contracts-need-oracles) 24 | - [Oracles](https://ethereum.org/en/developers/docs/oracles/) 25 | - [Implementing a Blockchain Oracle on Ethereum](https://medium.com/@pedrodc/implementing-a-blockchain-oracle-on-ethereum-cedc7e26b49e) 26 | - [Chainlink](https://chain.link/) -------------------------------------------------------------------------------- /junior-1/README.md: -------------------------------------------------------------------------------- 1 | # Solidity Junior 1 level 2 | 3 | ## Optional 4 | 5 | _Важно!_ Эта секция необязательна, но если это твой первый опыт знакомства с блокчейн технологиями и миром web3, то мы предлагаем список ресурсов, которые помогут при изучение Solidity и экосистемы, где этот язык применяется. 6 | 7 | **Web3** 8 | 9 | 1. [Introduction to Web3](https://ethereum.org/en/web3/) 10 | 2. [What is Web 3.0?](https://www.youtube.com/watch?v=nHhAEkG1y2U) 11 | 12 | **BlockChain** 13 | 14 | 1. [Блокчейн изнутри: как устроен биткоин](https://vas3k.blog/blog/blockchain/) 15 | 2. [Как устроен Ethereum и смарт-контракты](https://vas3k.blog/blog/ethereum/) 16 | 3. [What is a Blockchain? (Animated + Examples)](https://www.youtube.com/watch?v=kHybf1aC-jE) 17 | 18 | **Crypto wallets** 19 | 20 | 1. [What Is a Crypto Wallet?](https://academy.binance.com/en/articles/crypto-wallet-types-explained) 21 | 2. [How Public and Private Key Work In Your Crypto Wallets](https://www.youtube.com/watch?v=bvSJm7fHXto) 22 | 3. [What is a Cryptocurrency Wallet? (3 Types + Key Examples)](https://www.youtube.com/watch?v=SQyg9pyJ1Ac&t=3s) 23 | 24 | **Ethereum и смарт-контракты** 25 | 26 | 1. [How Ethereum and Smart Contracts Work. Distributed Turing Machine with Blockсhain Protection](https://vas3k.com/blog/ethereum/) 27 | 2. [What is Ethereum Gas? (Examples + Easy Explanation)](https://www.youtube.com/watch?v=3ehaSqwUZ0s) 28 | 29 | ## Theory 30 | 31 | - [Solidity](./solidity/README.md) 32 | - [Testing](./testing/README.md) 33 | 34 | ## Practice 35 | 36 | - [Fund Me](./practice/1-fund-me.md) 37 | - [ERC-20](./practice/2-erc-20.md) 38 | - [ERC-721](./practice/3-erc-721.md) 39 | - [Marketplace](./practice/4-marketplace.md) 40 | - [Vault](./practice/5-vault.md) 41 | 42 | ## Recommendations 43 | 44 | - [Code Style](./code-style/readme.md) 45 | - [Tools](./tools/README.md) 46 | - [How To DeFi: Beginner](https://landing.coingecko.com/how-to-defi/) 47 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Карта развития разработчика смарт-контрактов на Solidity 2 | 3 | Как научиться писать смарт-контракты для EVM-совместимых сетей на языке программирования под названием Solidity? Как максимально эффективно прокачаться от junior и выше? Какие ресурсы выбирать и по каким темам изучать? 4 | 5 | Наша команда Solidity разработчиков подготовила эту карту развития 🎓, структурируя и оптимизируя информацию на всем пути получения опыта работы над децентрализованными приложениями. Для закрепления полученных знаний на первых уровнях предлагаются практические задания. 6 | 7 | ## Список уровней: 8 | 9 | - [Junior 1](./junior-1/README.md). Точка входа для обучения! 🚪 Много основ! Много Solidity! 10 | - [Junior 2](./junior-2/README.md). Еще Solidity и да здравствуют DEXes! 11 | - [Junior 3](./junior-3/README.md). Меньше Solidity, больше предметки, больше DeFi! 12 | 13 | ## Программа обучения по Solidity 🔔 14 | 15 | Для более успешного и эффективного обучения предлагаем присоединиться к нашей программе обучения всем желающим. Программа обучения включает в себя прохождение уровня junior 1 и дает возможность объединить энтузиастов в единое сообщество, где можно коллективно и сообща погружаться в удивительный мир Solidity разработки. 16 | 17 | Чтобы узнать больше о программе обучения, переходи по [ссылке](https://coda.io/@metalamp/education/solidity-27) и пройди [самотестирование](./self-test-of%20readiness-to%20start-roadmap.md). 18 | 19 | Присоединяйся к нам в [Telegram](https://t.me/+I4lJ__AAlq02ZmNi). 20 | 21 | ## Карта развития менеджера 22 | 23 | Мы также разрабатываем и поддерживаем карту развития не только для разработчиков. HR-менеджеры, менеджеры по проектам, менеджеры по продажам, редакторы, копирайтеры и другие энтузиасты могут вдохновляться нашей работой. 24 | 25 | Присоединяйся к нашей ["Web3 roadmap for non-developers"](https://github.com/fullstack-development/defi-roadmap). 26 | 27 | _Важно!_ Мы уверены, что для блокчейн разработчиков тоже может быть много полезного в defi-roadmap. 28 | -------------------------------------------------------------------------------- /junior-1/code-style/style-guides.md: -------------------------------------------------------------------------------- 1 | # Style guides 2 | 3 | Это руководство предназначено для обзора основных соглашений о написание Solidity кода. Цель этого раздела познакомить с общепринятыми сообществом соглашениями. 4 | 5 | _Важно!_ В любом случае это только рекомендация. Нет смысла вырабатывать стиль написания кода, который будет соответствовать одному из гайдов. Тем более, что гайды могут предлагать разные принципы и подходы. Часто гайды могут противоречить друг другу. И это нормально. Поэтому мы считаем, что самое главное - это написание последовательного и логичного кода. Любые отступления в угоду улучшения читабельности кода приветствуются. Но не стоит злоупотреблять такими отступлениями. Всегда нужно помнить, что блокчейн является прозрачным и другим разработчикам или пользователям будет приятно читать понятный и простой код вашего смарт-контракта. Это однозначно повысит уровень доверия к твоему контракту. 6 | 7 | ## Список guides 8 | 9 | - Упрощенная выжимка основных [правил](https://www.tutorialspoint.com/solidity/solidity_style_guide.htm) 10 | - [Официальная документация Solidity](https://docs.soliditylang.org/en/v0.8.17/style-guide.html#) 11 | - [Расширение официальной документации](https://library.primitive.xyz/technical/contributing/style-guide) от команды Primitive 12 | - [Стандарты для кода смарт-контрактов](https://kleros.gitbook.io/docs/contribution-guidelines/code-style-and-guidelines/solidity) от Kleros 13 | 14 | ## Проекты на контракты которых можно ориентироваться 15 | 16 | - [OpenZeppelin](https://github.com/OpenZeppelin/openzeppelin-contracts). Компания, которая разрабатывает стандарты для безопасных блокчейн приложений интересна с точки зрения написания кода в первую очередь. 17 | - [Chainlink](https://github.com/smartcontractkit/chainlink) в своих смарт-контрактах использует особое именование переменных. 18 | - [Compound](https://github.com/compound-finance/compound-protocol) 19 | - [Uniswap](https://github.com/Uniswap/v2-core) 20 | - [Aave](https://github.com/aave/aave-v3-core) 21 | -------------------------------------------------------------------------------- /junior-1/testing/README.md: -------------------------------------------------------------------------------- 1 | # Development, testing, debugging 2 | 3 | * Что такое unit-test? 4 | * Что такое TDD? 5 | * Что такое регрессионные баги и как автоматические тесты помогают их решать? 6 | * В чём преимущества правила одной концепции на один unit-тест? 7 | * В чём преимущества изолированных друг от друга тестов? 8 | * Что такое stub и mock? В чем различие? 9 | * Чем юнит-тесты отличаются от интеграционных тестов? Почему интеграционные сложнее писать и поддерживать? 10 | * Как тестируются смарт-контракты? Какие инструменты используются? В чем отличие devnet от testnet? 11 | * Что такое покрытие кода тестами? Что оно показывает? Какие есть инструменты для анализа покрытия тестами кода на языке Solidity? 12 | * Можно ли тестировать смарт-контракты на данных реального блокчейна? Что такое форк сети? 13 | * Какие возможности для дебаггинга дает [Etherscan](https://etherscan.io/)? 14 | 15 | ### Ресурсы 16 | 17 | * [Зачем нужны юнит-тесты](https://tproger.ru/translations/unit-tests-purposes/) 18 | * [Об использовании модульных тестов и TDD](https://eax.me/unit-testing/) 19 | * [Testing smart contracts](https://ethereum.org/en/developers/docs/smart-contracts/testing/) 20 | * [Blockchain Environments: Testnet, Devnet, and Mainnet](https://www.gemini.com/cryptopedia/blockchain-testnet-devnet-sandbox-crypto-mainnet) 21 | * [Автоматическое тестирование c использованием фреймворка Mocha](https://learn.javascript.ru/testing-mocha) 22 | * [Hardhat tutorial](https://hardhat.org/tutorial) 23 | * [Remix IDE tutorial](https://101blockchains.com/remix-ide-tutorials/) 24 | * [Write Your First Smart Contract Using Remix IDE](https://betterprogramming.pub/developing-a-smart-contract-by-using-remix-ide-81ff6f44ba2f) 25 | * [Testing simple smart contract with Waffle library](https://ethereum.org/en/developers/tutorials/waffle-test-simple-smart-contract/) 26 | * [Testing ERC-20 tokens with waffle](https://ethereum.org/en/developers/tutorials/testing-erc-20-tokens-with-waffle/) 27 | * [How to mock solidity contracts for testing](https://ethereum.org/en/developers/tutorials/how-to-mock-solidity-contracts-for-testing/) 28 | * [How Do You Even Write Secure Code Anyways, Samczsun - DeFi Security Summit 2022](https://youtu.be/Wm3t8Fuiy1E) 29 | * [Обзор инструмента tenderly](https://github.com/fullstack-development/blockchain-wiki/tree/main/tools/tenderly) 30 | -------------------------------------------------------------------------------- /junior-2/dex/README.md: -------------------------------------------------------------------------------- 1 | # Вопросы по DEX(Decentralized exchange) 2 | 3 | ## Общие вопросы 4 | 5 | 1. Что такое ликвидность? Приведи пример низкой и высокой ликвидности. 6 | 2. Чем отличается маркет-мейкер от маркет-тейкера? 7 | - Создатель рынка - это мейкер или тейкер? 8 | 3. Кто такой поставщик ликвидности? 9 | - Кого можно считать поставщиком ликвидности мейкера или тейкера? 10 | 4. Что такое DEX? Как он устроен? 11 | 5. Чем отличается DEX от CEX(Centralized exchange)? 12 | 13 | ## Automated market maker 14 | 15 | 1. Что такое AMM? 16 | 2. Что такое пул ликвидности? 17 | 3. Кто в AMM является поставщиком ликвидности? 18 | - Что такое lp-токены? Какую роль они играют для поставщиков ликвидности? 19 | 4. Какие виды AMM бывают? 20 | - Какой вид AMM использует [Uniswap](https://uniswap.org/)? 21 | - Что означают X, Y, K в формуле ```X * Y = K```? 22 | - Почему при обмене токенов, согласно AMM, стоимость одного токена будет увеличиваться, а второго уменьшаться? 23 | - Можно ли истощить пул ликвидности у Uniswap? 24 | - Вопрос со звездочкой. Как из формулы ```X * Y = K``` посчитать количество токена **ΔY**, которое мы получим при обмене если отдадим некоторое количество токена **ΔX**? 25 | 26 | - [How to DeFi Advanced](https://landing.coingecko.com/how-to-defi/) 27 | 28 | ## OrderBook 29 | 30 | 1. Как устроен обменник на базе orderbook? 31 | 2. Что такое ордер? Чем отличается ордер на покупку от ордера на продажу? 32 | 3. Откуда берется ликвидность для DEX на базе orderbook? 33 | - Чем отличается лимитный ордер от рыночного? 34 | - Какие виды лимитных ордеров ты знаешь? 35 | 4. Что такое биржевой стакан(Depth of Market) и график свечей(Candlestick chart)? 36 | - Как визуально отличаются ордера на продажу и ордера на покупку в биржевом стакане? 37 | - Что в свече называют "реальным телом", "фитилем"? Что они показывают? 38 | 5. Почему DEX на orderbook встречается реже, чем DEX на AMM? Что может дать OrderBook для DEX? 39 | 40 | ## Подводные камни децентрализованной торговли 41 | 42 | 1. Что такое проскальзывание цены(price slippage)? 43 | - Почему проскальзывание появляется? 44 | - Как волатильность токена и ликвидность влияют на проскальзывание цены? 45 | - Чем отличается отрицательное проскальзывание от положительного? 46 | 2. Что такое непостоянные потери(impermanent loss)? 47 | - Есть ли способ избежать или минимизировать непостоянные потери? 48 | 3. Что такое арбитраж? 49 | - Что можешь рассказать про самые популярные виды атак: front-running, back-running, sandwich? 50 | - Могут ли атаки арбитражных ботов вызывать проскальзывание цены? -------------------------------------------------------------------------------- /junior-1/practice/3-erc-721.md: -------------------------------------------------------------------------------- 1 | # NFT-721 2 | 3 | - Пройти [Lesson 14: Hardhat ERC721](https://github.com/smartcontractkit/full-blockchain-solidity-course-js#lesson-14-hardhat-nfts-everything-you-need-to-know-about-nfts) 4 | 5 | Критерии прохождения задания: 6 | - Изучить стандарт ERC-721, разобрать все основные методы. 7 | - Написать простой ERC-721 с использованием OpenZeppelin библиотеки. 8 | - Деплой смарт-контрактов в тестовую сеть. 9 | - Написать тесты для смарт-контрактов. 10 | - Пройтись по литературе на которую приведены ссылки. 11 | 12 | Дополнительно: 13 | - Загрузить картинки токенов и метаданные токенов в IPFS. 14 | - Попробовать написать скрипты для программной загрузки файлов на ipfs. 15 | - Попробовать использовать другие расширения ERC-721 от OpenZeppelin. 16 | 17 | ## Какие навыки даст задание? 18 | 19 | 1. Понимание общего принципа работы стандарта NFT-721 и его дополнений. 20 | 2. Понимание, что такое протоколы с распределенной файловой системой и как с ними работать. 21 | 22 | ## Вопросы по теории: 23 | 24 | 1. Что такое NFT? Какие главные отличия от ERC-20? 25 | 2. Что такое token URI и как можно его задавать? 26 | 3. Что такое IPFS и в чем его отличия от сервисов: Pinata, nft.storage? Какие преимущества и недостатки? 27 | 4. Что такое метаданные? 28 | 5. Можно ли загружать метаданные прямиком в блокчейн? Какие преимущества и недостатки? 29 | 6. Какие методы должны быть в токене ERC-721? Что они делают? 30 | 7. Чем отличается метод transferFrom от safeTransferFrom? 31 | 8. Чем отличается метод approve от setApprovalForAll? Как отозвать каждый из них? 32 | 9. Как работает tokenUri? 33 | 10. Какие недостатки есть у ERC-721? 34 | 11. Какие расширения ERC-721 есть у OpenZeppelin, Какой функционал добавляют следующие расширения: 35 | - ERC721Pausable 36 | - ERC721Burnable 37 | - ERC721Consecutive 38 | - ERC721URIStorage 39 | - ERC721Votes 40 | - ERC721Royalty 41 | - ERC721Enumerable 42 | 12. Каким образом можно получить все нфт которыми владеет пользователь? Какое расширение нужно использовать? 43 | 44 | ### Литература: 45 | 46 | - [ERC-721 standart](https://ethereum.org/en/developers/docs/standards/tokens/erc-721/) 47 | - [EIP-721](https://eips.ethereum.org/EIPS/eip-721) 48 | - [Набор контрактов и утилит ERC-721 от OpenZeppelin](https://docs.openzeppelin.com/contracts/4.x/erc721) 49 | - [ERC-721 Github OpenZeppelin](https://github.com/OpenZeppelin/openzeppelin-contracts/tree/master/contracts/token/ERC721) 50 | - [ERC-721 tutorial](https://www.youtube.com/watch?v=YwXXLmRZI3Y&ab_channel=BlockchainBob) 51 | - [ERC-721 URI Storage tutorial](https://www.youtube.com/watch?v=NU5Z-NIK4_U&ab_channel=BlockchainBob) 52 | - [ERC-721 Enumirable tutorial](https://www.youtube.com/watch?v=hL5uPgEAuIo&ab_channel=BlockchainBob) 53 | - [Etherscan tracker NFT](https://etherscan.io/tokens-nft) 54 | - [Приятный бонус - NFT-721A](https://www.erc721a.org/) 55 | -------------------------------------------------------------------------------- /junior-3/dao/README.md: -------------------------------------------------------------------------------- 1 | 2 | # Вопросы по DAO и DAO governance 3 | 4 | 1. Что такое DAO (Decentralized autonomous organization)? 5 | - Чем DAO отличается от DO (Decentralized organization)? От DA (Decentralized application)? 6 | - Для чего может использоваться DAO (use cases)? 7 | 2. Как DAO работает? 8 | - Для чего используется блокчейн технология? 9 | - Для чего используется процесс голосования? 10 | - Какие еще сервисы, инструменты, технологии используются для организации DAO, помимо блокчейна? 11 | - В чем разница между DAO открытым и закрытым? 12 | 3. Какие плюсы и минусы несет в себе DAO? 13 | - Какие риски можно выделить при организации DAO? 14 | 4. DAO governance 15 | - Что такое DAO governance? 16 | - Чем отличается DAO от DAO governance? 17 | - Чем отличается демократическая структура управления от меритократической? 18 | - Объясни работу следующих моделей систем голосования: "голосование токенами", "квадратичное голосование", "футархия", "жидкая демократия", "голосование на основе репутации". 19 | - Что такое делегирование в рамках системы голосования? Почему делегирование важный механизм? Как делегирование помогает сделать процесс голосования эффективнее? 20 | - Что такое rage-quit? 21 | - Для чего используется отложенное исполнение принятого решения после голосования (механизм TimeLock)? 22 | 5. Назови несколько сервисов (конструкторов DAO) для организации DAO? 23 | - В чем особенность каждого из них? 24 | 6. Смарт-контракты для DAO 25 | - Как устроено DAO Compound V2? 26 | - Разбери и объясни, показывая код, что делает контракт Compound Governance V2 [GovernorAlpha.sol](https://github.com/compound-finance/compound-protocol/blob/master/contracts/Governance/GovernorAlpha.sol)? 27 | - Разбери и объясни, показывая код, как работают [смарт-контракты](https://github.com/OpenZeppelin/openzeppelin-contracts/tree/v5.0.0/contracts/governance) для governance библиотеки OpenZeppelin? Как работают следующие контракты: Governor.sol, GovernorCountingSimple.sol, GovernorSettings.sol, GovernorVotes.sol, GovernorVotesQuorumFraction.sol, Votes.sol? 28 | - Какие типы токенов могут быть токеном голосования? Как из обычного токена сделать токен голосования? 29 | 30 | ## Links 31 | 32 | 1. [What is a DAO in Crypto? (Decentralized Autonomous Organization)](https://www.youtube.com/watch?v=KHm0uUPqmVE&ab_channel=WhiteboardCrypto) - video 33 | 2. [OpenZeppelin governance](https://docs.openzeppelin.com/contracts/4.x/api/governance) 34 | 3. [Compound governance](https://compound.finance/governance) 35 | 4. [Decentralized autonomous organizations (DAOs)](https://ethereum.org/en/dao/) на ethereum.org 36 | 5. [DAOs, DACs, DAs and More: An Incomplete Terminology Guide](https://blog.ethereum.org/2014/05/06/daos-dacs-das-and-more-an-incomplete-terminology-guide) 37 | 6. [A Primer on DAOs](https://corpgov.law.harvard.edu/2022/09/17/a-primer-on-daos/) -------------------------------------------------------------------------------- /self-test-of readiness-to start-roadmap.md: -------------------------------------------------------------------------------- 1 | # Самотестирование перед началом прохождения карты развития по Solidity 2 | 3 | Этот тест создан для новичка, чтобы помочь определить, подходит для него программа обучения или сначала необходимо обрести базовые знания. 4 | 5 | Тест реализован в полушуточной форме, где каждый пункт требует ответа: **да** или **нет** на не всегда серьезные высказывания. 🙃 6 | 7 | Начнем: 8 | 9 | 1. Тебе **интересно узнать**, что такое блокчейн Ethereum, финансовые протоколы, смарт-контракты и как с помощью них фиксировать любые договоренности. Хочешь разрабатывать по-настоящему децентрализованные приложения. Горишь идеей разбираться в финансовой и экономической составляющих приложений. То есть у тебя достаточно мотивации и времени, чтобы этим заниматься. 10 | 2. У тебя есть коммерческий опыт разработки на других языках программирования (JavaScript, TypeScript, Python, С или C++) **больше одного года**. Есть понимание типизированных языков программирования. При помощи обычного цикла for можешь организовать работу любого алгоритма. Легко можешь реализовать массив данных, связный список, стек, очереди и другие структуры данных. Доводилось работать с деревьями и графами. 11 | 3. Знаешь принципы **ООП**, SOLID, знаком с **паттернами** проектирования. Можешь мыслить абстракциями. Отличаешь агрегацию от композиции. Легко напишешь класс, который наследуется от других классов, реализуя заданный интерфейс. Ты не думаешь, что фабрика 🏭 может быть только обувной, а стратегия игровой. 12 | 4. Не забыл школьную **математику** и **информатику**. Можешь делать простые математические операции от умножения и деления до извлечения корня, возведения в степень. Сдвиг влево или сдвиг вправо на несколько бит тебя не повергает в ужас. Не составляет сложности в уме перевести число из десятичной в шестнадцатеричную систему, шучу, можно использовать подручные инструменты 🔨. 13 | 5. Понимаешь **основы криптографии** или готов в них разбираться. Знаешь отличие между хешированием и шифрованием. Согласен с нами, что SHA-2 не набор шипящих звуков Каа из Маугли. 14 | 6. Хоть раз в жизни задумывался о том, чтобы попробовать методологию TDD. Отличаешь **unit-тесты** от **интеграционных**. Всегда стремишься к 100% покрытия кода. 15 | 7. SELECT, GET, DELETE, JOIN, POST, PUT, CREATE. Можешь легко определить, что из этого используется для **SQL**, а что для **REST API**. И более того тебе доводилось работать с этим, хотя бы в каком-то виде. 16 | 8. Ты с трепетом и аккуратностью готов относиться к коду, будешь его **документировать** и **рефакторить**, тестировать, проверять на **безопасность**, а потом снова рефакторить и тестировать и так по кругу. Это важная составляющая разработки, которой можно пренебрегать в других языках, но не в разработке смарт-контрактов на Solidity. 17 | 18 | Если на семь пунктов из восьми ты отвечаешь положительно, если большинство терминов тебе знакомо и откликаются, то это значит, что ты готов к тому, чтобы начать проходить нашу программу обучения. 19 | 20 | Имей ввиду, что тест не является чем-то категоричным и он не должен навсегда отбить твое желание погружаться в Solidity разработку. Тест всего лишь показывает тот минимальный набор знаний в программировании для того, чтобы начать. 🚀 21 | -------------------------------------------------------------------------------- /junior-3/lending/README.md: -------------------------------------------------------------------------------- 1 | # Вопросы по lending протоколам 2 | 3 | ## Общие вопросы 4 | 5 | 1. Что такое lending протоколы? Для чего используются? 6 | 2. Чем borrower отличается от lender? 7 | 4. Что такое collateral в рамках lending протоколов? Для чего используется? 8 | 5. Что такое interest rates? Для чего используется? 9 | 6. Почему заем требует обеспечение? 10 | 7. Что такое ликвидация? Для чего нужна? Какие виды ликвидаций бывают? Что такое каскадные ликвидации? 11 | 8. В разных протоколах бывают разные параметры, которые регулируют процесс ликвидации, например "health factor" в Aave. Как ты понимаешь его работу? 12 | 13 | ## Вопросы по протоколам 14 | 15 | ### Compound V2 16 | 17 | 1. Что такое market? Что означает термин выйти на рынок (enter market)? 18 | 2. Для чего используется контракт [cToken](https://github.com/compound-finance/compound-protocol/blob/master/contracts/CToken.sol)? 19 | 3. Для чего используется контракт [Comptroller](https://github.com/compound-finance/compound-protocol/blob/master/contracts/Comptroller.sol)? 20 | 4. Расскажи про каждую из этих процентных ставок протокола: 21 | - exchange rate 22 | - supply rate 23 | - borrow rate. 24 | 5. Как работает начисление процентов в протоколе compound? 25 | 6. Что означает термин utilization rate? 26 | 7. Для чего используется параметр kink? 27 | 8. Для чего нужен токен COMP? 28 | 29 | ### Aave v2 30 | 31 | 1. Что такое [AToken](https://github.com/aave/protocol-v2/blob/master/contracts/protocol/tokenization/AToken.sol) и debtToken? Какие виды debtToken существуют? 32 | 2. Для чего используется контракт [LendingPool](https://github.com/aave/protocol-v2/blob/master/contracts/protocol/lendingpool/LendingPool.sol)? 33 | 3. Что такое health factor? 34 | 4. Что такое collateral swap? 35 | 5. Что такое native credit delegation? 36 | 6. Как работают flexible rates? 37 | 7. Что такое flash loans? Для чего используются? Как работают? Как ты думаешь, технология несет больше вреда или пользы? 38 | 8. Для чего нужен токен AAVE? 39 | 40 | ## Стейблкоины 41 | 42 | 1. Что такое стейблкоин? В чем его отличие от обычного токена? Какие стейблкоины знаешь? 43 | 2. Чем централизованные стейблкоины отличаются от децентрализованных? Можно ли централизацию замаскировать в децентрализованном стейблкоине? Например блокировать транзакции, вносить адреса в черный список и так далее. 44 | 3. Стейблкоины бывают разной степени обеспеченности (частично обеспеченные, полностью обеспеченные, сверх обеспеченные). Для чего это нужно? 45 | 4. Что такое алгоритмические стейблкоины? В чем отличие моделей привязки ребейз, сеньораж и фракционной друг от друга? 46 | 5. По какой причине стейблкоин может потерять привязку? 47 | 6. Что общего между стейблкоином и lending протоколом? 48 | 49 | ## Links 50 | 51 | 1. [Compound](https://compound.finance/) 52 | 2. [Aave](https://aave.com/) 53 | 3. [Видео](https://www.youtube.com/watch?v=wUjYK5gwNZs&list=PL4Rj_WH6yLgWe7TxankiqkrkVKXIwOP42&index=3&ab_channel=PatrickCollins) про стейблкоин от Patrick Collins из chainlink. Урок 12. 54 | 4. [What are Decentralized Stablecoins? A Look At DAI, GHO, crvUSD, FRAX, and More](https://www.coingecko.com/learn/what-are-decentralized-stablecoins#4) 55 | 5. [Stability, Elasticity, and Reflexivity: A Deep Dive into Algorithmic Stablecoins](https://insights.deribit.com/market-research/stability-elasticity-and-reflexivity-a-deep-dive-into-algorithmic-stablecoins/) -------------------------------------------------------------------------------- /junior-2/practice/1-erc-1155.md: -------------------------------------------------------------------------------- 1 | # NFT-1155 + Chainlink + IPFS 2 | 3 | - Ознакомиться с [Lesson 14: Hardhat ERC721](https://youtu.be/gyMwXuJrbJQ?t=75302) 4 | - Написать контракт стандарта ERC-1155 5 | 6 | ## ТЗ 7 | 8 | Каждый раз когда мы минтим(покупаем за эфир) новую нфт, мы будем вызывать Chainlink VRF для получения случайного числа. 9 | Используя это случайное число мы будем минтить пользователю токен в зависимости от его редкости. 10 | 11 | Смарт-контракт должен иметь функционал: 12 | 13 | `setMintFee()` - функцию установки комиссии для минтинга; 14 | `requestNFT()` - функция которая должна принимать эфир и делать запрос на случайное число в chainlink VRF; 15 | `fulfillRandomWords()` - функция которая должна получать случайное число, определять какой токен нужно сминтить в зависимости от полученного числа и редкости токенов, и конечно минтить этот токен пользователю который заплатил соответствующее количество денег. 16 | `setTokenURI()` - возможность задавать uri для каждого токена; 17 | `withdraw()` - забор средств со смарт-контракта, должен уметь только owner контракта; 18 | `getMintFee()` - должен возвращать комиссию для минтинга токенов; 19 | `uri()` - должен возвращать uri конкретного токена; 20 | 21 | Данные по редкости: 22 | ``` 23 | PUG = 0; // 10% chance 24 | SHIBA_INU = 1; // 20% chance 25 | ST_BERNARD = 2; // 70% chance 26 | ``` 27 | 28 | Критерии прохождения задания: 29 | - Изучить стандарт ERC-1155, разобрать все основные методы. 30 | - Написать ERC-1155 с использованием OpenZeppelin, chainlink. 31 | - Для каждого из трех токенов должен быть свой uri. 32 | - Загрузить картинки токенов и метаданные токенов в IPFS используя сервис на свое усмотрение. 33 | - Деплой смарт-контрактов в тестовую сеть. 34 | - Написать тесты для смарт-контрактов. 35 | - Пройтись по литературе на которую приведены ссылки. 36 | 37 | Дополнительно: 38 | - Попробовать написать скрипты для программной загрузки файлов на ipfs. 39 | - Попробовать использовать другие расширения ERC-1155 от OpenZeppelin. 40 | 41 | ## Какие навыки даст задание? 42 | 43 | 1. Понимание общего принципа работы стандарта NFT-1155 и его дополнений. 44 | 2. Понимание что такое IPFS и как с ними работать. 45 | 3. Умение писать скрипты для программной загрузки файлов на ipfs. 46 | 4. Закрепить знания как получать рандомное число с chainlink. 47 | 48 | ## Вопросы по теории: 49 | 50 | 1. Какие главные отличия erc-1155 от erc-721? 51 | 2. Что такое token URI и как можно его задавать в erc-1155? 52 | 3. Как использовать Chainlink для получения рандомного числа? 53 | 4. Какие методы должны быть в токене ERC-1155? Что они делают? 54 | 5. Чем отличается safeTransferFrom от safeBatchTransferFrom? 55 | 6. Чем отличается approve от setApprovalForAll? Как отозвать каждый из апрувов? 56 | 7. Для чего нужен метод setURI? 57 | 8. Какие расширения ERC-1155 есть у OpenZeppelin? Какой функционал добавляют следующие расширения: 58 | - ERC1155Pausable 59 | - ERC1155Burnable 60 | - ERC1155Supply 61 | - ERC1155URIStorage 62 | 63 | ### Литература: 64 | 65 | - [ERC-1155: Multi Token Standard](https://eips.ethereum.org/EIPS/eip-1155) 66 | - [ERC-1155 standard](https://ethereum.org/en/developers/docs/standards/tokens/erc-1155/#top) 67 | - [Набор контрактов и утилит ERC-1155 от OpenZeppelin](https://docs.openzeppelin.com/contracts/4.x/api/token/erc1155) 68 | - [ERC-1155 Github OpenZeppelin](https://github.com/OpenZeppelin/openzeppelin-contracts/tree/master/contracts/token/ERC1155) 69 | - [ERC-1155 tutorial](https://www.youtube.com/watch?v=ngxWWS3Qr3Q&t=466s&ab_channel=BlockchainBob) 70 | - [OpenZeppeling Wizard](https://docs.openzeppelin.com/contracts/4.x/wizard) 71 | - [Chainlink](https://chain.link/) 72 | 73 | -------------------------------------------------------------------------------- /junior-1/practice/1-fund-me.md: -------------------------------------------------------------------------------- 1 | ## Fund Me 2 | 3 | - Необходимо пройти [Lesson 4: Remix Fund Me](https://github.com/smartcontractkit/full-blockchain-solidity-course-js#lesson-4-remix-fund-me), обязательно повторить функционал из урока - т.е самостоятельно написать контракт который будет иметь функционал для депозита и вывода эфира, а также будет производить проверку и отклонять транзакцию если количество переданного эфира по стоимости меньше $25. 4 | - Протестировать свой контракт в тестовой сети. 5 | - Пройтись по литературе на которую приведены ссылки в репозитории урока. 6 | 7 | ## Какие навыки даст задание? 8 | 9 | > Важно! Круто если получится воспроизвести функционал контракта без подсматриваний в урок. Либо итеративно: например, есть понимание как добавить функционал с получением цены -> также стало понятно как это проверить на контракте -> идешь и делаешь пока не получиться (при этом пользуясь докой solidity, chainlink и шпаргалками solidity-by-example если нужно). Это позволит хорошо закрепить материал. 10 | 11 | 1. Понимание как работать с эфиром на контрактах: 12 | - работа и с глобальной переменной `msg.value` 13 | - отправка эфира через `transfer`, `send` и `call` 14 | - работа с функциями `receive` и `fallback` 15 | 2. Понимание как получить цену из оракла для нужной пары токенов; 16 | 3. Как использовать библиотеки, как сделать свою библиотеку и использовать для определенного типа; 17 | 4. Итерация по массиву, сброс массива; 18 | 5. Написание и использование собственного модификатора; 19 | 6. Написание кастомных ошибок вместо `require`; 20 | 7. Небольшие оптимизации по газу. 21 | 22 | ## Вопросы по теории 23 | 24 | 1. Какие данные попадают в транзакцию при отправке эфира? Какие поля там будут? 25 | 2. Зачем нужна переменная `msg.value`? Какие еще существуют глобальные переменные? 26 | 3. За что отвечают поля `inputs` и `outputs` в ABI функции? 27 | 4. Какой модификатор обязателен для функции принимающей эфир? Как переменную типа `address` переопределить, чтобы можно было отправить эфир с этого адреса? 28 | 5. Что произойдет если перед тем как транзакция ревертится мы успеем сделать запись в переменную из `storage`? 29 | 6. Когда `view` функцию вызывает другой контракт это стоит газа или нет? 30 | 7. Как работать с числами с плавающей точкой в solidity? Что такое `decimals`? Для чего нужен `decimals` при расчете цен токенов? 31 | 8. Зачем в функции `getPrice` при получении значения `answer` запятые перед и после значения? Как ты объяснишь запись `uint256(answer * 10000000000)`? 32 | ```js 33 | function getPrice() internal view returns (uint256) { 34 | AggregatorV3Interface priceFeed = AggregatorV3Interface( 35 | 0xD4a33860578De61DBAbDc8BFdb98FD742fA7028e 36 | ); 37 | (, int256 answer, , , ) = priceFeed.latestRoundData(); 38 | 39 | return uint256(answer * 10000000000); 40 | } 41 | ``` 42 | 9. Как сбросить все значения массива? 43 | 10. Рассказать про три способа отправки эфира. Какой способ предпочтительный и почему? Как и зачем предавать данные в `call`? 44 | 11. Посмотри код ниже, объясни что тут происходит. Что означает запись `address(this).balance`? 45 | ```js 46 | (bool callSuccess, ) = payable(msg.sender).call{value: address(this).balance}(""); 47 | require(callSuccess, "Call failed"); 48 | ``` 49 | 12. Как написать кастомный модификатор? Может ли кастомный модификатор принимать аргументы? Можно ли писать код в модификаторе после `_;`? 50 | 13. Для чего нужны `receive` и `fallback`? Когда их нужно использовать? Что будет если мы отправим эфир на контракт но там не будет этих функций? Как связаны `msg.data` и `fallback`? 51 | 14. Что такое оракулы? Какую проблему они решают? Для чего используются кроме получения цены токенов? 52 | 53 | 54 | -------------------------------------------------------------------------------- /junior-1/practice/4-marketplace.md: -------------------------------------------------------------------------------- 1 | # NFT Marketplace 2 | 3 | - Ознакомится с [Lesson 15: NextJS NFT Marketplace](https://github.com/smartcontractkit/full-blockchain-solidity-course-js#lesson-15-nextjs-nft-marketplace-if-you-finish-this-lesson-you-are-a-full-stack-monster) 4 | - Написать смарт-контракт маркетплейса для nft 5 | 6 | ## ТЗ 7 | 8 | Маркетплейс выступает площадкой где торгуются NFT-коллекции или отдельные токены ERC-721(NFT). Маркетплейс имеет простой функционал - токены ERC-721(NFT) выставляются на продажу и покупаются за токены ERC-20. 9 | 10 | ## Как это выглядит со стороны продавца NFT 11 | 12 | - продавец может листить (размещать нфт на площадке) 13 | - продавец может изменять параметры листинга 14 | - продавец может отменять листинг 15 | - продавец может принять оффер на покупку NFT по цене, которую предложил покупатель 16 | 17 | ## Как это выглядит со стороны покупателя NFT 18 | 19 | - покупатель может купить NFT, которая листится по цене, которую установил продавец 20 | - покупатель может предложить офер на покупку NFT по своей цене и установить срок окончания офера 21 | 22 | ## Как это выглядит со стороны маркетплейса 23 | 24 | - маркетплейс может установить комиссию площадки за каждую сделку 25 | - по умолчанию комиссия должна быть 2% (прописывается в контракте либо задается через конструктор) 26 | - должна быть возможность просматривать комиссию на смарт-контракте 27 | - должна быть возможность изменять комиссию на смарт-контракте 28 | - должна быть возможность установить минимальную комиссию 0.01% (смотри базисные пункты и как с ними работать в solidity для точных расчетов) 29 | - маркетплейс может установить получателя комиссии 30 | - получатель комиссии должен задаваться в конструкторе 31 | - должна быть возможность изменить получателя комиссий площадки 32 | - установить нового получателя комиссии может только владелец маркетплейса (либо адрес, у которого есть доступ к подобным операциям, например владелец контракта (owner)) 33 | - должна быть возможность посмотреть адрес получателя комиссии площадки 34 | 35 | ### Функционал смарт-контракта: 36 | 37 | - листинг нфт 38 | - отмена листинга нфт 39 | - изменение параметров листинга (токен оплаты и цена) 40 | - покупка нфт, которая листится 41 | - создание офера 42 | - отмена офера 43 | - принятие офера продавцом 44 | - запись комиссии платформы 45 | - запись получателя комиссии платформы 46 | - просмотр комиссии платформы 47 | - просмотр получателя комиссии платформы 48 | 49 | ### Дополнительный функционал, который можно реализовать 50 | 51 | - Проверка интерфейса ERC-721 во время листинга нфт и создания офера (ERC-165) 52 | - Списание роялти и отправка создателю NFT, если NFT поддерживает ERC-2981 53 | - Аукцион 54 | 55 | ## Требования к выполнению задания 56 | 57 | - **В смарт-контракте должны быть модификаторы**: `notListed`, `isListed`, `notOffered`, `isOffered` 58 | - **В смарт-контракте должны быть события**: `ItemListed`, `ItemUpdated`, `ItemSold`, `OfferCreated`, `OfferCanceled`, `UpdatePlatformFee`, `UpdatePlatformFeeRecipient` 59 | - **В смарт контракте должны быть все необходимые проверки**. Например токен оплаты ERC-20 должен проверяться на нулевой адрес, а ERC-721 должен поддерживать интерфейс ERC-721, в функции должны передаваться корректные аргументы и т.д. 60 | - **Функции площадки должны быть с ограниченным доступом** (использовать Ownable) 61 | - **Использовать ReentrancyGuard от OpenZeppelin** для защиты функций смарт-контракта от повторных вызовов. 62 | - **Необходимо использовать свои токены**. Токен ERC-20 из второго задания для покупки и продажи нфт(оплата должна проводиться в этом токене). Токен ERC-721 для реализации нфт. 63 | - **Покрытие unit тестами 100%**. Для проверки покрытия тестами кода можно использовать плагин [solidity-coverage](https://www.npmjs.com/package/solidity-coverage) -------------------------------------------------------------------------------- /junior-1/code-style/linting-and-formatting.md: -------------------------------------------------------------------------------- 1 | # Linting and Formatting 2 | 3 | Для того чтобы писать чистый и понятный другим разработчикам команды код обычно используют два вида инструментов: линтеры и форматеры. 4 | 5 | **Линтеры** автоматически анализируют код на наличие возможных программных ошибок и ошибок стиля. 6 | 7 | **Форматеры** автоматически форматируют код в соответствии с предопределенными правилами и значениями отступов по умолчанию. 8 | 9 | Язык Solidity не является исключением. Мы предлагаем обратить внимание на следующие инструменты, которые позволят автоматизировать рабочий процесс написания кода в команде. 10 | 11 | _Важно!_ Для того чтобы начать писать смарт-контракты на Solidity не обязательно сразу глубоко уметь разбираться во всех инструментах для линтинга и форматирования кода. Но важно знать, какие есть инструменты и для чего они используются. И когда в ходе разработки ты почувствуешь необходимость в использование какого-то из этих инструментов, ты уже будешь знать, что тебе нужно использовать. 12 | 13 | ## Linters 14 | 15 | - [Solhint](https://www.npmjs.com/package/solhint). Самый популярный линтер. 16 | - [Ethlint](https://www.npmjs.com/package/ethlint). Раньше этот инструмент назывался Solium. 17 | 18 | ## Formatters 19 | 20 | - [Prettier solidity](https://github.com/prettier-solidity/prettier-plugin-solidity). Работает в связке с solhint. 21 | 22 | ## Git hooks 23 | 24 | Про то что такое, git hooks можно почитать [тут](https://githooks.com/) 25 | 26 | - [Husky](https://github.com/typicode/husky). Этот инструмент может запускать линтер и форматер перед каждым **commit**, **push** или **receive**. 27 | 28 | ## Расширения для vscode 29 | 30 | ### Общие расширения 31 | - [Поддержка языка Solidity](https://juan.blanco.ws/solidity-contracts-in-visual-studio-code/). 32 | - [Solidity Visual Developer](https://marketplace.visualstudio.com/items?itemName=tintinweb.solidity-visual-auditor). 33 | - [Solidity+Yul Semantic Syntax](https://marketplace.visualstudio.com/items?itemName=ContractShark.solidity-lang) 34 | 35 | ### HardHat 36 | - [Поддержка языка Solidity и интеграция Hardhat](https://marketplace.visualstudio.com/items?itemName=NomicFoundation.hardhat-solidity). 37 | - [Mocha Test Explorer](https://marketplace.visualstudio.com/items?itemName=hbenl.vscode-mocha-test-adapter) 38 | 39 | ### Foundry 40 | - [Coverage Gutters](https://marketplace.visualstudio.com/items?itemName=ryanluker.vscode-coverage-gutters) 41 | - [Forge Snippets](https://marketplace.visualstudio.com/items?itemName=Crisgarner.foundry-snippets) 42 | - [Foundry Test Explorer](https://marketplace.visualstudio.com/items?itemName=naps62.foundry-vscode-test-adapter) 43 | - [TOML language support](https://marketplace.visualstudio.com/items?itemName=be5invis.toml) 44 | 45 | _Важно!_ Нужно быть внимательным. Расширения для поддержки языка могут конфликтовать друг с другом. Не обязательно использовать все расширения сразу. 46 | 47 | Список интеграций для других IDE можно посмотреть [тут](https://docs.soliditylang.org/en/v0.8.18/resources.html#editor-integrations). 48 | 49 | ## Linting and formatting для тестов 50 | 51 | Есть несколько подходов в организации тестов для смарт контрактов. Например, для Foundry тесты пишутся на языке Solidity и это значит, что нам достаточно стандартного линтинга и форматирования только для языка Solidity. 52 | 53 | В других средах разработки ситуация может быть немного иной. Например в Hardhat используются: библиотека [ethers.js](https://docs.ethers.org/v5/) и тестовый фреимворк [mocha](https://mochajs.org/). Это подразумевает написание тестов на языке [javascript](https://learn.javascript.ru/) или [typescript](https://www.typescriptlang.org/). 54 | 55 | - [ESLint](https://eslint.org/). Понадобится для линтинга js или ts. 56 | 57 | _Важно!_ Для других фреймворков могут понадобиться свои инструменты линтинга и форматирования. 58 | -------------------------------------------------------------------------------- /junior-3/gas/README.md: -------------------------------------------------------------------------------- 1 | # Вопросы про gas в EVM 2 | 3 | ## Общие вопросы 4 | 5 | 1. Что представляет из себя газ в контексте блокчейна? 6 | 2. Почему газ необходим EVM? Привести ключевые аспекты. 7 | 8 | ## Вопросы по gas price 9 | 10 | 1. В чем оплачивается комиссия за газ в Ethereum? 11 | 2. Кто устанавливает цены на газ в Ethereum? 12 | 3. За что отвечают параметры `gasPrice` и `gasLimit` в транзакции? 13 | 4. Как происходит расчет стоимости газа перед выполнением транзакции и что случается после ее завершения? 14 | 5. Какова формула для расчета комиссии за транзакцию в Ethereum 1.0 (до EIP-1559)? 15 | 6. По какому принципу майнеры отбирали транзакции в Ethereum 1.0? 16 | 7. Какие основные недостатки расчета газа были в Ethereum 1.0? 17 | 8. Как изменились параметры транзакции связанные с газом после EIP-1559? Рассказать про каждый из них. 18 | 9. Как изменилась модель расчета газа после внедрения EIP-1559? Как стала выглядеть формула расчета? 19 | 10. Что такое `base fee`? Кто его определяет и как он изменяется во времени? 20 | 11. Как `base fee` влияет на размер блока? Что происходит с `base fee` после выполнения транзакции? 21 | 12. От чего зависит скорость включения транзакции в блок Ethereum? 22 | 13. Возможно ли установить нулевые значения для `gasLimit`, `maxFeePerGas` или `maxPriorityFee`? Каковы будут последствия в каждом случае? 23 | 14. Какие типы транзакций существуют в Ethereum и в чем их отличия? 24 | 25 | ## Вопросы по gas used 26 | 27 | 1. За что отвечает параметр `gasUsed` в транзакции EVM и может ли он превышать `gasLimit`? 28 | 2. На что тратиться газ внутри EVM? 29 | 3. Когда возникает ошибка "out of gas"? 30 | 4. В каких ситуациях неиспользованный газ возвращается при возникновении ошибки EVM и когда нет? 31 | 5. Какие функции клиента go-ethereum ответственны за обработку транзакций и выполнение кода смарт-контрактов? 32 | 6. В чем различие между выполнением транзакции с вызовом смарт-контракта и без него? 33 | 7. Что такое статический и динамический газ в контексте EVM и как они рассчитываются? 34 | 8. Могут ли у операции в EVM отсутствовать затраты на динамический газ? 35 | 9. Как рассчитывается газ при работе с `memory`? 36 | 10. Какова роль значений `original`, `current` и `new` при записи данных в хранилище смарт-контракта? 37 | 11. Описать статусы хранилища (storage): "Dirty", "Fresh" и "No-op". 38 | 12. Для чего нужен был хард-форк St.Petersburg? 39 | 13. Что представляют собой "теплые" и "холодные" доступы к слотам хранилища? 40 | 14. Что такое списки доступа, как они работают и зачем они нужны? 41 | 15. Зачем нужен механизм возврата газа при очистке хранилища и в каких случаях он может быть полезен? 42 | 16. Что такое внутренний газ (intrinsic gas) транзакции и из чего он складывается? 43 | - Как считается газ за `calldata`? 44 | - Какой G-параметр учитывается в каждой транзакции? 45 | 17. Как происходит учет газа на уровне блока? 46 | 18. Как выглядит процесс учета газа на уровне транзакции? 47 | 48 | ## Links 49 | 50 | - [EIP-1559: Fee market change for ETH 1.0 chain](https://eips.ethereum.org/EIPS/eip-1559) 51 | - [Doc: Ethereum Whitepaper](https://ethereum.org/en/whitepaper#fees) 52 | - [Doc: Ethereum Yellow Paper](https://ethereum.github.io/yellowpaper/paper.pdf) 53 | - [Article: How does Ethereum work](https://www.preethikasireddy.com/post/how-does-ethereum-work-anyway) 54 | - [Article: Understanding the Ethereum virtual machine – part I](https://leftasexercise.com/2021/09/12/understanding-the-ethereum-virtual-machine-part-i/) 55 | - [Article: Understanding the Ethereum virtual machine – part II](https://leftasexercise.com/2021/09/15/understanding-the-ethereum-virtual-machine-part-ii/) 56 | - [Article: Understanding the Ethereum virtual machine – part III](https://leftasexercise.com/2021/09/19/q-understanding-the-ethereum-virtual-machine-part-iii/) 57 | - [Article: Dissecting EVM using go-ethereum Eth client implementation. Part III — bytecode interpreter](https://medium.com/@deliriusz/dissecting-evm-using-go-ethereum-eth-client-implementation-part-iii-bytecode-interpreter-8f144004ed7a) 58 | - [Article: EIP-2930 - Ethereum access list](https://www.rareskills.io/post/eip-2930-optional-access-list-ethereum) 59 | - [Code: Go-Ethereum](https://github.com/ethereum/go-ethereum) 60 | -------------------------------------------------------------------------------- /junior-1/practice/2-erc-20.md: -------------------------------------------------------------------------------- 1 | # ERC-20 2 | 3 | - Пройти [Lesson 12: Hardhat ERC-20](https://github.com/smartcontractkit/full-blockchain-solidity-course-js#lesson-12-hardhat-erc20s) 4 | 5 | Критерии прохождения задания: 6 | - Изучить стандарт ERC-20, разобрать все основные методы. 7 | - Написать простой ERC-20 токен без использования OpenZeppelin. 8 | - Деплой токена в тестовую сеть, добавление этого токена в метамаск, взаимодействие с контрактом токена через интерфейс etherscan. 9 | - Понять как работают `transfer`, `transferFrom` и `approve`. Отличие перевода ERC-20-токена от нативного токена сети (например, ETH). 10 | - Пройтись по литературе на которую приведены ссылки. 11 | 12 | > Дополнительно: Необязательно делать если пока нет четкого понимания работы ERC-20, но потом нужно вернуться.Попробовать расширить функциональность токена: 13 | > - Попробовать добавить Permit, сформировать и передать подпись в контракт. 14 | > - Попробовать добавить transferAndCall. 15 | 16 | ## Какие навыки даст задание? 17 | 18 | 1. Понимание общего принципа ERC-20 токена - несмотря на недостатки (которые частично закрываются расширениями) такой токен используется почти в каждом DeFi протоколе, поэтому важно знать как работают основные функции и для чего они нужны. Задание даст понимание базы, но в таком "чистом" виде ERC-20 в природе почти не встречается, его всегда расширяют дополнительным функционалом, поэтому неплохо ознакомиться с подобными расширениями. 19 | 2. Понимание что такое EIP, ERC и как с ними работать. 20 | 21 | ## Вопросы по теории: 22 | 23 | 1. Что такое EIP? Что такое ERC? В чем отличие? 24 | 2. Какие три основных вида EIP существуют и что они в себя включают? Почему разработка и поддержка EIP сообществом ethereum это важно? 25 | 3. Каким по назначению может быть ERC-20 токен? Что такое utility и security токены? 26 | 4. Какие методы должны быть в токене ERC-20? Что они делают? Какие обязательные, а какие нет? 27 | 5. Какие функции в смарт-контракте токена нужны для управления эмиссией? 28 | 6. Какая уязвимость связана с апрувом и какие способы защиты от подобных атак? Какие методы позволяют защитится от нее? 29 | 7. Зачем нужны хуки `_beforeTokenTransfer` и `_afterTokenTransfer`? Как их использовать, какие есть правила при использовании хуков? В каких методах ERC-20 они могут быть? 30 | 8. Какие недостатки есть у ERC-20? 31 | 9. Какие расширения ERC-20 есть у OpenZeppelin? 32 | 10. Расширения ERC-20, Какой функционал добавляют следующие расширения: 33 | - Burnable. 34 | - Capped. 35 | - Pausable 36 | - Snapshot 37 | - Wrapper 38 | 39 | ## Дополнительно 40 | 41 | 1. Расширения, которые помогают устранить недостатки ERC-20: 42 | - Permit (ERC2612). Какие варианты использования? 43 | - TransferAndCall (ERC-223, ERC-677, ERC-1363) В чем преимущества и недостатки трех подходов? 44 | - В чем отличие ERC777 от ERC-20? Какие преимущества дает ERC777? Почему сообщество отказалось от идеи использовать ERC777? 45 | - Tokenized Vault Standard (ERC4626). Для чего нужен? 46 | 2. Утилиты 47 | - SafeTransfer - как использовать библиотеку и зачем? Какие есть аналоги? 48 | 49 | ## Литература помимо той, что дана в курсе: 50 | 51 | - [Understand the ERC-20 token smart contract](https://ethereum.org/en/developers/tutorials/understand-the-erc-20-token-smart-contract/) 52 | - [Utility token](https://www.ledger.com/ru/academy/glossary/utility-token) 53 | - [Набор контрактов и утилит ERC-20 от OpenZeppelin](https://docs.openzeppelin.com/contracts/4.x/api/token/erc20#IERC20) 54 | - [ERC-20 Github OpenZeppelin](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/ERC20.sol) 55 | - [Использование хуков ERC-20](https://docs.openzeppelin.com/contracts/4.x/extending-contracts#using-hooks) 56 | - [YouTube: ERC-20 Token Tutorial](https://www.youtube.com/watch?v=gc7e90MHvl8) 57 | - [Introduction To ERC Token Standards](https://medium.com/immunefi/how-erc-standards-work-part-1-c9795803f459) 58 | - [EIPs](https://eips.ethereum.org/) 59 | - [Tokenized Vault Standard](https://ethereum.org/en/developers/docs/standards/tokens/erc-4626/) 60 | - [ERC-677](https://github.com/ethereum/EIPs/issues/677) 61 | - [EIP-1363](https://eips.ethereum.org/EIPS/eip-1363) 62 | - [Deprecate ERC777 implementation](https://github.com/OpenZeppelin/openzeppelin-contracts/issues/2620) 63 | - [Deprecate ERC777 ethereum.org](https://ethereum.org/en/developers/docs/standards/tokens/erc-777/) -------------------------------------------------------------------------------- /junior-1/tools/README.md: -------------------------------------------------------------------------------- 1 | # Tools 2 | 3 | 🛠️В этом разделе мы сделаем обзор на инструменты, которые помогают понимать блокчейн и взаимодействовать со смарт-контрактами. Если ты планируешь разрабатывать смарт-контракты, то тебе будет необходимо знать и использовать эти инструменты. 4 | 5 | ## Etherscan 6 | 7 | _Опр!_ [Etherscan](https://etherscan.io/) - это ведущая платформа для исследования блокчейна, поиска, API и аналитики в сети Ethereum. Еще его называют обозреватель блоков. Платформа обеспечивает равноправный доступ к данным блокчейна. 8 | 9 | _Важно!_ Etherscan выполняет множество функций кошелька, но никогда не хранит приватные ключи аккаунтов и не контролирует транзакции в блокчейне. 10 | 11 | ### Как он работает? 12 | 13 | Etherscan работает, как поисковая система, индексируя все транзакции в блокчейне Ethereum. Когда ты вводишь адрес аккаунта или контракта в поле поиска, он показывает все транзакции этого адреса. Для этого даже не нужно создавать аккаунт на etherscan. 14 | 15 | Результат поиска по адресу можно посмотреть на скриншоте. В красную рамку выделены адрес контракта, баланс, токен трекер, список вкладок для аналитики. Аналитика включает в себя вкладки: обозреватель транзакций на этом адресе, взаимодействие с контрактом и тому подобное. 16 | 17 | ![](./images/etherscan-search.png) 18 | 19 | Если смарт-контракт был верифицирован, то есть автор предоставил интерфейс, который описывает смарт-контракт, то в этом случае можно прям на платформе посмотреть код контракта. 20 | 21 | ![](./images/etherscnan-code.png) 22 | 23 | Или даже можно взаимодействовать с контрактом. В разных вкладках функции на чтение и запись. 24 | 25 | ![](./images/etherscnan-interact.png) 26 | 27 | Для сети Sepolia(это тестовая сеть Ethereum) тоже есть свой [обозреватель блоков](https://sepolia.etherscan.io/). 28 | 29 | _Важно!_ Обычной практикой является создание своего отдельного обозревателя блоков для каждого блокчейна. Например: 30 | - для Tron => [TronScan](https://tronscan.org/#/) 31 | - для Polygon => [PolygonScan](https://polygonscan.com/) 32 | - для BNB Smart Chain => [BscScan](https://bscscan.com/) 33 | - и т.д. 34 | 35 | Обозреватели блоков являются базовым необходимым инструментом дял отслеживания транзакций в сети. Они полностью бесплатны и в большинстве простых случаев его функционала достаточно. 36 | 37 | ## Tenderly 38 | 39 | _Опр!_ [Tenderly](https://docs.tenderly.co/) - это универсальная Web3 платформа разработки, которая включает в себя инструменты отладки, тестирования и разработки смарт-контрактов. Предоставляет кучу инструментов из коробки. Инструмент можно использовать в режиме дашбордов для сбора аналитических данных по задеплоенным контрактам. 40 | 41 | Рабочее пространство организовано через сущность **проекты**. Для проектов можно настраивать доступ от имени организации. Также можно создать даже отдельные версии проектов. 42 | 43 | Продукт включает следующие инструменты: 44 | - **Tenderly Explorer** (функционал аналогичный etherscan). Просмотр транзакций.Авторизация не обязательна. 45 | - **Песочница**. Позволяет писать код смарт-контрактов и `javascript` скрипты для быстрого прототипирования или обучения написанию смарт-контрактов. Код смарт-контракта будет компилироваться и выполняться прямо в браузере. 46 | - **Web3 Gateway**. Надежное решение в доступе к блокчейну с мгновенной синхронизацией данных. Можно анализировать и исторические данные. 47 | - **Contract verification**. Можно верифицировать контракт так, чтобы он был виден только владельцу проекта в Tenderly. И только при деплое конечного варианта верифицировать публично. Часто это бывает удобно, чтобы не светить тестовый код контрактов. 48 | - **Transaction Simulator**. Можно симулировать любую транзакцию и посмотреть, что получится в ответе. В основной state блокчейна транзакция конечно не попадет. Работает через вызов JSON RPC метода `eth_call`. Умеет показывать `traces` вызовов. 49 | - **Web3 Actions**. Это обычная функция `javaScript`, работающая в инфраструктуре Tenderly. Срабатывает в зависимости от определенных правил триггера события в сети и запускает action к исполнению. 50 | - **Wallet Monitoring**. Также как и контракт, можно добавить адрес кошелька в Tenderly. Это дает возможность следить за транзакциями, симулировать транзакции и настраивать поток оповещений. 51 | - **Transaction Filtering**. Для этого инструмента выделена отдельная вкладка, которая представляет список транзакций конкретного контракта или кошелька. Можно гибко настраивать табличное представление и фильтровать транзакции по собственным параметрам. 52 | - **Visual Debugger**. Визуальный инструмент, который позволяет детально рассмотреть, что происходит внутри транзакции. Позволяет детально разобрать `call traces`. Можно походить вперед и назад прям по стеку вызовов и debugger будет подсвечивать вызываемые строчки кода. 53 | - **Smart Contract Analytics**. Отдельный инструмент для сбора аналитических данных со смарт-контракта. Позволяет смотреть на вызовы транзакции с течением времени, статистику различных вызовов, дневную, недельную и месячную активность. 54 | - **Real-time Alerting**. Можно настроить собственные оповещения. 55 | - **Gas Profiler**. Является частью debugger. Показывает детальный расход газа транзакцией. Можно посмотреть статистику расходу относительно каждого вызова. 56 | - **Forks**. Дает возможность создавать форк сети и запускать в нем код смарт-контракта. Это дает гибкость в запуске симуляции транзакции или целой группы симуляций изолировано внутри форка. 57 | - **Integrations**. Есть интеграция с `hardhat`. Для этого используется специальный плагин `hardhat-tenderly`. Необходимо будет указать аккаунт и проект tenderly с которым будет интеграция. Можно экспортировать транзакции в tenderly. Можно верифицировать контракт при помощи tenderly. 58 | 59 | Думаю ты понял, что **tenderly** является очень мощным инструментом. Единственный минус заключается в том, что он платный. Бесплатный план довольно скуден.🐷 Можно завести только один проект и добавить одну организацию, нельзя добавить команду к дашбордам, ограничено количество контрактов, за которыми можно следить. Малоинформативная дефолтная аналитика. Однако и на бесплатном плане возможности впечатляют. Его обязательно нужно попробовать в деле. 60 | 61 | -------------------------------------------------------------------------------- /junior-3/meta-transactions/README.md: -------------------------------------------------------------------------------- 1 | # Вопросы по meta transactions 2 | 3 | 1. Что такое метатранзакции? 4 | 2. Для чего можно применять метатранзакции? Назвать не менее трех вариантов использования. 5 | 3. Какая основная идея стандарта ERC-2771? 6 | - Какая задача отводится контракту **Forwarder**? 7 | - Для чего необходимо использовать ```_msgSender()``` вместо ```msg.sender```? 8 | 4. Gas Station Network - это пример проекта с открытым исходным кодом, который помогает реализовать метатранзакции. Можешь рассказать, как он устроен, как работает, как устроена его верхнеуровневая архитектура? 9 | - Для чего необходимо реализовать контракт ```Paymaster```? 10 | - Можно ли использовать [контракты из библиотеки OpenZeppelin](https://docs.openzeppelin.com/contracts/4.x/api/metatx) для организации метатранзакций? 11 | - Какие еще есть сервисы, которые можно использовать для организации метатранзакций? 12 | 5. Можно ли реализовать метатранзакции нативно? 13 | - Как работает следующий пример кода? 14 | ```solidity 15 | // SPDX-License-Identifier: UNLICENSED 16 | pragma solidity ^0.8.19; 17 | 18 | import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; 19 | 20 | contract Token is ERC20 { 21 | bytes32 public constant META_TRANSACTION_TYPEHASH = 22 | keccak256("MetaTransaction(uint256 nonce,address signer,bytes functionSignature)"); 23 | 24 | mapping(address signer => uint256 nonce) private _nonces; 25 | 26 | struct MetaTransaction { 27 | uint256 nonce; 28 | address signer; 29 | bytes functionSignature; 30 | } 31 | 32 | event MetaTransactionExecuted( 33 | address signer, 34 | address relayer, 35 | bytes functionSignature 36 | ); 37 | 38 | error ZeroAddress(); 39 | error InvalidSignature(); 40 | error InvalidCall(); 41 | 42 | constructor() ERC20("Token", "MTT") {} 43 | 44 | function DOMAIN_SEPARATOR() public view returns (bytes32) { 45 | return keccak256( 46 | abi.encode( 47 | keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"), 48 | keccak256("EIP712"), 49 | keccak256("1"), 50 | block.chainid, 51 | address(this) 52 | ) 53 | ); 54 | } 55 | 56 | function executeMetaTransaction( 57 | address signer, 58 | bytes memory functionSignature, 59 | uint8 v, 60 | bytes32 r, 61 | bytes32 s 62 | ) external payable returns (bytes memory result) { 63 | MetaTransaction memory _tx = MetaTransaction({ 64 | nonce: _nonces[signer], 65 | signer: signer, 66 | functionSignature: functionSignature 67 | }); 68 | 69 | bool isVerify = _verify(signer, _tx, v, r, s); 70 | if (!isVerify) { 71 | revert InvalidSignature(); 72 | } 73 | 74 | _nonces[signer] += 1; 75 | 76 | (bool success, bytes memory data) = address(this).call( 77 | abi.encodePacked(functionSignature, signer) 78 | ); 79 | 80 | if (!success) { 81 | revert InvalidCall(); 82 | } 83 | 84 | emit MetaTransactionExecuted(signer, msg.sender, functionSignature); 85 | 86 | return data; 87 | } 88 | 89 | function getNonce(address account) external view returns (uint256) { 90 | return _nonces[account]; 91 | } 92 | 93 | function _msgSender() internal view override returns (address sender) { 94 | if (msg.sender == address(this)) { 95 | assembly { 96 | sender := shr(96, calldataload(sub(calldatasize(), 20))) 97 | } 98 | } 99 | else { 100 | return super._msgSender(); 101 | } 102 | } 103 | 104 | function _verify( 105 | address signer, 106 | MetaTransaction memory _tx, 107 | uint8 v, 108 | bytes32 r, 109 | bytes32 s 110 | ) private view returns (bool) { 111 | if (signer == address(0)) { 112 | revert ZeroAddress(); 113 | } 114 | 115 | return signer == ecrecover(_getDigest(_tx), v, r, s); 116 | } 117 | 118 | function _getDigest(MetaTransaction memory _tx) private view returns (bytes32) { 119 | return keccak256( 120 | abi.encodePacked( 121 | "\x19\x01", 122 | DOMAIN_SEPARATOR(), 123 | keccak256( 124 | abi.encode( 125 | META_TRANSACTION_TYPEHASH, 126 | _tx.nonce, 127 | _tx.signer, 128 | keccak256(_tx.functionSignature) 129 | ) 130 | ) 131 | ) 132 | ); 133 | } 134 | } 135 | ``` 136 | 6. Творческий вопрос. Как ты считаешь, на сколько важны метатранзакции? Есть ли у них будущее? Нарушают ли они какие-нибудь законы децентрализации? 137 | 138 | ## Links 139 | 140 | - [Gas-free transactions: Meta Transactions explained](https://medium.com/coinmonks/gas-free-transactions-meta-transactions-explained-f829509a462d) 141 | - [ERC-2771](https://eips.ethereum.org/EIPS/eip-2771) 142 | - [Gas Station Network](https://docs.opengsn.org/) 143 | - [Native Meta Transactions](https://medium.com/gitcoin/native-meta-transactions-e509d91a8482) -------------------------------------------------------------------------------- /junior-3/solidity/README.md: -------------------------------------------------------------------------------- 1 | # Вопросы по Solidity 2 | 3 | ## Evm opcodes 4 | 5 | 1. Что такое opcodes? 6 | - Что означает цепочка ```Solidity → Байт-код → Opcodes```? 7 | - Для чего необходимо базовое понимание opcodes? 8 | 2. Известно, что opcodes условно делятся на несколько групп. Твоя задача, на каждую группу, привести в пример несколько opcodes и обозначить предназначение всей группы. 9 | - Управление стеком. 10 | - Арифметика 11 | - Операции среды 12 | - Управление памятью memory 13 | - Управление памятью storage 14 | - Управление program counter 15 | - Остановка процесса 16 | 3. За выполнение каждого opcode, требуется оплата за выполнение в сети. Оплата выражена в единицах, которые называются газ. 17 | - В чем разница между базовой стоимостью выполнения opcode и динамической? 18 | - Какой самый дорогой opcode? Сколько газа он требует? 19 | 4. Что делает следующий байт-код? Какой будет результат выполнения? 20 | > 6002600404600201 21 | 22 | - [Evm opcodes](https://www.evm.codes/?fork=shanghai) 23 | - [The Ethereum Virtual Machine — How does it work?](https://medium.com/mycrypto/the-ethereum-virtual-machine-how-does-it-work-9abac2b7c9e) 24 | 25 | ## Bitwise operators 26 | 27 | 1. Что такое бит и байт, в чем отличие? 28 | 2. Что такое знаковые и беззнаковые числа в контексте битов? 29 | 3. Какие бывают виды знаковых чисел? Какой вид самый используемый? 30 | 4. Как работают прямой, обратный и дополнительный код? Какие проблемы могут возникнуть в прямом и обратном коде? 31 | 5. Что такое битовые операции? 32 | 6. Какие существуют битовые операции? 33 | 7. Что такое логические вентили? 34 | 8. Какие действия можно выполнять с битами используя битовые операции? 35 | 9. Что такое битовые сдвиги? 36 | 10. Как работают арифметический, логический и циклический сдвиги? В чем отличия? 37 | 11. Где используются битовые операции и для чего? 38 | 12. Что происходит в этом коде? Как можно сделать то же самое по-другому? 39 | ```js 40 | function bitOperation(uint8 number, uint8 index) external pure returns (uint256) { 41 | return number & ~(1 << index); 42 | } 43 | ``` 44 | 45 | - [Двоичные числа](https://asm.kcup.tusur.ru/Library/chapter%201/1-1.html) 46 | - [Как два байта переслать](https://pikabu.ru/story/kak_dva_bayta_pereslat_7070913) 47 | - [Прямой, обратный и дополнительный код](https://microkontroller.ru/programmirovanie-mikrokontrollerov-avr/pryamoy-obratnyiy-dopolnitelnyiy-kod-dvoichnogo-chisla/) 48 | - [Видео: как работают отрицательные числа](https://www.youtube.com/watch?v=BIYiuy8WWiU) 49 | - [Bitwise operation](https://en.wikipedia.org/wiki/Bitwise_operation) 50 | - [Видео: как работать с битами](https://www.youtube.com/watch?v=qewavPO6jcA) 51 | - [Побитовые операции](https://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%BE%D0%B1%D0%B8%D1%82%D0%BE%D0%B2%D1%8B%D0%B5_%D0%BE%D0%BF%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%B8) 52 | 53 | ## Yul 54 | 55 | 1. Что такое Yul? Как и для чего он используется? 56 | 2. Как работает область видимости переменных в **inline assembly** вставках? Рассказать как будет работать код на примере ниже. 57 | ```js 58 | assembly { 59 | let x := 3 60 | 61 | { 62 | let y := x 63 | } 64 | 65 | { 66 | let z := y 67 | } 68 | } 69 | ``` 70 | 71 | 3. Какие есть типы данных в Yul, как объявляются переменные с этими типами? 72 | 4. Какие литералы допустимо использовать в коде Yul? 73 | 5. Рассказать про инструкции в Yul, в какой последовательности будет выполняться код ниже? Чему будет равен `x` если `a` = 3, `b` = 6? 74 | ```js 75 | let x := div(mul(a, b), add(a, b)) 76 | ``` 77 | 78 | 6. С помощью каких операторов выстраивается поток управления в Yul? 79 | 7. Как устроен тип памяти storage, какие два вида переменных существуют в storage? 80 | - Как работает упаковка слотов в storage? Как записывать и извлекать значения из упакованных слотов? 81 | - Как хранятся структуры в storage? 82 | - Как хранятся массивы с фиксированной длиной? Где хранится длина массива? 83 | - Как хранятся динамические массивы? Где хранится длина и как получить доступ к индексу массива? Как получить доступ к динамическому массиву вложенному в динамический массив? 84 | - Как хранятся mappings? Как получить доступ к элементу mapping? Как получит доступ к mapping вложенному в mapping? Как получить доступ к массиву вложенному в mapping? 85 | - Как хранятся массив байтов и строки? Какая есть особенность? 86 | - Какие есть инструкции для работы со storage в Yul? 87 | 8. Как устроен тип памяти memory? Для чего используется тип памяти memory? 88 | - Когда переменные инициализируются в memory и когда очищаются? 89 | - Какая есть особенность при работе с memory? Можно ли записывать что-то в первые 128 байт? Как они используются Solidity? 90 | - Как получить указатель на свободное место в memory? 91 | - Очищается ли memory автоматически при переключении с кода solidity на inline assembly и наоборот? 92 | - Какие есть инструкции для работы с memory в Yul? 93 | - Как хранятся структуры в memory? 94 | - Как хранятся массивы фиксированной длины и динамические массивы? 95 | - Как хранятся массивы байтов и строки? 96 | - Как работают инструкции `revert` и `return`? 97 | - Как работает `keccak256` в memory? 98 | 9. Как устроен тип памяти calldata? 99 | - Для чего используется тип данных calldata? 100 | - Почему работать с calldata дешевле по газу чем с memory? 101 | - Какие инструкции в Yul есть для работы с типом данных calldata? 102 | - Как в calldata хранятся массивы? 103 | - Как в calldata хранятся массивы байтов и строки? 104 | - Как сделать срез данных (array slice), для чего это нужно? 105 | 10. Как в Yul выполняется вызов смарт-контрактов? 106 | - Какие инструкции используются для вызова смарт-контрактов? 107 | - Как работает инструкция `call(g, a, v, in, insize, out, outsize)`? 108 | - Как обрабатываются возвращаемые данные? 109 | 11. Как работать с событиями в Yul? 110 | - Рассказать что происходит в функции `foo`: 111 | ```js 112 | contract EmitEvent { 113 | event SomeLog(uint256 indexed a, uint256 indexed b, bool c); 114 | 115 | function foo() external { 116 | assembly { 117 | let signature := 0x39cf0823186c1f89c8975545aebaa16813bfc9511610e72d8cff59da81b23c72 118 | 119 | let ptr := mload(0x40) 120 | mstore(ptr, 1) 121 | 122 | log3(0x80, 0x20, signature, 2, 3) 123 | } 124 | } 125 | } 126 | ``` 127 | 12. Можно ли писать смарт-контракты на чистом Yul? 128 | 129 | - [Docs: Yul](https://docs.soliditylang.org/en/latest/yul.html) 130 | - [Docs: Layout of memory](https://docs.soliditylang.org/en/latest/internals/layout_in_memory.html) 131 | - [Playlist: Mastering Solidity Assembly (YUL)](https://youtube.com/playlist?list=PL5hld-skrdFrxGUmmEbG1LBvYVyTE9M62&si=jwXH_rtSvoNfrDPg) 132 | - [Article: Inline Assembly in Solidity: A Practical Starter’s Guide](https://medium.com/lumos-labs/inline-assembly-in-solidity-34d3ba2cfa7a) 133 | - [Video: The Dark Arts of Yul](https://www.youtube.com/watch?v=ew3pfnb2_V8) -------------------------------------------------------------------------------- /junior-1/solidity/README.md: -------------------------------------------------------------------------------- 1 | # Вопросы по Solidity 2 | 3 | ## Язык Solidity 4 | 5 | 1. Что можешь рассказать про язык Solidity? 6 | - Solidity - это интерпретируемый язык? 7 | - Есть ли типизация в Solidity? Если есть, то какая? Если нету, то почему? 8 | - Для чего был разработан этот язык? 9 | 2. Что такое EVM? 10 | 3. Понимает ли EVM язык Solidity? 11 | 4. Как дебажить написанный код? Есть ли в языке `console.log`? 12 | 13 | ## Введение в смарт контракты 14 | 15 | 1. Что такое смарт-контракт? 16 | 2. Какие особенности есть у смарт-контрактов? 17 | - Можно ли модифицировать смарт-контракт после деплоя? 18 | - Где можно посмотреть код задеплоенного смарт-контракта? 19 | 3. Могут ли контракты взаимодействовать друг с другом? 20 | 4. Может ли контракт обращаться к API сторонних сервисов. 21 | 5. На каких языках пишутся смарт-контракты? 22 | 6. Что такое gas? 23 | - Кто и как платит газ? 24 | - Что будет если газ закончится в рамках транзакции? 25 | 7. В какие сети можно разворачивать смарт-контракты? 26 | 8. Что такое ABI? 27 | - Какие функции не попадут в ABI? 28 | 9. Что такое bytecode? 29 | - Как bytecode связан с ABI? 30 | 31 | ## Структура контракта Solidity 32 | 33 | 1. Что содержит в себе смарт-контракт? Какая структура смарт-контракта? 34 | - Что такое pragma? 35 | - Какие виды лицензий бывают? 36 | 2. Что такое `constructor()`? Является ли его объявление обязательным? Когда выполняется код внутри конструктора? 37 | 3. Что такое переменные состояния(state variables)? Что такое локальные переменные? В чем отличие? 38 | - Что такое constant и immutable? В чем разница? Для каких типов переменных применимы constant и immutable? 39 | 4. Что такое variable shadowing? 40 | 5. Для чего нужны события? 41 | - Может ли контракт читать события? 42 | - Может ли смарт-контракт удалять события? 43 | 6. Для чего нужны модификаторы? 44 | 7. Можно ли в одном файле создавать множество смарт-контрактов? 45 | 8. Что такое selfdestruct и как работает? 46 | 47 | ## Типы. Value types 48 | 49 | 1. Что можешь рассказать про value types? 50 | - Booleans 51 | - Integers. Int. Uint. 52 | - Address 53 | - Массивы байтов с фиксированным размером(bytes1, …, bytesN). 54 | - Массив байт c динамическим размером(bytes). 55 | - Адресные литералы 56 | - Дробные и целочисленные литералы 57 | - Строковые литералы 58 | - Литералы Юникод 59 | - Шестнадцатеричные литералы 60 | - Типы функций 61 | 2. Что такое `uint` и чем он отличается от `uint8`, `uint256`? 62 | 3. Чем отличаются `uint` и `int`? 63 | 4. Какие есть особенности у типа address? 64 | 5. Чем отличаются динамический массив и массив с фиксированной длиной? 65 | 6. Что такое Enum? 66 | - Как получить наименьшее и наибольшее значение из Enum? 67 | - Можно ли объявлять Enum за пределами контракта? 68 | 69 | ## Типы. Reference types 70 | 71 | 1. Что можешь рассказать про reference types? 72 | - Data location(storage, memory, calldata) 73 | - Массивы(динамические и с фиксированной длиной) 74 | - Структуры 75 | 2. Как получить длину массива? 76 | 3. Как добавлять данные в массив? 77 | 4. Как обойти массив? 78 | 5. Как удалить произвольный элемент из массива? 79 | 80 | ## Типы. Mapping types 81 | 82 | 1. Что можешь рассказать про mapping types? 83 | 2. Могут ли mapping вкладываться друг в друга? 84 | 3. Как обойти mapping? 85 | 86 | ## Типы. Общие вопросы. 87 | 88 | 1. Что такое значение по умолчанию? Чему будут равны по умолчанию различные виды переменных? 89 | 2. Тернарный оператор. Составные операторы. Delete оператор. 90 | 3. Неявные и явные преобразования типов. В чем разница? 91 | 4. Можно ли объявить тип для undefined или null? 92 | 93 | ## Units and global variables 94 | 95 | 1. Как использовать Ether units и Time units? 96 | 2. Что такое глобальная переменная block? 97 | 3. Что такое глобальная переменная msg? 98 | - Чем отличается tx.origin и msg.sender? 99 | 4. Для чего используется abi.encode и abi.decode? 100 | 5. В чем разница между abi.encode и abi.encodePacked? Есть ли какие-нибудь нюансы в выборе, что использовать? 101 | 6. В чем разница между encodeWithSignature и encodeWithSelector? 102 | 7. Как работает конкатенация строк и байтов? 103 | 8. Что ты знаешь про Error Handling(assert, require, revert)? 104 | - В чем разница между assert и revert? 105 | - Какие есть перегрузки для require и revert? 106 | 9. Как работает selfdestruct? 107 | 108 | ## Выражения и структуры управления 109 | 110 | 1. Какие есть циклы в Solidity? Можно ли использовать ключевые слова break, continue, return? 111 | 2. Чем отличается i++ от ++i? 112 | 3. Почему ++i иногда предпочтительнее i++ в циклах? 113 | 4. Какие будут a, b и c при возврате? 114 | ```js 115 | contract Counter1 { 116 | function calc() public pure returns (uint, uint, uint) { 117 | uint i = 3; 118 | uint a = i++; 119 | uint b = --i; 120 | uint c = i--; 121 | return (a, b, c); 122 | } 123 | } 124 | ``` 125 | 6. Чему будет равен х? 126 | ```js 127 | contract Counter2 { 128 | function calc() public pure returns (uint) { 129 | uint i = 5; 130 | uint x = i++ + --i; 131 | return x; 132 | } 133 | } 134 | ``` 135 | 7. Будет ли валиден следующий код для conditional statements выражения? 136 | ```js 137 | if (1) { ... } 138 | ``` 139 | 8. Зачем делать пропуск именования в определение аргументов функции? 140 | 141 | ``` solidity 142 | // SPDX-License-Identifier: GPL-3.0 143 | pragma solidity >=0.4.22 <0.9.0; 144 | 145 | contract C { 146 | // omitted name for parameter 147 | function func(uint k, uint) public pure returns(uint) { 148 | return k; 149 | } 150 | } 151 | ``` 152 | 153 | 9. Как создать новый контракт через new? 154 | 10. Как создать контракт через create2? 155 | 11. Как работает деструктуризация присвоений и возврат нескольких значений? 156 | 12. Что такое checked/unchecked? 157 | 13. Как работать с try/catch? 158 | 159 | ## Видимость и геттеры в контракте 160 | 161 | 1. Какие области видимости существуют у переменных состояния? 162 | - Какая область видимости у переменных состояния по умолчанию? 163 | - Какая область видимости не может быть назначена переменной состояния? 164 | - Можно ли считать переменную `private` извне? 165 | 2. Какие области видимости существуют у функций контракта? 166 | - В чем разница между external и public? 167 | - В чем разница между internal и private? 168 | 3. Что такое геттер функции? 169 | 170 | ## Функции контракта 171 | 172 | 1. Как вернуть несколько значений из функции? 173 | 2. Что означают модификаторы view, pure, payable? 174 | 3. Зачем нужны специальные функции fallback и receive? 175 | - Что будет если отправить в контракт эфир где нет fallback/receive? 176 | 4. Как работает перегрузка функций? 177 | 178 | ## Наследование 179 | 180 | 1. Как реализовать наследование? 181 | - Что такое ключевые слова virtual и override? 182 | - Можно ли наследоваться от нескольких контрактов? 183 | 2. Как вызвать функцию родителя? 184 | 3. Как переопределить функцию в дочернем контракте? 185 | - Можно ли изменить видимость функции? Например с external на public? 186 | - Можно ли изменить с view на pure? 187 | 4. Что такое абстрактные контракты? 188 | 189 | ## Интерфейсы 190 | 191 | 1. Что такое интерфейсы? 192 | 2. Для чего нужны интерфейсы в solidity? 193 | 3. В чем отличие интерфейсов от абстрактных контрактов? 194 | 195 | ## Библиотека 196 | 197 | 1. Что такое библиотека? 198 | 2. Как подключить библиотеку? 199 | - Что такое using for? 200 | -------------------------------------------------------------------------------- /junior-1/practice/5-vault.md: -------------------------------------------------------------------------------- 1 | # Vault 2 | 3 | Волты (vaults) предоставляют возможность пользователям передавать свои активы в управление и получать от этого доход (yield). Это упрощает процесс формирования портфеля: пользователю не нужно изучать большое количество протоколов и разбираться в способах получения максимальной доходности. Разработчики автоматизировали все необходимые действия внутри стратегии волта, что значительно облегчает использование. 4 | 5 | ## TЗ 6 | 7 | Необходимо написать два основных смарт-контракта, которые реализуют функционал волта: 8 | 9 | - Vault – смарт-контракт, с которым взаимодействует конечный пользователь. Расширяет ERC20 и является share-токеном; 10 | - Strategy – смарт-контракт, предназначенный для управления want-токенами. 11 | 12 | ### Расшифровка некоторых понятий 13 | 14 | - **want-токен** (underlying токен) – токен, которым управляет волт. Это может быть любой ERC20 токен; 15 | - **share-токен** – токенизированная доля пользователя в волте в формате ERC20; 16 | - **yield** – доход пользователя. 17 | 18 | ### Как это выглядит для конечного пользователя 19 | 20 | У пользователя есть определенное количество want-токенов. Управление этим активом самостоятельно может быть сложным, поэтому проще найти платформу, которая принимает данный актив в управление. 21 | 22 | Пользователь находит такую платформу, видит список волтов и их доходность. Он выбирает волт, работающий с его want-токенами, и делает депозит, физически передавая want-токены в управление волту. Взамен он получает share-токены. 23 | 24 | Затем пользователь наблюдает за ростом баланса, доступного для вывода из волта. В любой момент он может передать свои share-токены обратно волту и получить то, что вложил, плюс накопленный доход (yield), если стратегия была успешной. 25 | 26 | ### Как это выглядит со стороны смарт-контрактов (core-функционал) 27 | 28 | Работу волта обеспечивают два основных контракта – Vault и Strategy. 29 | 30 | Примерный воркфлоу работы волта: 31 | 32 | 1. Пользователи делают депозит в волт, на контракте волта накапливаются want-токены. 33 | 2. Стратегия забирает накопившиеся want-токены и использует их для получения дохода. 34 | 3. Через определенные промежутки времени бот активирует стратегию, чтобы она снова забрала все пользовательские депозиты из волта и отчиталась о текущих заработках или потерях. 35 | 4. Время от времени пользователи могут выходить из волта. В таком случае сначала используются свободные средства на волте; если их недостаточно, волт запрашивает недостающую сумму у стратегии. 36 | 37 | ### Ответственность волта 38 | 39 | - Принимать от пользователей want-токены и выпускать взамен share-токены; 40 | - Принимать и сжигать share-токены, возвращая пользователям соответствующее количество want-токенов; 41 | - Вести учет количества want-токенов, переданных в стратегию; 42 | - Переводить performance и management fees (комиссию) на адрес feeRecipient: 43 | - managementFee - это плата за использования протокола, она исчисляется в процентах годовых (например 1%) и списывается со всего депозита который обслуживает стратегия, списывается только в случае если стратегия в плюсе; 44 | - performanceFee - это комиссия только с доходов стратегии, а не со всего депозита, также списывается только когда стратегия что-то заработала. 45 | Пример: 46 | Стратегия управляет `1000$`. До вызова `harvest()` стратегия заработала `100$`, общее количество средств `1100$`. Предположим managementFee = 1%, performanceFee = 0.5%, тогда: 47 | - managementFee = 1100 * 1% / 12 = `0.92$` 48 | - performanceFee = 100 * 0.5% = `0.5%` 49 | Общая комиссия: 0.92 + 0.5 = `1.42$`. Если общая комиссия превышает доход - приравниваем ее к полученному доходу (стратегия не должна уйти в минус). 50 | 51 | **Формула для депозита:** 52 | 53 | ![vault-formula](./img/vault-formula.png) 54 | 55 | - *tA* – Vault.totalAssets (want-токен) 56 | - *tS* – Vault.totalSupply (share-токен) 57 | - *dA* – depositAmount (сумма депозита) 58 | - *s* – shares to mint (количество share-токенов для выпуска) 59 | 60 | ### Ответственность стратегии 61 | 62 | - Взять want-токены из волта и использовать их в соответствии с принятой стратегией управления; 63 | - Синхронизировать доходы и убытки с волтом. 64 | 65 | 66 | ### Дополнительный функционал (обязательный) 67 | 68 | - Возможность приостановки работы стратегии с возвратом всех want-токенов на баланс стратегии; 69 | - Возможность экстренной остановки стратегии в случае взлома или подозрения на взлом. Необходимо максимально вернуть want-токены и перевести их на адрес владельца; 70 | - Возможность миграции на новую стратегию. Старая стратегия должна быть опустошена и остановлена; 71 | - Поддержка нескольких стратегий одним волтом. 72 | 73 | ### Внешние сервисы 74 | 75 | - Настроить сервис для создания бота, который будет вызывать методы стратегии по определенным триггерам; 76 | - Написать и задеплоить сабграф, который будет отображать текущее состояние стратегии на момент последней транзакции. 77 | 78 | ## Пример простой стратегии 79 | 80 | Необходимо найти DeFi-протокол, который поощряет провайдеров ликвидности дополнительными вознаграждениями. Условия получения вознаграждений могут варьироваться: в некоторых протоколах потребуется застейкать LP-токен (токен, полученный от депозита в пул ликвидности). 81 | 82 | Алгоритм работы стратегии может выглядеть следующим образом: 83 | 1. Стратегия вкладывает want-токены в пул ликвидности DeFi-протокола и получает LP-токен пула. 84 | 2. DeFi-протокол распределяет по пулу свои комиссии (т.е. стоимость LP-токена, которым владеет стратегия, растет) и начисляет вознаграждения. 85 | 3. Раз в сутки стратегия конвертирует вознаграждения в want-токены с помощью Uniswap и повторяет первый шаг. 86 | 87 | ## Требования к выполнению задания 88 | 89 | - **Соблюдение лучших практик**. Код должен быть структурированным, читабельным, соответствовать базовым правилам безопасности. 90 | - **Проверка кода с помощью Slither**. Допустимы только некоторые низкоприоритетные предупреждения, не представляющие угрозу безопасности. 91 | - **Функции должны эмитить соответствующие события на изменение состояния смарт-контракта**. События должны содержать только важные данные, которые будут использоваться снаружи. 92 | - **Необходимые проверки входных данных**. Например, проверка на нулевой адрес для токенов оплаты ERC-20, чтобы избежать ошибок или потерь средств. 93 | - **Ограничение доступа к функциям смарт-контракта**. Использовать расширения Ownable или AccessControl для ограничения доступа к важным функциям протокола. 94 | - **Во время проектирования архитектуры думайте об основных инвариантах протокола**. Инвариант — это свойство системы, которое никогда не должно нарушаться, например, сумма балансов всех держателей токенов должна соответствовать общему предложению токенов или количество токенов для перевода должно соответствовать фактически полученному количеству смарт-контрактом. Рекомендуется ознакомиться с подходами CEI (Checks-Effects-Interactions) и FREI-PI (Function Requirements-Effects-Interactions + Protocol Invariants). 95 | - **Использование ReentrancyGuard от OpenZeppelin** для защиты функций смарт-контракта от повторных вызовов (где это необходимо). 96 | - **Использовать стандарт ERC-4626**. 97 | - **Проект должен быть разработан с использованием [Foundry](https://github.com/foundry-rs/foundry)**. Без использования Hardhat. 98 | - **Должны быть написаны деплой-скрипты**. В формате ContractName.s.sol. 99 | - **Покрытие юнит-тестами должно быть 100%**. Проверка должна выполняться через команду `forge test --coverage`. 100 | - **Написание интеграционных тестов на форке мейннета**. Тесты должны подтвердить, что протокол может взаимодействовать с Uniswap и выбранным DeFi-протоколом для стратегии. Например, можно использовать версии Uniswap, начиная с v2, и DeFi-протоколы типа Compound v2. 101 | - **Деплой смарт-контрактов в тестнет**. Смарт-контракты волта и стратегии должны быть верифицированы. 102 | - **Рабочий сабграф**. Сабграф должен функционировать без ошибок и содержать основные сущности с данными. Необходимо подумать, какие данные могут понадобиться вашему web3-приложению на клиенте. Рекомендуется использовать сервисы с playground для API, такие как The Graph. 103 | - **Документация**. Подробное описание по развертыванию, запуску проекта и по функционалу смарт-контрактов. 104 | - **Видео-демонстрация работы сервиса**. Необходимо записать видео расшаренного экрана с демонстрацией работы сервиса, для ускорения ревью. 105 | - **Репозиторий github**. Оформленный и задокументированный код необходимо предоставить для ревью в виде ссылки на репозиторий. 106 | 107 | ## Полезные ссылки 108 | 109 | - Code: Волт от [Yearn](https://github.com/yearn/yearn-vaults/blob/main/contracts/Vault.vy). Для вдохновения. Написан на vyper, но его довольно легко понять 110 | - Standard: [ERC-4626: Tokenized Vaults](https://eips.ethereum.org/EIPS/eip-4626) 111 | - Article: [ERC-4626 Interface Explained](https://www.rareskills.io/post/erc4626) 112 | -------------------------------------------------------------------------------- /junior-2/practice/2-dex.md: -------------------------------------------------------------------------------- 1 | # DEX 2 | 3 | **DEX**(Decentralized exchange) - децентрализованный обменник. Управление и администрирование такого сервиса не принадлежит никому или находится в руках сообщества. Доступ к активам осуществляется без помощи посредника, поэтому такой обменник можно назвать [одноранговым](https://academy.binance.com/en/glossary/peer-to-peer) или P2P. 4 | 5 | Подобного рода протоколы, позволяют создавать пулы ликвидности и наполнять их токенами, чтобы пользователи могли обменивать(торговать) токены. Базой для ценообразования активов выступает алгоритм **AMM**(automated market maker). 6 | 7 | ## TЗ 8 | 9 | 1. Необходимо реализовать протокол DEX, который позволит: 10 | - Создавать пулы ликвидности. Пул будет состоять из двух токенов стандарта ERC-20. 11 | - Добавлять и удалять ликвидность. 12 | - Проводить обмен одного ERC-20 токена на другой с учетом проскальзывания. 13 | 2. Необходимо реализовать систему создания новых пар. 14 | 3. Необходимо реализовать систему сбора комиссий для протокола. 15 | 16 | ## Контракты для реализации: 17 | 18 | - **Router** - смарт-контракт для взаимодействия пользователей с протоколом. Позволяет добавлять и удалять ликвидность к любой созданной паре токенов, позволяет обменивать один токен на другой. 19 | - **Pair** (пул) - смарт-контракт, который является ERC-20 токеном(LP токен). Хранит резервы токенов. Будет отражать доли участников пула. 20 | - **Registry** - смарт-контракт, который будет хранить актуальный список задеплоенных пар. 21 | - **Factory** - смарт-контракт, который деплоит новую пару, создает запись о ней в смарт-контракте **Registry**. 22 | - **Fee** - смарт-контракт, который отвечает за информацию по комиссиям протокола. 23 | - Комиссия за свопы: установка, обновление значения 24 | - Комиссия протокола: установка, обновление значения, хранение LP токенов. 25 | 26 | ## Как это выглядит для поставщика ликвидности 27 | 28 | Поставщик через вызов смарт-контракта **Router** добавляет ликвидность. Если пара не была зарегистрирована на контракте **Registry**, то вызов контракта **Factory** создает новый контракт **Pair**. **Factory** должна передать контракту **Pair** при создание адрес контракта **Fee**. После создания пары, **Factory** регистрирует пару на контракте **Registry**. 29 | 30 | ![](./images/use-case-liquidity-provider.png) 31 | 32 | _Важно_ Удаление ликвидности(remove liquidity) работает по такой же схеме, как и добавление ликвидности, если нужная пара существует и ликвидность была добавлена. 33 | 34 | Любой поставщик ликвидности может: 35 | - Создать новую пару токенов, если она не была создана. Первый депозит должен задать начальный курс между парой токенов. Курс может быть каким угодно. 36 | - Добавить ликвидность. Взамен поставщик получает lp токены. 37 | - Забрать ликвидность. Сжечь lp токены через протокол и забрать свою ликвидность(оба токена) с вознаграждением. Например, пул содержит 100 USDT и 200 shitCoin. Согласно количеству lp токенов, доля поставщика равняется 10%. Соответственно, он получит 10 USDT и 20 shitCoin + вознаграждение за предоставление ликвидности. 38 | - Передать lp-токены третьему лицу. Это будет означать, что поставщик передал права на долю своей ликвидности в пуле. 39 | 40 | ## Вознаграждение за предоставление ликвидности 41 | 42 | С каждым обменом общая ликвидность пула растёт. То есть протокол взимает комиссию с каждого обмена. Поэтому стоимость доли поставщика тоже растет. Например, 43 | - у поставщика 10% доля в пуле, всего в пуле 1000 USDT + 1000 DAI, значит ему принадлежит 100 USDT + 100 DAI. 44 | - пользователь делает обмен 200 USDT -> 200 DAI, но протокол удерживает комиссию 5 DAI и пользователь получает 195 DAI 45 | - после обмена в пуле 1200 USDT + 805 DAI (общая ликвидность увеличилась), значит поставщику теперь принадлежит 120 USDT + 80.5 DAI при этом доля в процентах никак не изменилась, она осталась 10%, но в перерасчете на токены доля увеличилась. 46 | 47 | ## Как это выглядит для пользователя 48 | 49 | Пользователь вызывает функцию **swap** на контракте **Router**. **Router** проверяет регистрацию пары на контракте **Registry**. Если пара была зарегистрирована, то производит **swap** и обновляет информацию о резервах на контракте **Pair**. 50 | 51 | ![](./images/use-case-swap.png) 52 | 53 | У пользователя должна быть возможность выполнить два вида обмена: 54 | - Пользователь указывает сумму токена, которую он отдает протоколу. Взамен, протокол рассчитывает сумму второго токена, которую можно отдать пользователю. Протокол производит обмен. 55 | - Пользователь указывает сумму второго токена, которую он хочет получить из протокола. Взамен, протокол рассчитывает сумму первого токена, которую пользователь должен отдать. Протокол производит обмен. 56 | 57 | ## Как это выглядит со стороны контрактов 58 | 59 | ### Шаг первый: 60 | 61 | Деплой контрактов: 62 | - **Router** 63 | - **Pair** 64 | - **Registry** 65 | - **Factory** 66 | - **Fee** 67 | 68 | ### Шаг второй: 69 | 70 | - Устанавливаем на контракте **Router** адрес контракта **Registry**. Чтобы получать адрес контракта **Pair**. 71 | - Устанавливаем на контракте **Factory** адреса контракта **Registry**. 72 | - Устанавливаем на контракте **Registry** адрес контракта **Factory**. Только контракт **Factory** должен уметь записывать адреса пар. 73 | 74 | ### Шаг третий: 75 | 76 | - Контракты готовы к использованию, тестируем все основные операции: 77 | - добавление и удаление ликвидности 78 | - обмены 79 | - списание комиссий 80 | - сохранение правильного соотношения торгуемых пар 81 | 82 | ## Функционал смарт-контракта Router: 83 | 84 | **Router** может добавлять и удалять ликвидность в пары, для этого ему нужно знать адрес **Registry**, чтобы получить нужную пару. 85 | 86 | Необходимо реализовать функции: 87 | - `addLiquidity` 88 | - `removeLiquidity` 89 | 90 | **Router** может производить обмен ERC-20 токена на ERC-20 токен. 91 | Необходимо реализовать функции: 92 | - `swapIn(tokenA, tokenB, amountIn, amountOutMin) returns (amountOut)`. 93 | - Обмен **tokenA** на **tokenB**. 94 | - **amountIn** - это сумма **tokenA**, которую пользователь готов обменять на **tokenB**. 95 | - **amountOutMin** указывает минимальное количество **tokenB**, которое пользователь согласен получить. 96 | - `swapOut(tokenA, tokenB, amountOut, amountInMax) returns (amountIn)`. 97 | - Обмен **tokenA** на **tokenB**. 98 | - **amountOut** - это сумма **tokenB**, которую пользователь хочет получить. 99 | - **amountInMax** указывает максимальное количество **tokenA**, которое протокол может списать с пользователя. 100 | - `getAmountOut(amountIn)` - эта функция должна возвращать количество **tokenB**, если к обмену будет предложено **amountIn**. 101 | - `getAmountIn(uint amountOut)` - эта функция должна возвращать количество **tokenA**, которое необходимо, чтобы получить **amountOut** для **tokenB**. 102 | 103 | _Важно!_ Обе функции делают обмен **tokenA** на **tokenB**, и должны возвращать результат обмена(сколько пользователь в итоге получил **tokenB** или сколько отдал **tokenA**). 104 | 105 | ## Ответственность смарт-контракта Factory: 106 | 107 | - Создает новый контракт Pair для новой пары токенов. Использовать паттерн [minimalProxy](https://docs.openzeppelin.com/contracts/3.x/api/proxy#Clones). 108 | - Регистрирует новую пару через вызов контракта **Registry** 109 | 110 | ## Ответственность смарт-контракта Registry: 111 | 112 | - Регистрирует новую пару. Записывает адрес контракта **Pair**. Вызов разрешен только доверенным адресам. Использовать [Access control](https://docs.openzeppelin.com/contracts/3.x/access-control). 113 | - Функция `getPair(tokenA, tokenB)` обязательна для получения адреса контракта **Pair**. 114 | 115 | ## Ответственность смарт-контракта Pair: 116 | 117 | Контракт является ERC-20 токеном. Это необходимо для начисления lp токенов поставщикам ликвидности. 118 | 119 | - `mint()` - Минтит lp токены, когда поставщик добавляет ликвидность. 120 | - `burn()` - Сжигает lp токены, когда поставщик забирает ликвидность. 121 | - `swap()` - Производит непосредственный обмен токенами. Обновляет информацию о резервах токена. 122 | - Знает о смарт-контракте **Router**. Только **Router** может вызывать `mint()`, `burn()`, `swap()` 123 | 124 | ## Ответственность смарт-контракта Fee: 125 | 126 | _Важно!_ Swap fee должно быть реализовано внутри смарт-контракта **Router**. Fee должно быть незамедлительно начислено в резервы пула ликвидности. Приветствуется использование библиотеки, для реализации получения и расчета swap fee. То есть отделение логики расчетов от основного контракта в собственную библиотеку. 127 | 128 | Смарт-контракт **Fee** должен иметь возможность включать и выключать сбор комиссий с протокола. Сбор взимается с общей доли поставщиков ликвидности. Таким образом любой обмен, увеличивает резервы в пуле и увеличивает долю владения контракта **Fee**. То есть, когда поставщику ликвидности минтятся lp токены, часть из них должна минтиться для контракта **Fee**. На контракте **Fee** должна быть возможность обменять lp токены на настоящие токены пары или передать право владения lp токенами. 129 | 130 | Смарт-контракт **Fee** должен: 131 | 1. Регулироваться [Access control](https://docs.openzeppelin.com/contracts/3.x/access-control). 132 | 2. Устанавливать размер fee не больше максимального 0.2%. 0.3% должно взиматься с каждого обмена. 133 | 134 | ## Дополнительный функционал, который можно реализовать 135 | 136 | 1. Поддержка сложных путей, когда прямой своп не возможен из-за отсутствия нужной пары, но можно реализовать возможность передать маршрут обмена. Функция должна автоматически выполнить обмен согласно маршруту через другие пары. 137 | 138 | _Важно!_ Считаем, что оптимальный маршрут рассчитывается off-chain. И смарт-контракты работают с этим маршрутом, делая обмены. 139 | 140 | 2. Добавление ликвидности в виде пары ETH - ERC-20. 141 | 3. Обмен ETH на токен ERC20 и обратно. 142 | 143 | ## Требования к выполнению задания 144 | 145 | - Полное покрытие контрактов unit тестами, в том числе в режиме форка сети (mainnet, testnet) 146 | - Написание интеграционных тестов, которые позволят протестировать протокол на взаимодействие между контрактами на группе пользователей. Например, симулировать: создание пары, добавление ликвидности, обмены разными пользователями, снятие ликвидности, проверка вознаграждения. 147 | - Скрипты деплоя, которые развернут протокол в тестовую сеть с верификацией смарт-контрактов. 148 | - Документация и описание всех публичных функций по natspec. 149 | - Должна быть продумана система событий. Для всех функций(где необходимо) должен быть реализован emit событий. 150 | 151 | Безопасность: 152 | 153 | - Модификаторы `ReentrancyGuard` и `Ownable` можно взять из OpenZeppelin. 154 | - Модификаторы `onlyFactory` и `onlyRouter` делаются по подобию `onlyOwner`. 155 | 156 | _Важно!_ В любом случае использование надежных контрактов от openZeppelin, которые прошли аудит приветствуется. 157 | 158 | ### Полезные ссылки 159 | 160 | Протокол Uniswap V2 может быть полезным. 161 | 162 | - [Uniswap docs](https://docs.uniswap.org/) 163 | - [Core](https://github.com/Uniswap/v2-core) 164 | - [Periphery](https://github.com/Uniswap/v2-periphery) -------------------------------------------------------------------------------- /junior-2/solidity/README.md: -------------------------------------------------------------------------------- 1 | # Вопросы по Solidity 2 | 3 | ## Try / Catch 4 | 5 | 1. Что такое try / catch? Как эта конструкция используется в языке Solidity? Какие могут быть причины ошибки вызова функции смарт-контракта? 6 | 2. Какие типы блоков Catch поддерживаются в Solidity? 7 | - Какой тип блока catch используется для ```revert("reasonString")```? 8 | - Какой тип блока catch используется, если ошибка была вызвана делением на ноль? 9 | - Какие типы блока catch используется, если ошибка не подходит под два предыдущих случая, но ошибку необходимо обработать? 10 | 3. Чем отличается try / catch от других вариантов обработки ошибок(require, assert, revert)? 11 | 4. Может ли вызов функции через call заменить конструкцию try / catch? 12 | 13 | - [Solidity docs](https://docs.soliditylang.org/en/v0.8.19/control-structures.html#try-catch) 14 | 15 | ## Unchecked Math 16 | 17 | 1. Что такое **overflow/underflow** в solidity? 18 | 2. Для чего используется библиотека Safe Math от OpenZeppelin? Нужно ли в версии solidity выше 0.8 использовать библиотеку Safe Math? 19 | 3. Для чего в solidity существует **unchecked**? 20 | 21 | 4. Расскажи, что вернет функция ```getCounter()```, после вызова функции ```increase()``` или ```decrease()``` в каждой реализации контракта ```Counter```. 22 | 23 | ```solidity 24 | // SPDX-License-Identifier: MIT 25 | pragma solidity 0.8.0; 26 | 27 | contract Counter { 28 | uint8 _counter= 255; 29 | 30 | function increase() public payable { 31 | _counter++; 32 | } 33 | 34 | function getCounter() external view returns(uint8) { 35 | return _counter; 36 | } 37 | } 38 | ``` 39 | 40 | ```solidity 41 | // SPDX-License-Identifier: MIT 42 | pragma solidity 0.8.0; 43 | 44 | contract Counter { 45 | uint8 _counter= 255; 46 | 47 | function increase() public payable { 48 | unchecked {_counter++;} 49 | } 50 | 51 | function getCounter() external view returns(uint8) { 52 | return _counter; 53 | } 54 | } 55 | ``` 56 | 57 | ```solidity 58 | // SPDX-License-Identifier: MIT 59 | pragma solidity 0.7.0; 60 | 61 | contract Counter { 62 | uint8 _counter= 255; 63 | 64 | function increase() public payable { 65 | _counter++; 66 | } 67 | 68 | function getCounter() external view returns(uint8) { 69 | return _counter; 70 | } 71 | } 72 | ``` 73 | 74 | ```solidity 75 | // SPDX-License-Identifier: MIT 76 | pragma solidity 0.8.0; 77 | 78 | contract Counter { 79 | int8 _counter= -128; 80 | 81 | function decrease() public payable { 82 | unchecked {_counter--;} 83 | } 84 | 85 | function getCounter() external view returns(int8) { 86 | return _counter; 87 | } 88 | } 89 | ``` 90 | 91 | 5. Как можно использовать **unchecked** для уменьшения затрат газа при работе с циклами? 92 | 93 | - [Integer Overflow and Underflow](https://blog.solidityscan.com/integer-overflow-and-underflow-in-smart-contracts-9598032b5a99) 94 | - [Sample Smart Contract to see how it works](https://ethereum-blockchain-developer.com/010-solidity-basics/03-integer-overflow-underflow/) 95 | - [Unchecked arithmetic trick](https://medium.com/@ashwin.yar/solidity-tips-and-tricks-1-unchecked-arithmetic-trick-cefa18792f0b) 96 | 97 | ## Function selector 98 | 99 | 1. Что такое сигнатура функции? Что такое селектор функций и как он создается в Solidity? Какие есть способы получить селектор функции в смарт-контракте? (назвать несколько) 100 | 2. Как селекторы функций связаны с ABI (Application Binary Interface) в Solidity и какое значение имеет ABI для разработки контрактов? 101 | 3. Можете ли быть так, что две функции в контракте Solidity могут иметь одинаковое имя, но разные селекторы функций? 102 | 4. Как можно использовать селекторы функций для оптимизации использования газа в контрактах Solidity? 103 | 5. Как селекторы функции используются в вычислении `interfaceId` для интерфейса смарт-контракта? 104 | 105 | - [Solidity docs](https://docs.soliditylang.org/en/develop/abi-spec.html#function-selector) 106 | - [A technical primer on using encoded function calls](https://medium.com/linum-labs/a-technical-primer-on-using-encoded-function-calls-50e2b9939223) 107 | - [How To Decipher A Smart Contract Method Call](https://medium.com/@hayeah/how-to-decipher-a-smart-contract-method-call-8ee980311603) 108 | - [Advanced gas optimization tips for Solidity](https://coinsbench.com/advanced-gas-optimizations-tips-for-solidity-85c47f413dc5#:~:text=to%20gas%20specifications.-,Function%20names,-Solidity%20compiler%20reads) 109 | - [ERC-165: Standard Interface Detection](https://github.com/fullstack-development/blockchain-wiki/blob/main/EIPs/erc-165.md) 110 | 111 | ## Contract ABI Specification 112 | 113 | 1. Кто генерирует ABI? Что из себя представляет ABI? 114 | - Что обозначают поля: type, name, inputs, outputs, stateMutability в ABI? 115 | 2. Какие типы Solidity не являются частью ABI? 116 | 3. Как кодируются статические типы? 117 | 4. Как кодируются динамические типы? 118 | 5. Как кодируются вызовы функций? 119 | 6. Как кодируются ошибки? 120 | 7. Как кодируются события? 121 | - Как кодируются индексированные аргументы? 122 | 123 | - [Solidity docs](https://docs.soliditylang.org/en/v0.8.19/abi-spec.html#contract-abi-specification) 124 | 125 | ## Call, staticcall, delegatecall, calling other contract 126 | 127 | 1. Для чего нужна низкоуровневая функция `call`, какие аргументы принимает? 128 | 2. Что возвращает функция `call`? Как декодировать возвращаемые значения? 129 | 3. Почему метод передачи эфира через `call` является предпочтительным? 130 | 4. Можно ли указывать лимит газа для транзакции при вызове `call`? Если да, то зачем указывать лимит газа и какие могут быть проблемы? 131 | 5. Для чего нужна низкоуровневая функция `staticcall`, в чем отличие от `call`? 132 | 6. Для чего нужна низкоуровневая функция `delegatecall`, в чем отличие от `call` и `staticcall`? 133 | 7. Какие возможны уязвимости связанные с `delegatecall`? 134 | 8. Как все эти функции связаны с `msg.value` и `msg.data`? 135 | 9. Как вызвать другой контракт с помощью этих функций? Как вызвать конкретную функцию другого контракта с аргументами? 136 | 10. По каким причинам низкоуровневый вызов других смарт-контрактов через `call` не является предпочтительным? 137 | 11. Приведи несколько примеров, когда без низкоуровневого вызова другого смарт-контракта через `call` и `delegatecall` не обойтись? 138 | 139 | - [Solidity docs: ](https://docs.soliditylang.org/en/v0.8.19/introduction-to-smart-contracts.html#message-calls) 140 | - [Solidity docs: Members of Address Types](https://docs.soliditylang.org/en/v0.8.11/units-and-global-variables.html#members-of-address-types) 141 | - [Staticcall](https://eips.ethereum.org/EIPS/eip-214) 142 | - [Delegatecall](https://eips.ethereum.org/EIPS/eip-7) 143 | - [Learn Solidity lesson 34. Call, staticcall and delegatecall](https://medium.com/coinmonks/call-staticcall-and-delegatecall-1f0e1853340) 144 | - [Solidity by example - Call](https://solidity-by-example.org/call/) 145 | - [SWC-112 - delegatecall](https://swcregistry.io/docs/SWC-112) 146 | - [What is gas limit](https://ethereum.org/en/developers/docs/gas/#what-is-gas-limit) 147 | 148 | ## Import 149 | 150 | 1. Идея ```import``` основана на **концепции модулей**. В чем основная суть этого концепта? 151 | 2. Local **vs** external. В чем разница? 152 | 3. **Specific import**. Как этим пользоваться? 153 | - Нужно ли стремиться использовать **specific import** за место импорта всего, что есть в файле? Например, ```import "./Storage.sol"``` 154 | - Что можно импортировать из файла ```Storage.sol``` для использования в контракте ```SpecificImport```? 155 | 156 | ```solidity 157 | /// SpecificImport.sol 158 | 159 | // SPDX-License-Identifier: MIT 160 | pragma solidity 0.8.17; 161 | 162 | import { 163 | // Что можно импортировать из контракта Storage? 164 | } from "./Storage.sol"; 165 | 166 | contract SpecificImport {} 167 | ``` 168 | 169 | ```solidity 170 | /// Storage.sol 171 | 172 | // SPDX-License-Identifier: MIT 173 | pragma solidity 0.8.17; 174 | 175 | address constant OWNER = 0x607B5e673D3ea42A0F85aDD6f529196500FC9E04; 176 | uint256 constant STORAGE_SLOT = 113; 177 | 178 | struct StorageList { 179 | address storageContract; 180 | } 181 | 182 | interface IStorage { 183 | function getStorageSlot() external view returns (uint256); 184 | function setStorageSlot(uint256 newStorageSlot) external; 185 | } 186 | 187 | library Array { 188 | function removeItem(uint256 index) external {} 189 | } 190 | 191 | enum STATUS { 192 | ACTIVE, 193 | PAUSED 194 | } 195 | 196 | error Storage_SetStorageLimit(); 197 | 198 | // User-defined value type. More https://docs.soliditylang.org/en/v0.8.13/types.html#user-defined-value-types 199 | type UFixed256x18 is uint256; 200 | 201 | contract Storage { 202 | uint256 private _storageSlot = STORAGE_SLOT; 203 | uint256 _maxSetStorageCount; 204 | 205 | mapping(address => uint256) _counter; 206 | 207 | event StorageSlotUpdated(address sender); 208 | 209 | constructor(uint256 maxSetStorageCount) { 210 | _maxSetStorageCount = maxSetStorageCount; 211 | } 212 | 213 | function getStorageSlot() external view returns (uint256) { 214 | return _storageSlot; 215 | } 216 | 217 | function setStorageSlot(uint256 newStorageSlot) external { 218 | if (_counter[msg.sender] >= _maxSetStorageCount) { 219 | revert Storage_SetStorageLimit(); 220 | } 221 | 222 | _storageSlot = newStorageSlot; 223 | 224 | _counter[msg.sender] += _counter[msg.sender]; 225 | 226 | emit StorageSlotUpdated(msg.sender); 227 | } 228 | } 229 | 230 | function createStorage(uint256 maxSetStorageCount) returns (address) { 231 | Storage storageImpl = new Storage(maxSetStorageCount); 232 | return address(storageImpl); 233 | } 234 | 235 | ``` 236 | 4. **Import Aliases**. Ключевое слово **as**. Для чего это нужно? 237 | 238 | - [Solidity docs](https://docs.soliditylang.org/en/v0.8.19/layout-of-source-files.html#importing-other-source-files) 239 | 240 | ## Library 241 | 242 | 1. Общие вопросы по библиотекам? 243 | - Можно ли отправить эфир библиотеке? 244 | - Есть ли в библиотеке переменные состояния? 245 | - Могут ли библиотеки содержать в себе ```receive()```, ```callback()``` или ```payable``` функции? 246 | - Могут ли библиотеки быть уничтожены через вызов ```selfdestruct()```? 247 | - Можно ли наследовать библиотеку и быть унаследованным? 248 | 2. Почему использование библиотеки дешевле, чем наследование контрактов? 249 | 3. Какие из перечисленных типов данных можно реализовать в библиотеке? 250 | - struct 251 | - enum 252 | - интерфейс 253 | - любую публичную переменную ```uint256 public myVar = 100;``` 254 | - константу ```uint256 constant MY_CONSTANT = 100;``` 255 | - модификатор 256 | 4. Какие есть варианты развертывания библиотеки? В чем разница между этими вариантами? 257 | 5. Можно ли объявлять в библиотеках функции без имплементации, как в интерфейсах? 258 | ```solidity 259 | function onConnect() public pure returns (bool); 260 | ``` 261 | 6. Можно ли использовать ```Event``` в библиотеках? Могут ли возникнуть какие-то сложности в связи с этим? 262 | 7. Можно ли использовать модификаторы внутри библиотеки? Какие есть особенности с этим связанные? 263 | 264 | - [Solidity docs](https://docs.soliditylang.org/en/v0.8.19/contracts.html#libraries) 265 | - [Solidity Tutorial: all about Libraries](https://jeancvllr.medium.com/solidity-tutorial-all-about-libraries-762e5a3692f9) 266 | 267 | ## Creating Contracts 268 | 269 | 1. Какие есть два возможных способа создания контрактов? 270 | 2. Как создать контракт через new? Что на самом деле внутри происходит при создании таким способом? 271 | 3. Для чего нужен constructor? Сколько раз он вызывается? Можно ли делать перегрузку для constructor? 272 | 4. Как передать эфир при создании контракта? 273 | 5. Как создать контракт через create? Как создать контракт через create2? Какие различия между create и create2? Как у них происходит образование адреса контракта? Почему не безопасно создавать через create? 274 | 6. Можно ли каким-то образом передеплоить смарт-контракт на тот же адрес но с другим кодом? 275 | 7. Что такое Factory pattern в solidity? Какие есть типы? какие преимущества их использования? Когда необходимо их использовать? 276 | 277 | - [Solidity by example](https://solidity-by-example.org/new-contract/) 278 | - [EVM Dialect](https://docs.soliditylang.org/en/v0.8.18/yul.html#evm-dialect) 279 | - [About create and create2](https://mixbytes.io/blog/pitfalls-of-using-cteate-cteate2-and-extcodesize-opcodes) 280 | - [Factory patterns](https://blog.logrocket.com/cloning-solidity-smart-contracts-factory-pattern/) 281 | 282 | ## Keccak256 283 | 284 | 1. Что такое хеш-функции? Для чего они нужны? 285 | 2. Почему в solidity используется функция `keccak256`? 286 | 3. Как эта функция используется на уровне языка Solidity? 287 | 4. В каких случаях может понадобиться хешировать данные на смарт-контракте? Как это сделать? 288 | 5. Есть ли различия между хешированием и шифрованием? 289 | 290 | - [Hashing Functions In Solidity Using Keccak256](https://medium.com/0xcode/hashing-functions-in-solidity-using-keccak256-70779ea55bb0) 291 | - [Hashing with Keccak256](https://solidity-by-example.org/hashing/) 292 | - [SHA-3 Standard](https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.202.pdf) 293 | 294 | ## Commitment scheme 295 | 296 | 1. Что такое commitment scheme (можно встретить название commit-reveal scheme)? Какие этапы в себя включает? 297 | 2. Для каких случаев необходимо применять commitment scheme? Привести не меньше трех use cases. 298 | 3. Какую роль играет хеширование и алгоритм `keccak256` в commitment scheme? 299 | 4. Задача: реализовать простой смарт-контракт, демонстрирующий работу commitment scheme. 300 | > **Игра "данетка"**. 301 | > Первый игрок загадывает строку, фиксирует загаданное на блокчейне (для этого необходимо вызвать функцию `commit()`). Затем второй игрок угадывает строку по наводящим вопросам, при этом первый игрок может отвечать да или нет. В конце игры, первый игрок раскрывает строку, которая была загадана (для этого необходимо вызвать функцию `reveal()`), чтобы доказать, что загаданное было отгадано (или не отгадано). 302 | 303 | ```solidity 304 | contract YesOrNo { 305 | function commit(bytes32 hash) external { 306 | // TODO: реализовать сохранение загаданного слова или фразы 307 | } 308 | 309 | function reveal(string memory value) external returns (string memory) { 310 | // TODO: реализовать раскрытие сохраненной строки 311 | } 312 | } 313 | ``` 314 | 315 | - [Commitment scheme](https://en.wikipedia.org/wiki/Commitment_scheme) 316 | - [Exploring Commit-Reveal Schemes on Ethereum](https://medium.com/@0xkaden/exploring-commit-reveal-schemes-on-ethereum-c4ff5a777db8) 317 | - [Blind auction](https://docs.soliditylang.org/en/v0.8.23/solidity-by-example.html#id2) 318 | 319 | ## Digital signatures 320 | 321 | 1. Что такое цифровая подпись? Для чего используется подпись? 322 | - В чем разница между подписью транзакции и подписью произвольного сообщения? 323 | 2. Что такое ECDSA в общих чертах(глубокое математическое понимание не нужно)? 324 | - Что понимается под обозначением {**r**, **s**, **v**}? Как называется и что решает {**v**}? 325 | 3. В кошельках подпись часто используется в следующем виде: 326 | ```0x0f1928d8f26b2d9260929425bdc6ac922f7d787fd73b42afe2548776a0e858016f52826d8ab67e1c84e6e6778fa4769d8aa4f014bf76b3280be77e4e0c447f9b1c``` 327 | Как из этого получить {**r**, **s**, **v**}? 328 | 4. Что можно рассказать про следующие стандарты по работе с подписями? 329 | - Personal_sign. Как гарантируется, что эта подпись может быть использована только в Ethereum сети? 330 | - EIP-191: Signed Data Standard. Для чего используется **0x19**? 331 | - EIP-712: Ethereum typed structured data hashing and signing. Что решает Domain? Что решает hashStruct? 332 | 1. Как на контракте проверить подпись? 333 | - Что такое ```ecrecover()```? 334 | - Что предлагает библиотека OpenZeppelin? 335 | 2. Приведи три примера того, как можно использовать цифровую подпись. 336 | 337 | - [Digital signatures](https://ethereum.org/en/glossary/#digital-signatures) 338 | - [The Magic of Digital Signatures on Ethereum](https://medium.com/mycrypto/the-magic-of-digital-signatures-on-ethereum-98fe184dc9c7) 339 | - [Intro to Cryptography and Signatures in Ethereum](https://medium.com/immunefi/intro-to-cryptography-and-signatures-in-ethereum-2025b6a4a33d) 340 | - [Математические и криптографические функции](https://docs.soliditylang.org/en/v0.8.19/units-and-global-variables.html#mathematical-and-cryptographic-functions) 341 | - [EIP-191](https://eips.ethereum.org/EIPS/eip-191) 342 | - [Testing EIP-712 Signatures](https://book.getfoundry.sh/tutorials/testing-eip712) 343 | 344 | ## Upgradeable contracts 345 | 346 | 1. Что такое обновляемые контракты? Для чего это нужно? 347 | 2. Можно ли мигрировать данные с одного смарт-контракта на другой? 348 | - Как это сделать? 349 | - Что мешает это сделать или в чем основная сложность? 350 | 3. Может ли помочь в обновление кода контрактов разделение хранения данных и логики реализации по разным контрактам? 351 | 4. Можно ли применять поведенческие шаблоны проектирования для разделения хранения данных и логики? Как применить шаблон Strategy? 352 | - Можно ли при использование паттерна Strategy обновить главный контракт логики? 353 | 5. Как применить шаблон проектирования Proxy для обновления контрактов? 354 | - Как работает прокси для смарт-контрактов? В чем основной концепт? Как в этом концепте участвует функция `delegateCall()`? 355 | - Что такое конфликт селекторов функций? 356 | - Для чего нужен стандарт ERC-1967: Proxy Storage Slots? 357 | - Что можно рассказать про Transparent proxy? Как он устроен? Для чего предназначался? 358 | - Что такое UUPS? В чем его отличие от Transparent? 359 | - Для чего был придуман Beacon Proxy? 360 | - Что такое EIP-1167? Для чего библиотека Clones от OpenZeppelin? Можно ли обновлять прокси, созданные при помощи этой библиотеки? 361 | 6. В чем основная идея Diamond Proxy? Для каких случаев предназначался этот подход? 362 | - В чем отличие Inherited storage VS Diamond Storage VS App Storage? 363 | 7. В чем плюсы и минусы использования обновляемых контрактов? --------------------------------------------------------------------------------