FAQ по курсу Solidity

#solidity #ethereum #faq

Это ответы на часто задаваемые вопросы по бесплатному курсу Solidity, который вы можете найти на YouTube.

Если вам нужна дополнительная помощь или есть мысли, что ещё можно добавить в этот документ, пишите в наш чат Telegram.

Должен заметить, что все эти уроки создаются на чистом энтузиазме, поэтому ваше пожертвование, даже небольшое, лишним не будет точно. Вы можете оформить спонсорство на YouTube, а также использовать Boosty или Patreon. Криптовалюту тоже можно отправить, мой адрес 0x719C2d2bcC155c85190f20E1Cc3710F90FAFDa16 (mainnet, binance smart chain, arbitrum one, zk era mainnet, matic mainnet).

Я не знаю, какую опцию выбирать при создании проекта Hardhat

TLDR; смотрите обновлённую версию пятого урока вот тут, там всё объясняется. Но всё-таки если вы смотрите старую (изначальную) версию пятого урока, то читайте дальше.

В пятом уроке упоминается, что при создании Hardhat нужно выбрать опцию Create a basic sample project. Проблема в том, что теперь такой опции нет — вместо неё вам нужно будет выбрать Create a JavaScript project, суть та же самая. Если же вы знаете TypeScript, то сразу выбирайте Create a TypeScript project.

Я пытаюсь создать проект Hardhat, но он вообще не предлагает выбрать тип нового проекта

Если после запуска команды npx hardhat вы видите не выбор типа проекта (Create a JavaScript project или Create a TypeScript project), а какую-то справочную информацию по Hardhat, это почти наверняка означает, что ваш проект уже создан. Иными словами, вы запускаете команду из директории, где конфиг Hardhat уже лежит.

Что нужно сделать? Самое простое — создать новую пустую директорию в каком-нибудь другом месте и там запустить все команды заново. Можно также посмотреть официальное руководство. Во всяком случае, нужно проверить, что в директории, где вы только планируете создать проект, или в родительских директориях уже нет файла типа hardhat.config.js. Он должен появиться после создания проекта, но никак не до этого.

После установки Hardhat мне предлагается установить буквально пару зависимостей

В старых видео может быть показано, что необходимо установить много всего, это правда. К счастью, теперь у нас есть решение toolbox, которое содержит в себе всё необходимое. Достаточно установить только его. Фактически, ваш файл package.json может содержать только две библиотеки:

{
  "name": "hardhat-project",
  "devDependencies": {
    "@nomicfoundation/hardhat-toolbox": "^3.0.0",
    "hardhat": "^2.13.0",
  }
}

Только не забудьте добавить toolbox в ваш файл hardhat.config.

В Remix я не знаю, какую среду и версию языка выбирать!

На момент весны 2024 года я рекомендую выбирать Remix VM (Cancun) и версию языка не ниже 0.8.25.

Я пишу тесты, но получаю ошибку, что метода deployed() нет!

Если при написании скрипта для деплоя вы видите ошибку вроде "no matching function (argument="key", value="deployed" ...)", то используйте код:

const Factory = await ethers.getContractFactory("Demo");
const demo = await Factory.deploy();
// вот тут используем новый метод вместо deployed():
await demo.waitForDeployment();

Вместо "Demo" подставьте имя вашего контракта. Дело в том, что в toolbox версии 3 метод deployed() переименовали в waitForDeployment().

Я пишу тесты, но получаю ошибку, что свойства address нет!

Да, такое может быть. Если вы получаете ошибку вида "Property 'address' does not exist" (или что-то подобное, где явно упомянут address и строка, где это свойство использовано), когда пытаетесь вытащить адрес контракта в тестах или скриптах, то нужно использовать один из двух вариантов:

contractObj.target;
// ИЛИ
await contractObj.getAddress();

Оба способа вернут адрес контракта. Такая ошибка появится, если вы перешли на hardhat-toolbox версии 3.

Получаю ошибку, что метода getAddress нет!

Если вы получаете ошибку, что метода getAddress не существует, попробуйте использовать новую форму записи ethers.getAddress().

В тестах Hardhat пытаюсь использовать import, но он ругается

Если в ваших файлах автотестов используется import, но Hardhat ругается на то, что такую инструкцию использовать нельзя (ошибка вида "Cannot use import statement outside a module") или упоминает что-то про расширения .js, .cjs или про ES (ESM), то, вероятнее всего, вы изначально создали проект с типом JavaScript (а не TypeScript). К сожалению, в мире JS много неприятных чудес, и мы не можем просто использовать файлы .ts в проекте, который изначально заточен под JS (потому что обычный JS ничего про TS не знает). Соответственно, с инструкциями import там тоже могут быть сложности.

Варианта два: сделать новый проект Hardhat и выбрать тип TypeScript, либо использовать инструкцию require вместо import для подключения файлов. Примеры require есть тут. Можно, конечно, портировать существующий проект JS на TS, но тогда нужно гуглить порядок действий.

VS Code всё равно ругается и подчёркивает некоторые методы

Если вы всё проверили, никаких ошибок быть не должно, а VS Code ругается на якобы несуществующие методы, то самое простое решение — это перезапустить его. Если не помогает, то можно перекомпилировать все контракты заново npx hardhat clean && npx hardhat compile, после чего опять перезапустить редактор.

Какие плагины/темы VS Code поставить?

Обязательно нужен плагин для Solidity — остальное более-менее необязательно. Известных плагинов два и оба называются просто Solidity: один от некоего Хуана Бланко, другой от Nomic Foundation (это ребята, которые делали Hardhat). На самом деле, оба работают нормально, но лично я использую тот, что от Nomic (это не реклама, плагин совершенно бесплатный), так как он имеет поддержку Hardhat. Кроме того, некоторые студенты сообщали, что плагин от синьора Бланко почему-то помечает корректные импорты как некорректные. Впрочем, вы можете попробовать оба и сравнить. Главное помнить, что эти плагины несовместимы и включать их вместе не нужно.

Что касается темы, используйте любую, ведь это ваше рабочее пространство! Но, так как это часто спрашивают, скажу, что у меня установлена тема An Old Hope Classic. Да-да, из той самой далёкой-далёкой галактики...

Я хочу импортировать тип SignerWithAddress, но получаю ошибку

В новых версиях этот тип переехал и теперь импортируется так:

import type { SignerWithAddress } from "@nomicfoundation/hardhat-ethers/signers";

Я получаю ошибку, что utils для ethers не найдено

Модуль utils был убран. Скорее всего, вам достаточно изменить свой код, убрав его. То есть:

// БЫЛО
ethers.utils.formatUnits()

// СТАЛО

ethers.formatUnits()

В большинстве случаев этого будет достаточно. Подробнее написано в руководстве по переходу на Ethers 6.

Не понимаю, как работать с большими числами

Если вы работаете с большими числами, перейти на toolbox v3 точно стоит. Большое число от обычного там отличается лишь суффиком n, например 9n. Опять же, смотри гайд по переходу на ethers 6, а также вот это видео, где рассказано обо всех новых фичах.

Кажется, у меня какая-то не такая сеть Hardhat (не тот chainid)

Если у вас упорно вылезает сеть 31337, а вам нужна 1337, то в конфигурацию Hardhat добавляем:

{
  // тут всякие другие настройки ...
  networks: {
    hardhat: {
      chainId: 1337
    }
  }
}

Мне непонятны все эти криптографические штуки, что делать?

Такая проблема может быть, ничего страшного. Я пытаюсь её решить, развивая отдельный плейлист Crypto bits, можно глянуть его.