Тёмный

СТРИМ! Solidity и Ethereum, урок #13 (АПДЕЙТ 2024 В ЗАКРЕПЕ) | ERC20 

Ilya Krukowski
Подписаться 19 тыс.
Просмотров 15 тыс.
50% 1

ДРУЗЬЯ, НОВАЯ ВЕРСИЯ ЭТОГО УРОКА ОТ 2024 ГОДА ТУТ: www.youtube.co...
ХОЧЕШЬ СТАТЬ РАЗРАБОТЧИКОМ Solidity, узнать об Ethereum, блокчейне и многом другом ещё больше?! Мои друзья из MCS предлагают скидку на ВСЕ СВОИ БУТКЕМЫ ПО КРИПТЕ! Материалы этих буткемов подготовлены мной и другими специалистами: вы действительно узнаете ОЧЕНЬ много нового. Помимо этого, вы получите бесплатный доступ к регулярным стримам, семинарам, подкастам и дискуссионным клубам. Просто зайди на сайт moscoding.ru, выбери один из буткемпов и примени промо-код KRUK
На этом стриме узнаем, что такое ERC20 и как реализовать эти токены на языке Solidity.
Станьте спонсором канала, и вы получите доступ к эксклюзивным бонусам: / @ilyabodrovkrukowski
Станьте спонсором канала, и вы получите доступ к эксклюзивным бонусам: / @ilyabodrovkrukowski
Boosty: boosty.to/bodr...
Patreon: / bodrovis
DonationAlerts: www.donational...
Аккаунт Ethereum (ETH): 0x719C2d2bcC155c85190f20E1Cc3710F90FAFDa16
Коммит урока: github.com/bod...
Канал Telegram: t.me/dev_in_ru...
Наш чат в Telegram: t.me/joinchat/...
Мой сайт: bodrovis.tech

Опубликовано:

 

28 сен 2024

Поделиться:

Ссылка:

Скачать:

Готовим ссылку...

Добавить в:

Мой плейлист
Посмотреть позже
Комментарии : 74   
@IlyaBodrovKrukowski
@IlyaBodrovKrukowski 2 года назад
ПАРА ВАЖНЫХ МОМЕНТОВ В функции tranferFrom правильнее всё-таки писать allowances[sender][msg.sender] -= amount; Почему не добавился токен в Metamask: я просто сделал глупую ошибку и при деплое забыл указать, в какую сетку разворачиваем. Команда должна быть такая: npx hardhat run scripts\deploy --network localhost Тогда всё сработает - просто копируете второй адрес с экрана, добавляете в metamask и он подцепит имя токена и его символ, и там можно будет прямо через метамакс эти токены даже переводить (ну, сначала их купить только надо, отправив нужное кол-во wei на адрес самого магазина). Спасибо всем за вопросы и активное участие!
@Anonimus_13
@Anonimus_13 2 года назад
Кажется, понял в чем проблема. Если выбрать выбрать отправку эфира, то лимит газа для транзакции будет 21000. Так как у нас не просто перевод денег, но и куча вспомогательных операций в блокчейне, тог газ кончается и транзакция откатывается. При отправке вручную увеличил лимит газа и токены успешно купились.
@cryptomoon4700
@cryptomoon4700 2 года назад
огромное спасибо за столь чудесный стрим !
@IlyaBodrovKrukowski
@IlyaBodrovKrukowski 2 года назад
@theself7912
@theself7912 2 года назад
Спасибо за ваш труд!
@StanislavAnisimov
@StanislavAnisimov Год назад
Возникли сложности с деплоем, TypeError: (intermediate value) is not iterable Методом проб и ошибок выяснил что проблема была в строчке const [signer] = await ethers.getSigners() Помогла деструктуризация объекта ( а не массива) и _signer вместо signer Итоговый вариант выглядит так: const { _signer } = await ethers.getSigner(); Спасибо за урок и просвещение в тематику web3!
@IlyaBodrovKrukowski
@IlyaBodrovKrukowski Год назад
На здоровье! Дело в том, что квадратные скобки будут, если там просто массив (это по дефолту). Если же у вас именованные юзеры (signers), то там действительно будет объект. Именовать их можно в файле hardhat.config
@Receive_
@Receive_ Год назад
Спасибо за урок. После просмотра появились вопросы, которые оставили без сна: 1. В предыдущем уроке вы показывали как подключить интерфейс и там все было понятно - logger = Ilogger(_logger); Iloger - определенный объект, который называется как подключенный интерфейс, а _logger - адрес контракта функциями которого мы пользуемся. Здесь какая то новая запись, которая логически не понятна - token = new MyToken(address(this)); Адреса контракта ERC20 здесь нет, как и названия интерфейса. Как переменная token может быть мостом к контракту ERC20? 2. Функции allowance и approve, это те функции которые в метамаск запрашивают разрешение на вывод? 3. Контракты я развернул в Goerli, но не смог верифицировать исходный код для контракта токена. При такой структуре не понятно какой исходник нужно предоставить. Испробывал кучу вариантов, ни один не подошел. Заранее спасибо за ответы.
@IlyaBodrovKrukowski
@IlyaBodrovKrukowski Год назад
new - это деплой контракта В metamask особо ничего не запрашивается, это должен настроить сам юзер через какой-то интерфейс, видимо, на сайте, который реализует эти токены Вероятно, ему нужно всё и сразу. Есть какие-то решения, которые умеют брать несколько файлов sol и делать один большой - похоже, так и придётся делать (то есть слать ему интерфейс и сам токен)
@Receive_
@Receive_ Год назад
@@IlyaBodrovKrukowski Спасибо за ответы! Это очень сильно помогает в учебе. Уже осмысленно пересматриваю ваши уроки и не совсем понятно зачем в allowances такая сложная структура - mapping(address => mapping(address => uint)) allowances; Это на случай создания нескольких мест продаж? Потому как в нашем случае и так понятно что мы списываем с магазина, потому как total Supply у него. Заранее спасибо за ответ
@IlyaBodrovKrukowski
@IlyaBodrovKrukowski Год назад
@@Receive_ Нет просто разные операторы могут рулить разными кошельками
@vladimireliseev7602
@vladimireliseev7602 Год назад
Благодарю за виде! Я бы сказал восхитительная подача материала. Скажите пожалуйста, я с гита взял Ваш пример и там используется некая блокировка по времени unlockTime. А зачем это сделано?
@IlyaBodrovKrukowski
@IlyaBodrovKrukowski Год назад
Так это вроде в другом уроке? Это по-моему вообще демонстрационный скрипт, который hardhat делает изначально, он имеет отношения только к демо-контракту. Там это не нужно ни для чего
@vladimireliseev7602
@vladimireliseev7602 Год назад
@@IlyaBodrovKrukowski да, вы правы. Извиняюсь, сам понял)
@IlyaBodrovKrukowski
@IlyaBodrovKrukowski Год назад
@@vladimireliseev7602
@БекзодОлимов-я4ц
@БекзодОлимов-я4ц 2 года назад
Здравствуйте, а какой мини проект можно сделать на эту тему? Просто хочу закрепить эти знания чем-то практическим, а идей как это применять нету )
@IlyaBodrovKrukowski
@IlyaBodrovKrukowski 2 года назад
Сделайте голосовалку, к примеру. У кого есть токены - тот может голосовать. Можно сделать ещё сложнее и совместить голосовалку с Timelock (видео есть про него на канале). То есть кто-то предлагает транзакцию и ставит в очередь, потом идёт голосование (с токенами), а через некоторое время, если нужное кол-во голосов набрано, то транзакцию можно выполнить
@БекзодОлимов-я4ц
@БекзодОлимов-я4ц 2 года назад
@@IlyaBodrovKrukowski Понял, попытаюсь сделать
@stopfake4094
@stopfake4094 2 года назад
Можно вопросик для тех кто в танке) Зачем нужно создавать interface IERC20 если все эти функции можно просто объявить в contract ERC20???
@IlyaBodrovKrukowski
@IlyaBodrovKrukowski 2 года назад
А вы посмотрите прошлое видел на канале про интерфейсы. Интерфейсы удобны, если нет вообще исходного кода контракта или этот код слишком большой, чтобы его копировать-вставлять
@stopfake4094
@stopfake4094 2 года назад
@@IlyaBodrovKrukowski Добрый день еще один вопросик, у меня почему-то компилятор ругается если к функциям в ERC20 не добавить override, у вас они как-то наследуются из IERC20.sol ))) 🙂
@IlyaBodrovKrukowski
@IlyaBodrovKrukowski 2 года назад
@@stopfake4094 А нужно просто поставить свежую версию компилятора 0.8.13
@GennadiiKotov
@GennadiiKotov 2 года назад
ERC777 кажется очень сильный стандарт. Для его реализации, в частности для хуков, требуется EIP 1820, который был развернут на 0x1820a4B7618BdE71Dce8cdc73aAB6C95905faD24. Но если просмотреть его на bscscan - активность на этом контракте нулевая. В BSC никто не использует 1820 Registry?? Почему? Значит и 777 никто не реализует? Я немного в замешательстве по этому поводу. Можете прокомментировать?
@IlyaBodrovKrukowski
@IlyaBodrovKrukowski 2 года назад
Нет, конкретного ответить ничего не могу. 777 я редко вижу
@KOCadm
@KOCadm 2 года назад
еще такой вопросик. У меня получилось скомпилировать файли только после того, как в контракте для фун-й указал override модификатор. И тут вопрос- у вас сработало без етого модификатора, а также в интерфейсе не указано для фун-й выртуал. Я так и не понял почему с мне пришлось добавить оверайд модификатор.))
@IlyaBodrovKrukowski
@IlyaBodrovKrukowski 2 года назад
Я думаю, у вас просто компилятор более старой версии. Поставьте версию 0.8.13, это самая актуальная и должно всё работать
@МихаилРощин-г4ж
@МихаилРощин-г4ж 2 года назад
@@IlyaBodrovKrukowski у меня не получилось, всё равно ругается, может hardhat обновить?
@IlyaBodrovKrukowski
@IlyaBodrovKrukowski 2 года назад
@@МихаилРощин-г4ж Можно. Также в настройках hardhat желательно поставить версию 0.8.14 (компилятор)
@Andrey-mt6rh
@Andrey-mt6rh 2 года назад
Спасибо за видео! Почему логика взаимодействия с interface не воспроизводится Remix IDE? На какой адрес в локальной сети нужно отправить эфир, чтобы получить созданный токен?
@МаркВнуков-ъ8ы
@МаркВнуков-ъ8ы 2 года назад
на адрес контракта shop, так как там определена функция receive
@int_not_float
@int_not_float Год назад
Привет всем. Есть вопрос по поводу функции transferFrom. Когда я хочу перевести токены с одного адреса на другой(не на адрес магазина), то у меня вылетает ошибка: Arithmetic operation underflowed or overflowed outside of an unchecked block. Ее можно исправить добавив функцию unchecked для операций в transferFrom. Но вопрос: можно ли так делать или же это рушит сам стандарт и появляются дыры в коде?
@IlyaBodrovKrukowski
@IlyaBodrovKrukowski Год назад
Там смотреть надо, можно глянуть реализацию open zeppelin. unchecked можно ставить, но только если была ранее проверка, что для перевода хватает токенов. github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/ERC20.sol#L229
@int_not_float
@int_not_float Год назад
@@IlyaBodrovKrukowski спасибо большое
@od1ez
@od1ez 2 года назад
все время матерится что контракты должны быть абстрактными хотя все функции из интерфейса реализованы, никак не разберусь в чем дело
@IlyaBodrovKrukowski
@IlyaBodrovKrukowski 2 года назад
А бы поставьте самую свержую версию компилятора, должно помочь
@od1ez
@od1ez 2 года назад
спасибо за ответ, помогло)
@lexnews100
@lexnews100 2 года назад
При decimals==18 токен равен 1 ether, а не 1 wei
@IlyaBodrovKrukowski
@IlyaBodrovKrukowski 2 года назад
Думаю, что всё же нет, тк насколько я помню это знаки после запятой, то есть дробная часть. Но если это не так, скиньте плз какой-нибудь пример, который это показывает, интересно
@lexnews100
@lexnews100 2 года назад
@@IlyaBodrovKrukowski так и есть, но мы оперируем целыми числами, то есть дробную часть эмулируем, сдвигая представление на число decimals нолей. 1 целый токен в этом случае метамаск покажет, если перечислить 1*10**18 токенов, иначе увидим кучу нулей перед единицей. Но это, конечно, вопрос чисто терминологический и удобства отображения в интерфейсе.
@IlyaBodrovKrukowski
@IlyaBodrovKrukowski 2 года назад
@@lexnews100 Окей, мысль ясна, спасибо
@SuperBlitz764
@SuperBlitz764 Год назад
Добрый день, возможно глупый вопрос, но я все же задам и буду рад ответу, можно ли писать тесты для Смарт контрактов на python?
@IlyaBodrovKrukowski
@IlyaBodrovKrukowski Год назад
Да нормальный вопрос вполне. Можно на Python, для этого надо использовать решение brownie
@SuperBlitz764
@SuperBlitz764 Год назад
@@IlyaBodrovKrukowski класс, спасибо большое ☺️
@mrin0
@mrin0 4 месяца назад
!Before tests. 3:32 Optional functions. 4:21 uint8* 6:25 Getter function for mapping _allowances. 36:10 Underfow* 48:30 Это действительно приведение типов.
@pphotic
@pphotic 7 месяцев назад
При тестировании функции sell, вот такая конструкция не работает: await expect(sellTx).to.changeEtherBalance(shop, tokenSellAmount); Чтобы она сработала функцию sell надо: 1. отметить как public payable 2. забирать данные uint _amountToSell = msg.value; 3. передавать данные через value const sellTx = await shop.connect(buyer).sell({ value: tokenSellAmount }); В чем разница межу написанием function sell(uint _amountToSell) external payable и function sell() public payable uint _amountToSell = msg.value; Как правильнее делать?
@IlyaBodrovKrukowski
@IlyaBodrovKrukowski 7 месяцев назад
Вы где-то ошиблись, я думаю. Если в функции sell надо продавать ТОКЕНЫ, то писать payable там нет никакого смысла, то есть это буквально не будет иметь никакого эффекта (этот модификатор требуется только для перевода эфиров в функцию). msg.value вернёт баланс прилетевшего в функцию ЭФИРА, а не ТОКЕНОВ. Поэтому в этой функции есть аргумент _amountToSell, который и указывает кол-во ТОКЕНОВ для продажи. Если там что-то не работает, пришлите мне на почту текст ошибки и ваш код, я гляну
@pphotic
@pphotic 7 месяцев назад
@@IlyaBodrovKrukowski Проверки, которые есть в уроке - все работают. Но я хотел добавить вот такую проверку await expect(sellTx).to.changeEtherBalance(shop, tokenSellAmount); и вот она всегда возвращала 0 Судя по названию этой функции - она проверяет изменение количества ЭФИРОВ. Но тогда почему мы тестировали с помощью неё функцию покупки?
@МихаилРощин-г4ж
@МихаилРощин-г4ж 2 года назад
Невероятное видео, спасибо!
@ДенисЗайков-ы8к
@ДенисЗайков-ы8к 2 года назад
Отлично! Спасибо большое! внимательно изучаем!
@seostudio3906
@seostudio3906 2 года назад
Илья спасибо. Не успел на стрим, но обязательно посмотрю видео.
@IlyaBodrovKrukowski
@IlyaBodrovKrukowski 2 года назад
@КонстантинХохлома
Если будете покупать токены через metamask и ловить странные ошибки по типу Transaction reverted: function selector was not recognized and there's no fallback function и больше ничего интересного в консоли (или я что то не заметил там) - увеличьте газ лимит в метамаске. Убил на это несколько часов гуглинга и слепых попыток разобраться в чем дело) А за контент автору большое спасибо - крайне все понятно, при знании JS + Java сложностей в освоении не вызывает.
@IlyaBodrovKrukowski
@IlyaBodrovKrukowski 2 года назад
@МихаилРощин-г4ж
@МихаилРощин-г4ж 2 года назад
А где там лимит увеличить в настройках , не могу понять
@greatmusicradio3718
@greatmusicradio3718 Год назад
Привет, распиши пожалуйста по подробнее, как увеличить лимит газа, бьюсь уже 2 дня, не могу эфир тестовый переслать
@МихаилРощин-г4ж
@МихаилРощин-г4ж 2 года назад
у всех отображается кол-во токенов в метомаске? Я так понимаю по умолчанию 20, но у меня ругается "У нас возникли проблемы с загрузкой вашего баланса"
@liberta828
@liberta828 2 года назад
Спасибо большое продолжайте
@IlyaBodrovKrukowski
@IlyaBodrovKrukowski 2 года назад
@olegmitnik9617
@olegmitnik9617 Год назад
В чем разница *_underscorePrefixedVariable* объявленной в контракте, указанной в качестве параметра фукнции и объявленной внутри функции?
@IlyaBodrovKrukowski
@IlyaBodrovKrukowski Год назад
Одна state, другая локальная, это просто для удобства
@vazhabezhanishvili3908
@vazhabezhanishvili3908 2 года назад
Спасибо, очень понавательно!
@IlyaBodrovKrukowski
@IlyaBodrovKrukowski 2 года назад
@timurkash
@timurkash 2 года назад
Фанат Властелина Колец что ли? Толкиен?
@IlyaBodrovKrukowski
@IlyaBodrovKrukowski 2 года назад
В плане? Почему вы так решили?
@timurkash
@timurkash 2 года назад
@@IlyaBodrovKrukowski Спрашивал себя - почему толкиен-толкиен. Оказывается Токен!!!
@IlyaBodrovKrukowski
@IlyaBodrovKrukowski 2 года назад
@@timurkash
@hrth1783
@hrth1783 2 года назад
Я так понимаю продать токены нельзя, потому что "магазину" приходят токены, а он не знает, что с ними делать. Я просто не вижу как магазин получает вызов функции sell. Спасибо за такой проект, мега интересно наблюдать, а делать тем более
@axel-sheen
@axel-sheen 2 года назад
чтобы подключиться к контракту по адресу в hardhat не обязательно импортировать его ABI так грубо из JSON файла. Достаточно написать: `const token = await ethers.getContractAt('TokenName', tokenAddress, signer)`. Смотрите документацию к этому методу в Ethers
@KOCadm
@KOCadm 2 года назад
я чучуть запутался) стр. 134 payable(msg.sender).transfer(_amountToSell);. Откуда на балансе магазина есть ликвидность эфиров? и будет ли ее достаточно что б оплатить за токени которые хто-то продает? может перед этим хто то вывел часть эфиров, тот же собственик магазина одолжил не надолго по каким то причинам)) . Перед стр 134 может надо проверку есть ли достатоно эфиров что б заплатить продавцу токенов? Баланц эфиров есть по умолчанию в контракте магазина, верно?
@IlyaBodrovKrukowski
@IlyaBodrovKrukowski 2 года назад
Это тоже можно сделать, да. Конечно, в идеале владелец должен просто отправить деньги в магазин. Можно для этого сделать функцию. Я просто уже вообще всё показывать не стал, и так стрим растянулся на полтора часа. Но в целом вы правы, конечно, может быть такое, что денег в магазине нет и их может потребоваться перечислить
@KOCadm
@KOCadm 2 года назад
@@IlyaBodrovKrukowski понимаю, все норм! спасибо Вам огромное за Ваш Труд! Баланц эфиров есть по умолчанию в контракте магазина, верно? если я хочу переслать просто ефир на смартконтракт, то по умолчанию баланс уже есть наверное в любом котракте, его создавать не надо как под токени ЕРС20 ?
@IlyaBodrovKrukowski
@IlyaBodrovKrukowski 2 года назад
@@KOCadm нет-нет, там уже есть всё, можно просто сделать функцию для приёма денег и они начислятся. Только для вывода нужно тоже делать, чтобы деньги не застряли там
Далее
Qalpoq - Amakivachcha (hajviy ko'rsatuv)
41:44
Просмотров 119 тыс.
Дикий Бармалей разозлил всех!
01:00
Ядерка-как это будет.
25:55
Просмотров 189 тыс.
ERC1155 | Solidity 0.8
20:17
Просмотров 4,1 тыс.
Qalpoq - Amakivachcha (hajviy ko'rsatuv)
41:44
Просмотров 119 тыс.