<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>The Roccrypto</title>
        <link>https://paragraph.com/@roccrypto</link>
        <description>Author at:
ENG - https://twitter.com/roccrypto_tw
CIS - https://t.me/roccrypto</description>
        <lastBuildDate>Mon, 15 Jun 2026 11:35:44 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>en</language>
        <image>
            <title>The Roccrypto</title>
            <url>https://storage.googleapis.com/papyrus_images/cdc0e59551d79dece73cf0c50750a3a8a4f2ab6aefaab3bbf02ac5420f85ab37.jpg</url>
            <link>https://paragraph.com/@roccrypto</link>
        </image>
        <copyright>All rights reserved</copyright>
        <item>
            <title><![CDATA[web3.py Cheatsheet]]></title>
            <link>https://paragraph.com/@roccrypto/web3-py-cheatsheet</link>
            <guid>SqaUKgNvGac413QQEEjT</guid>
            <pubDate>Fri, 08 Mar 2024 16:13:03 GMT</pubDate>
            <description><![CDATA[Данная статья больше подойдет тем, кто занимается кодингом на Python для своих потребностей в Web3 пространстве. Тут я подробно опишу репозиторий на Github, и расскажу чем он тебе пригодится. https://github.com/Nomzegh/web3py-cheatsheetWeb3 Cheatsheet - твой помощник в написании будущих скриптов для всех существующих EVM сетей.При многократном написании скриптов, вы наверное сталкивались с тем, что практически всегда вы пишете довольно похожий код на свои предыдущие. Согласен, в каждом проект...]]></description>
            <content:encoded><![CDATA[<p><em>Данная статья больше подойдет тем, кто занимается кодингом на Python для своих потребностей в Web3 пространстве. Тут я подробно опишу репозиторий на Github, и расскажу чем он тебе пригодится.</em></p><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/Nomzegh/web3py-cheatsheet">https://github.com/Nomzegh/web3py-cheatsheet</a></p><hr><h3 id="h-web3-cheatsheet-tvoj-pomoshnik-v-napisanii-budushih-skriptov-dlya-vseh-sushestvuyushih-evm-setej" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0"><strong>Web3 Cheatsheet - твой помощник в написании будущих скриптов для всех существующих EVM сетей.</strong></h3><blockquote><p>При многократном написании скриптов, вы наверное сталкивались с тем, что практически всегда вы пишете довольно похожий код на свои предыдущие. Согласен, в каждом проекте контракты и их функции обычно разные, но часть вашей работы над скриптом всегда будет повторяться.</p><p>Проще говоря, вы <strong>создаете большой неповторяемый код</strong> (абуз проекта <code>N</code>) <strong>из маленьких повторяемых фич</strong> (трансферы, аппрувы, чекер балансов, поддержка мультиакков, личный дисперс, прокси, …).</p></blockquote><p><strong>Вот как раз для маленьких повторяемых фич и был создан этот репозиторий.</strong></p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/3db3f1034f438ffcc9be7f9e57f525abbe726aa1de400de0bd38872c02416ec9.png" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><p><code>./payable-utilities</code>: <strong>обычный трансфер, отмена транзакции</strong>, <strong>дисперс нативного токена</strong>, <strong>трансфер фулл баланса с приватников</strong>, <strong>транзакция типа eip1559</strong>, <strong>функции юнисвапа</strong>.</p><p><code>./nonpayable-utilities</code>: <strong>декодинг транзакции</strong>, <strong>высчитывание всех газовых значений</strong>, <strong>генератор кастомных адресов</strong>, <strong>мониторинг пендинг транзакций</strong>, <strong>подпись сообщения</strong>.</p><p><code>./wallets</code>: <strong>использование N к-ва приватных ключей с файла</strong>, <strong>генератор приватников в файл</strong>.</p><hr><blockquote><p><strong>Теперь мы отдельно рассмотрим каждый файл и узнаем где он может пригодиться.</strong></p></blockquote><h2 id="h-payable-utilities-platnye-instrumenty" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Payable Utilities - Платные инструменты</h2><ul><li><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/Nomzegh/web3py-cheatsheet/blob/main/payable-utilities/cancel_transaction.py"><strong>cancel_transaction.py</strong></a> - <strong>отмена зависшей предыдущей транзакции. Возвращает хеш транзакции.</strong></p><p>С помощью этого кода можно отменить pending транзакцию. Зачастую, транзакция “зависает“ в блокчейне из-за слишком малого <code>gasPrice</code>. По сути, код делает обычный пустой трансфер с <code>tx[“value”]: 0</code> самому себе, поставив тот же <code>nonce</code> (порядок транзакции), что и у зависшей транзакции, но с <code>gasPrice</code> уже повыше.<br><br><code>Зачем: был поставлен слишком малый gasPrice, и отправка следующих транзакций - невозможна.</code></p></li></ul><hr><ul><li><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/Nomzegh/web3py-cheatsheet/blob/main/payable-utilities/native_transfer.py"><strong>native_transfer.py</strong></a> - <strong>пересыл нативного токена.</strong></p><p>Возвращает хеш транзакции. Самый обычный трансфер нативного токена от адреса <code>A</code> к адресу <code>B</code>. Тут ничего особенного.<br><br><code>Зачем: это самый базовый трансфер, который пригодится нам везде.</code></p></li></ul><hr><ul><li><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/Nomzegh/web3py-cheatsheet/blob/main/payable-utilities/disperse_native.py"><strong>disperse_native.py</strong></a> <strong>- пересыл нативного токена на адреса с</strong> <code>disperse_addresses.txt</code><strong>. Возвращает хеши каждой транзакции.</strong><br><br>Использует обычный трансфер нативного токена от одного адреса к нескольким. Для работы нужно создать <code>disperse_addresses.txt</code> и поместить туда все адреса на которые нужно разделить токены. Наотмену от <code>native_transfer.py</code>, этот код не ожидает результата транзакции, поэтому заранее отправит все транзакции с nonce повыше. К сожалению, <strong>этот способ дисперса довольно топорный, и для абузов лучше подойдет вывод с биржи, но он будет дороже</strong>.<br><br><code>Зачем: нам нужно вывести деньги на мультиакки для дальнейших транзакций.</code></p></li></ul><hr><ul><li><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/Nomzegh/web3py-cheatsheet/blob/main/payable-utilities/transfer_all_native.py"><strong>transfer_all_native.py</strong></a> - <strong>пересыл полного баланса нативного токена всех приватных ключей из</strong> <code>private_keys.txt</code> <strong>на один адрес.</strong><br><br>Для работы нужно создать <code>private_keys.txt</code> и поместить туда приватные ключи, с которых мы хотим снять фулл баланс. Довольно часто может пригодится в случаях, когда после какого-то абуза остается много приватников с мелким балансом, а выводить вручную супер затратно по времени. <em>(Вот останется на 100 адресах по $0.1-$1 в каком-то BNB, а если вывести полный баланс, то уже +$10-$100, что довольно приятно.)</em><br><br><code>Зачем: остался баланс на “заброшенных” приватниках после очередного абуза</code></p></li></ul><hr><ul><li><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/Nomzegh/web3py-cheatsheet/blob/main/payable-utilities/eip1559_transfer.py"><strong>eip1559_example.py</strong></a> - пример трансфер-транзакции типа eip-1559.<br><br>Чем она отличается от транзакции типа <strong>Legacy</strong>? В Legacy мы устанавливаем комиссию через параметр <code>gasPrice</code>, и чем выше это значение - тем больше шанс что наша транзакция попадет в блок.В <strong>EIP-1559</strong> у нас немного другие параметры: <code>base fee</code> (базовая комса которая сжигается)<code>miner tip</code> - “чаевые, взятка” для майнера. В коде мы вписываем два новых параметра вместо <code>gasPrice</code>: <code>maxPriorityFeePerGas</code> (вызываем через <code>web.eth.max_priority_fee</code>) и <code>maxFeePerGas</code> = <code>base_fee</code> + <code>max_priority_fee</code>. Этот тип транзакции пока самый актуальный, так что лучше использовать его вместо Legacy.<br><br><code>Зачем: большинство DAPP использует именно этот тип транзакций, так что в абузах лучше использовать его, но Legacy транзы никто не отменял.</code></p></li></ul><hr><ul><li><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/Nomzegh/web3py-cheatsheet/blob/main/payable-utilities/eip1559_transfer.py"><strong>uniswap_functions.py</strong></a> - **пример нескольких функций на всем известном Uniswap.<br>**<br>Для начала нужно установить библиотеку <strong>Uniswap</strong> через команду:</p><pre data-type="codeBlock" text="pip install uniswap-python
"><code>pip install uniswap<span class="hljs-operator">-</span>python
</code></pre><p>В файле есть 4 функции - две для того чтобы узнать точные ценовые значения, и две для свапов. Очень удобная библиотека для свапов где нужно минимум кода для работы.<br><br><code>Зачем: мы можем интегрировать свапы/парсинг цен в код, если нужно иметь дело с DEX обменниками.</code></p></li></ul><hr><h2 id="h-non-payable-utilities-besplatnye-instrumenty" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Non-Payable Utilities - Бесплатные Инструменты</h2><ul><li><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/Nomzegh/web3py-cheatsheet/blob/main/nonpayable-utilities/estimate_gas_values.py"><strong>estimate_gas_values.py</strong></a> - пример как высчитывать следующие параметры: <code>gas</code>, <code>gasPrice</code>, <code>baseFee</code>, <code>maxFeePerGas</code>, <code>maxPriorityFeePerGas</code><br><br>Тут ничего сложного, просто функции которые возвращают каждое значение для <strong>Legacy</strong> и <strong>EIP-1559</strong> транзакций. Так же, есть функция для вычисления всегда правильных значений <code>tx[“gas”]</code>, чтобы никогда не столкнуться с ошибкой <code>Out of gas</code>.<br><br><code>Зачем: без этих значений мы просто не сможем отправить ни одну транзакцию</code></p></li></ul><hr><ul><li><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/Nomzegh/web3py-cheatsheet/blob/main/nonpayable-utilities/vanity_generator.py"><strong>vanity_generator.py</strong></a> - генератор адресов с кастомным префиксом.<br><br>Вот хотите вы себе крутой пацанский префикс адреса чтобы вас друзья уважали? Это не проблема. <br><br>Дед инсайд? <code>0xdead</code><br>Элитный криптоюзер? <code>0x1337</code><br>Любитель кофе? <code>0xс0ffee</code><br>Роняешь запад? <code>0xFACE</code><br>…? <code>0xda7baeb</code><br>Или же вы просто хотите блатные номера с 77777 в начале? <code>0x77777</code><br><br>Все это можно сгенерировать с помощью этого кода, который еще и может работать через <code>multiprocessing</code>. Но имейте в виду, что чем длиннее кастом префикс вы хотите - тем дольше вы будете его генерировать. Так же, контроллируйте нагрузку процессора к-вом процессов. <strong>Доступные буквы A-F и цифры 0-9</strong><br><br><code>Зачем: пользы в этом мало, но генерируем, если хотим слегка кастомный адрес.</code></p></li></ul><hr><ul><li><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/Nomzegh/web3py-cheatsheet/blob/main/nonpayable-utilities/sign_message.py"><strong>sign_message.py</strong></a> - генератор подписи с помощью приватного ключа.<br><br>Очень часто бывает, что для логина на сайт проекта, мы подписываем сообщение, и при этом не платим за газ. Так вот, это оно и есть. В большинстве случаев, мы вызываем уникальное сообщение через <code>requests</code>, подписываем его, и полученную сигнатуру вставляем уже в другой запрос.<br><br><code>Зачем: многие проекты используют логин через подпись текстового сообщения. Сигнатуру мы отправляем на их API и получаем access_token для различных действий.</code></p></li></ul><hr><ul><li><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/Nomzegh/web3py-cheatsheet/blob/main/wallets/web3_with_proxy.py"><strong>web3_with_proxy.py</strong></a> - маленький пример использования прокси с web3py. <br><br>Имея прокси в формате <code>http://login:password@ip:port</code>, мы можем создать некий слой соединения с помощью <code>requests.session</code> и начать делать наши транзакции. Можно сразу на месте проверить и работоспособность прокси, и подключились ли вы к web3.<br><br><code>Зачем: мы можем использовать такой метод подключения прокси к веб3, если хотим работать с мультиакками.</code></p></li></ul><hr><ul><li><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/Nomzegh/web3py-cheatsheet/blob/main/nonpayable-utilities/decode_transaction.py"><strong>decode_transaction.py</strong></a> - расшифровка <code>txData</code> любой транзакции.<br><br>Практически всегда критически важно знать что именно нужно вписывать в параметры функции контракта <code>N</code>.<br>Ключевым элементом расшифровки <code>txData</code> и отправки нормальных транзакций, является <code>ABI</code> (интерфейс) целого контракта или одной функции.<br><strong>Как же действовать в следующих ситуациях?<br><br>Контракт проекта полностью верифицирован на скане.</strong><br>В таком случае код не понадобится - вы просто смотрите введенные параметры транзакции сразу на скане, и используем ABI в нужных целях.<br><br><strong>Контракт проекта не верифицирован на скане.</strong><br><em>Тут не стоит расстраиваться, у вас еще есть шанс расшифровать свою транзакцию. Первым делом вбиваем в гугле первые символы (метод айди функции)</em> <em>нашей</em> <code>txData</code> <em>- к примеру</em> <code>0xf340fa01</code><em>. (Так же есть хороший инструмент</em> - <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://openchain.xyz/tools/abi">openchain.xyz</a>)<br><br><strong>Если в поиске видны результаты с этой функцией</strong>, но на сканах других чейнов - просто заходим и копируем <code>ABI</code> <em>этого контракта. Теперь вы можете коллить эту функцию в будущем, либо расшифровать свою транзакцию с помощью</em> <code>decode_transaction.py</code> <em>или через</em> <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://openchain.xyz/tools/abi">openchain.xyz</a>.<br><br><strong>Контракт не верифицирован на скане, а хеш метод не гуглится.</strong><br>Вот тут уже можно грустить, так как теперь шанс найти <code>ABI</code> <em>очень мал. Пробуем найти документацию или репозиторий проекта на</em> <code>Github</code>, <em>и в поиске вбиваем ключевые слова по типу</em> <code>contracts</code>, <code>ABI</code> или банально адрес контракта.<br><br><strong>Если после всех шагов вы не смогли найти</strong> <code>ABI</code>, <em>тогда можете попробовать изменить</em> <code>txData</code> <em>вручную, но тут уже надо быть осторожным, так как даже один лишний/неправильный символ зафейлит вашу транзакцию. Для ручного редактирования</em> <code>txData</code> <em>лучше воспользоваться</em> <code>ChatGPT 4</code>.<br><br><code>Зачем: имея ABI, нам важно знать что вписывалось в транзакцию в tx[“data”].</code></p></li></ul><hr><ul><li><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/Nomzegh/web3py-cheatsheet/blob/main/nonpayable-utilities/pending_tx_monitoring.py"><strong>pending_tx_monitoring.py</strong></a> - мониторинг <code>pending</code> транзакций.<br><br>Бывают редкие случаи, когда нам нужно в какой-то определенный момент отправить транзакцию. Возьмем в пример прошлогодний проект - <strong>Friendtech</strong>. Суть была в том, чтобы как можно быстрее купить акцию популярного инфла. <br><br>Зная адрес этого инфла, мы могли чекать пендинг транзакции, и как только мы увидели транзу с определенной <code>txData</code> от этого адреса - мы сразу же запускаем свою транзакцию на покупку. <br><br>Так же, довольно часто мониторинг мемпула/пендинг транзакций используются в <strong>NFT</strong> <strong>и других сейлах</strong>. И для <strong>самой</strong> <strong>лучшей эффективности</strong> нам нужно поставить <strong>свою ноду</strong> на сервер, так как публичные <code>RPC</code> довольно слабые и там легко поймать рейт лимит.<br><br><code>Зачем: используется если важен момент и скорость отправки транзакции</code></p></li></ul><hr><h2 id="h-wallets-koshelki" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Wallets - кошельки</h2><ul><li><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/Nomzegh/web3py-cheatsheet/blob/main/wallets/multiple_keys_usage.py"><strong>multiple_keys_usage.py</strong></a> - небольшой пример использования нескольких приватных ключей с/без прокси.<br><br>Для работы мы должны создать файлы <code>private_keys.txt</code> и <code>proxies.txt</code> (формат прокси следующий: <strong>login:password@ip:port</strong>). В случае, если вы хотите быстро спамить транзакциями с кучи кошельков - хорошим решением будет прикрутить <code>asyncio</code>, но об этом в другой раз.<br><br><code>Зачем: нам нужно знать как использовать мультиакки для транзакций.</code></p></li></ul><hr><ul><li><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/Nomzegh/web3py-cheatsheet/blob/main/wallets/simple_generator.py"><strong>simple_generator.py</strong></a> - самый обычный генератор новых кошельков.Запустив код, нам нужно указать количество желаемых кошельков, и в результате получим приватники и адреса, записанные в <code>private_keys.txt</code> и <code>public_keys.txt</code> соответственно.<br><br><code>Зачем: нам нужно создать N количество кошельков для дальнейших использований.</code></p></li></ul><hr><h3 id="h-etot-repozitorij-poluchilsya-dovolno-nebolshim-tak-chto-vseh-koderov-zhelayushih-pomoch-poproshu-otkryvat-pull-rekvesty-s-novym-kodom-chtoby-pokryt-kak-mozhno-bolshe-razlichnyh-fich-kotorymi-smogut-polzovatsya-vse-komu-eto-nuzhno-dazhe-sami-kodery" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">Этот репозиторий получился довольно небольшим, так что всех кодеров желающих помочь, попрошу открывать пулл реквесты с новым кодом, чтобы покрыть как можно больше различных фич, которыми смогут пользоваться все кому это нужно (даже сами кодеры).</h3><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://t.me/roccrypto">https://t.me/roccrypto</a></p>]]></content:encoded>
            <author>roccrypto@newsletter.paragraph.com (The Roccrypto)</author>
            <enclosure url="https://storage.googleapis.com/papyrus_images/aa0066cfd10d9823298ad704b9a3e6d63470a0f70a9256fc0855959c1ddd196d.jpg" length="0" type="image/jpg"/>
        </item>
        <item>
            <title><![CDATA[Step-by-step guide of deploying contracts on: zkSync Era, Base, Scroll]]></title>
            <link>https://paragraph.com/@roccrypto/step-by-step-guide-of-deploying-contracts-on-zksync-era-base-scroll</link>
            <guid>t6cBo0cgO1TlkZHDOe7H</guid>
            <pubDate>Thu, 22 Jun 2023 16:43:11 GMT</pubDate>
            <description><![CDATA[In this article, you will find 3 guides of deploying contracts on zkSync Era, Base, and Scroll.Let’s get started!zkSync EraDeploy price: ~5$ in ETH Deploy difficulty: Classic method (code) - difficult. Thirdweb method - easy.Classic method:Download Visual Studio Code from the official website: https://code.visualstudio.com/Choose English language and leave the checkboxes in their default state.After the installation, create a folder on your desktop named zksyncLaunch VSCode and open this fold...]]></description>
            <content:encoded><![CDATA[<h3 id="h-in-this-article-you-will-find-3-guides-of-deploying-contracts-on-zksync-era-base-and-scroll" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">In this article, you will find 3 guides of deploying contracts on zkSync Era, Base, and Scroll.</h3><p><strong>Let’s get started!</strong></p><hr><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/17459cc1b90fe03fe95b002b288ca917e4242f8705d5031600eaaa6cd3071ce1.png" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><h2 id="h-zksync-era" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">zkSync Era</h2><p><strong>Deploy price:</strong> ~5$ in ETH <strong>Deploy difficulty:</strong> Classic method (code) - difficult. Thirdweb method - easy.</p><h3 id="h-classic-method" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">Classic method:</h3><ul><li><p>Download <strong>Visual Studio Code</strong> from the official website: <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://code.visualstudio.com/">https://code.visualstudio.com/</a></p></li><li><p>Choose <strong>English language</strong> and leave the checkboxes in their default state.</p></li><li><p>After the installation, create a <strong>folder</strong> on your desktop named <code>zksync</code></p></li></ul><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/c185e3324c5324bd7ca2c3c4ab63d3ef4f7810e49bf4edb98d20083f0ee737dc.png" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><ul><li><p>Launch <strong>VSCode</strong> and open this folder</p></li></ul><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/ff12edaf1f6f6f2c4c0564498d60bfe6c7dadfa719a80760dba0858786565349.png" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><ul><li><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://nodejs.org/dist/v18.16.0/node-v18.16.0-x64.msi">Download</a> &amp; install Node.js from its official website. During the installation, leave the settings unchanged. <strong>Afterwards, restart your PC.</strong></p></li><li><p>Go back to <strong>VSCode</strong>, press <strong>CTRL + J</strong> to open the terminal.</p></li><li><p>Insert the following command into the terminal:</p></li></ul><pre data-type="codeBlock" text="npm init -y
"><code>npm <span class="hljs-keyword">init</span> -y
</code></pre><ul><li><p>If you have such output, then everything is fine:</p></li></ul><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/b7ae8f55f0c2fe7ca0266fc31b568a115679a68b7088423c95ef928ec1428c2d.png" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><ul><li><p>Insert the following command and wait till the installation finishes</p></li></ul><pre data-type="codeBlock" text="npm add -D typescript ts-node @types/node ethers@^5.7.2 zksync-web3@^0.14.3 @ethersproject/hash @ethersproject/web hardhat @matterlabs/hardhat-zksync-solc @matterlabs/hardhat-zksync-deploy
"><code>npm add <span class="hljs-operator">-</span>D typescript ts<span class="hljs-operator">-</span>node @types<span class="hljs-operator">/</span>node ethers@<span class="hljs-operator">^</span><span class="hljs-number">5.7</span><span class="hljs-number">.2</span> zksync<span class="hljs-operator">-</span>web3@<span class="hljs-operator">^</span><span class="hljs-number">0</span><span class="hljs-number">.14</span><span class="hljs-number">.3</span> @ethersproject<span class="hljs-operator">/</span>hash @ethersproject<span class="hljs-operator">/</span>web hardhat @matterlabs<span class="hljs-operator">/</span>hardhat<span class="hljs-operator">-</span>zksync<span class="hljs-operator">-</span>solc @matterlabs<span class="hljs-operator">/</span>hardhat<span class="hljs-operator">-</span>zksync<span class="hljs-operator">-</span>deploy
</code></pre><ul><li><p>Insert the following command which will install the <strong>OpenZeppelin</strong> <strong>contract</strong> <strong>library</strong>:</p></li></ul><pre data-type="codeBlock" text="npm install @openzeppelin/contracts
"><code>npm install @openzeppelin/contracts
</code></pre><ul><li><p>Press “<strong>+”</strong> and create the file <code>hardhat.config.ts</code></p></li></ul><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/7031dd294d656401d99361abf38a1f36f5aeb409f1cb3460ca1cb7b10241684e.png" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><ul><li><p>Insert the following code in <code>hardhat.config.ts</code> and press <strong>CTRL + S</strong> to save the file:</p></li></ul><pre data-type="codeBlock" text="import &quot;@matterlabs/hardhat-zksync-deploy&quot;;
import &quot;@matterlabs/hardhat-zksync-solc&quot;;

module.exports = {
  zksolc: {
    version: &quot;1.3.5&quot;,
    compilerSource: &quot;binary&quot;,
    settings: {},
  },
  defaultNetwork: &quot;zkSyncMainnet&quot;,

  networks: {
    zkSyncMainnet: {
      url: &quot;https://zksync2-mainnet.zksync.io&quot;,
      ethNetwork: &quot;mainnet&quot;,
      zksync: true,
    },
  },
  solidity: {
    version: &quot;0.8.17&quot;,
  },
};
"><code>import "<span class="hljs-keyword">@matterlabs</span>/hardhat-zksync-deploy";
import "<span class="hljs-keyword">@matterlabs</span>/hardhat-zksync-solc";

module<span class="hljs-selector-class">.exports</span> = {
  zksolc: {
    version: <span class="hljs-string">"1.3.5"</span>,
    compilerSource: <span class="hljs-string">"binary"</span>,
    settings: {},
  },
  defaultNetwork: <span class="hljs-string">"zkSyncMainnet"</span>,

  networks: {
    zkSyncMainnet: {
      url: <span class="hljs-string">"https://zksync2-mainnet.zksync.io"</span>,
      ethNetwork: <span class="hljs-string">"mainnet"</span>,
      zksync: true,
    },
  },
  solidity: {
    version: <span class="hljs-string">"0.8.17"</span>,
  },
};
</code></pre><ul><li><p>Press on another <strong>“+”</strong> and create the <code>contracts</code> folder. Press on this folder and create the <code>contract.sol</code> file in it. Any parameters (those in “ “ quotes) you can customize according to your needs (full token name &amp; ticker). Insert the following code:</p></li></ul><pre data-type="codeBlock" text="// SPDX-License-Identifier: MIT
pragma solidity ^0.8.9;

import &quot;@openzeppelin/contracts/token/ERC20/ERC20.sol&quot;;
import &quot;@openzeppelin/contracts/access/Ownable.sol&quot;;

contract Roccrypto is ERC20, Ownable {
    constructor() ERC20(&quot;roccrypto&quot;, &quot;rocc&quot;) {
        _mint(msg.sender, 100 * 10 ** decimals());
    }

    function mint(address to, uint256 amount) public onlyOwner {
        _mint(to, amount);
    }
}
"><code><span class="hljs-comment">// SPDX-License-Identifier: MIT</span>
<span class="hljs-meta"><span class="hljs-keyword">pragma</span> <span class="hljs-keyword">solidity</span> ^0.8.9;</span>

<span class="hljs-keyword">import</span> <span class="hljs-string">"@openzeppelin/contracts/token/ERC20/ERC20.sol"</span>;
<span class="hljs-keyword">import</span> <span class="hljs-string">"@openzeppelin/contracts/access/Ownable.sol"</span>;

<span class="hljs-class"><span class="hljs-keyword">contract</span> <span class="hljs-title">Roccrypto</span> <span class="hljs-keyword">is</span> <span class="hljs-title">ERC20</span>, <span class="hljs-title">Ownable</span> </span>{
    <span class="hljs-function"><span class="hljs-keyword">constructor</span>(<span class="hljs-params"></span>) <span class="hljs-title">ERC20</span>(<span class="hljs-params"><span class="hljs-string">"roccrypto"</span>, <span class="hljs-string">"rocc"</span></span>) </span>{
        _mint(<span class="hljs-built_in">msg</span>.<span class="hljs-built_in">sender</span>, <span class="hljs-number">100</span> <span class="hljs-operator">*</span> <span class="hljs-number">10</span> <span class="hljs-operator">*</span><span class="hljs-operator">*</span> decimals());
    }

    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">mint</span>(<span class="hljs-params"><span class="hljs-keyword">address</span> to, <span class="hljs-keyword">uint256</span> amount</span>) <span class="hljs-title"><span class="hljs-keyword">public</span></span> <span class="hljs-title">onlyOwner</span> </span>{
        _mint(to, amount);
    }
}
</code></pre><ul><li><p>Press <strong>CTRL + S</strong> to save your file</p><p>Here we create a simple <strong>ERC-20</strong> Token with the ticker <code>rocc</code>. Any other contracts can be used from <strong>OpenZeppelin</strong> documentation. However, in order to deploy them, we have to understand <strong>JavaScript/TypeScript</strong> programming languages. If you want to deploy some other contracts which are not mentioned in this guide, and you don’t know any of this programming languages - use <strong>ChatGPT</strong>. It will easily write the <code>deploy.ts</code> script for the contract you want to deploy.</p><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://docs.openzeppelin.com/">https://docs.openzeppelin.com/</a></p></li><li><p>Compile the contract by inserting the following command:</p></li></ul><pre data-type="codeBlock" text="npx hardhat compile
"><code>npx hardhat <span class="hljs-built_in">compile</span>
</code></pre><ul><li><p>If you have such output, then everything is fine:</p></li></ul><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/d94398a710acc732250cfdf23e3a4443b7b32b2eb940c9fd62167de27e817360.png" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><ul><li><p>Open the <code>zksync</code> folder and create a new folder named <code>deploy</code>. In that file we must create the typescript file <code>deploy.ts</code>. Insert the following code and change the <code>0x123…</code> addreess, to which the tokens will be minted. Press CTRL + S:</p></li></ul><pre data-type="codeBlock" text="import fs from &quot;fs&quot;;
import { utils, Wallet } from &quot;zksync-web3&quot;;
import * as ethers from &quot;ethers&quot;;
import { HardhatRuntimeEnvironment } from &quot;hardhat/types&quot;;
import { Deployer } from &quot;@matterlabs/hardhat-zksync-deploy&quot;;

const PRIV_KEY = fs.readFileSync(&quot;.secret&quot;).toString();

export default async function (hre: HardhatRuntimeEnvironment) {
  console.log(`Running deploy script for the Roccrypto contract`);

  const wallet = new Wallet(PRIV_KEY);

  const deployer = new Deployer(hre, wallet);
  const artifact = await deployer.loadArtifact(&quot;Roccrypto&quot;);

  const roccryptoContract = await deployer.deploy(artifact, []);
  console.log(&quot;constructor args:&quot; + roccryptoContract.interface.encodeDeploy([]));

  const contractAddress = roccryptoContract.address;
  console.log(`${artifact.contractName} was deployed to ${contractAddress}`);

  // Mint some tokens to an address.
  const to = &quot;0x123...&quot;; // Адрес куда минтить токены.
  const amount = ethers.utils.parseEther(&quot;10&quot;); // Сколько токенов нужно заминтить на этот адрес
  const mintHandle = await roccryptoContract.mint(to, amount);
  await mintHandle.wait();

  console.log(`Minted ${amount} tokens to ${to}`);
}
"><code><span class="hljs-keyword">import</span> fs <span class="hljs-keyword">from</span> <span class="hljs-string">"fs"</span>;
<span class="hljs-keyword">import</span> { utils, <span class="hljs-title class_">Wallet</span> } <span class="hljs-keyword">from</span> <span class="hljs-string">"zksync-web3"</span>;
<span class="hljs-keyword">import</span> * <span class="hljs-keyword">as</span> ethers <span class="hljs-keyword">from</span> <span class="hljs-string">"ethers"</span>;
<span class="hljs-keyword">import</span> { <span class="hljs-title class_">HardhatRuntimeEnvironment</span> } <span class="hljs-keyword">from</span> <span class="hljs-string">"hardhat/types"</span>;
<span class="hljs-keyword">import</span> { <span class="hljs-title class_">Deployer</span> } <span class="hljs-keyword">from</span> <span class="hljs-string">"@matterlabs/hardhat-zksync-deploy"</span>;

<span class="hljs-keyword">const</span> <span class="hljs-variable constant_">PRIV_KEY</span> = fs.<span class="hljs-title function_">readFileSync</span>(<span class="hljs-string">".secret"</span>).<span class="hljs-title function_">toString</span>();

<span class="hljs-keyword">export</span> <span class="hljs-keyword">default</span> <span class="hljs-keyword">async</span> <span class="hljs-keyword">function</span> (<span class="hljs-params">hre: HardhatRuntimeEnvironment</span>) {
  <span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(<span class="hljs-string">`Running deploy script for the Roccrypto contract`</span>);

  <span class="hljs-keyword">const</span> wallet = <span class="hljs-keyword">new</span> <span class="hljs-title class_">Wallet</span>(<span class="hljs-variable constant_">PRIV_KEY</span>);

  <span class="hljs-keyword">const</span> deployer = <span class="hljs-keyword">new</span> <span class="hljs-title class_">Deployer</span>(hre, wallet);
  <span class="hljs-keyword">const</span> artifact = <span class="hljs-keyword">await</span> deployer.<span class="hljs-title function_">loadArtifact</span>(<span class="hljs-string">"Roccrypto"</span>);

  <span class="hljs-keyword">const</span> roccryptoContract = <span class="hljs-keyword">await</span> deployer.<span class="hljs-title function_">deploy</span>(artifact, []);
  <span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(<span class="hljs-string">"constructor args:"</span> + roccryptoContract.<span class="hljs-property">interface</span>.<span class="hljs-title function_">encodeDeploy</span>([]));

  <span class="hljs-keyword">const</span> contractAddress = roccryptoContract.<span class="hljs-property">address</span>;
  <span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(<span class="hljs-string">`<span class="hljs-subst">${artifact.contractName}</span> was deployed to <span class="hljs-subst">${contractAddress}</span>`</span>);

  <span class="hljs-comment">// Mint some tokens to an address.</span>
  <span class="hljs-keyword">const</span> to = <span class="hljs-string">"0x123..."</span>; <span class="hljs-comment">// Адрес куда минтить токены.</span>
  <span class="hljs-keyword">const</span> amount = ethers.<span class="hljs-property">utils</span>.<span class="hljs-title function_">parseEther</span>(<span class="hljs-string">"10"</span>); <span class="hljs-comment">// Сколько токенов нужно заминтить на этот адрес</span>
  <span class="hljs-keyword">const</span> mintHandle = <span class="hljs-keyword">await</span> roccryptoContract.<span class="hljs-title function_">mint</span>(to, amount);
  <span class="hljs-keyword">await</span> mintHandle.<span class="hljs-title function_">wait</span>();

  <span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(<span class="hljs-string">`Minted <span class="hljs-subst">${amount}</span> tokens to <span class="hljs-subst">${to}</span>`</span>);
}
</code></pre><ul><li><p>Create a file named <code>.secret</code> in general <code>zksync</code> folder. We have to insert a <strong>private</strong> <strong>key</strong> from which the contract will be deployed. Keep in mind, that your address has to have a balance of ~5$ in ETH in zkSync Era mainnet. <strong>It is highly not recommended to hold a signifficant balance if you are unsure about your next actions. Please test first and then deploy on multiple accounts. I am not responsible for your funds.</strong></p></li><li><p>Finally, deploy the contract with the command:</p></li></ul><pre data-type="codeBlock" text="npx hardhat deploy-zksync
"><code>npx hardhat deploy<span class="hljs-operator">-</span>zksync
</code></pre><p>We’ve successfully deployed our contract and minted some rocc tokens to our address.</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/8279cfe18dd519c2b45a6c41c662ca3c88155ef666d83f5b805cae17159423c0.png" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><h3 id="h-thirdweb-method" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">Thirdweb method:</h3><p>You can also deploy zkSync smart contracts by using <strong>Thirdweb</strong>. If you simply don’t like the classic method - you better use this one.</p><ul><li><p>Go to <strong>Thirdweb</strong> website and find the contract we need - <code>Token</code></p></li></ul><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://thirdweb.com/explore">https://thirdweb.com/explore</a></p><ul><li><p>Press <code>Deploy now</code></p></li></ul><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/373ebf44b17db02bd65da4daca6bbea6a2af3d5ed63e7d95a9594123edd8b418.png" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><ul><li><p>Fill in the details of our token and make sure to select <code>zkSync Era Mainnet</code>.</p></li><li><p>Press <code>Deploy Now</code> and sign the transaction.</p></li></ul><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/0e25ffaec10619350d74607b0809502cecac2d6aa6de6be87f81a8d52d01af20.png" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><ul><li><p><strong>That’s it, we’ve successfully deployed our contract:</strong></p></li></ul><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/1354636442b4169c41e64aac0e4788921f091b3d8369a6c20e3fdda13d4d975a.png" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><hr><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/73af106100b2806d2f455981c27b125190195a2b075e256f35a5c8473407fbe4.png" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><h2 id="h-base" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Base</h2><p><strong>Deploy price:</strong> FREE (Goerli ETH) <strong>Bridge:</strong> <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="http://bridge.base.org/deposit">bridge.base.org/deposit</a> <strong>Deploy difficulty:</strong> Easy</p><p>To begin with, use the bridge to obtain ETH to your wallet.</p><ul><li><p>Go to <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://chainlist.org/">Chainlist</a>, find <code>Base Goerli Testnet</code>, and connect your wallet to it. Make sure you switched the network afterwards.</p></li></ul><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/832c42a65839e65ee44340cf5928e6c4f56fb329ead658ed197168260e79bac6.png" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><ul><li><p>Go to <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://docs.openzeppelin.com/contracts/4.x/wizard">OpenZeppelin Contracts Wizard</a>.</p></li><li><p>Choose <code>ERC-20</code> token and fill in the parameters according to your preferences. Check the boxes for <code>Mintable</code> and <code>Burnable</code></p></li></ul><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/432535c754f3635d7a7feadf43bd3ab02708d929c44e8de7a191310755333e9f.png" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><ul><li><p>Press <code>Open in Remix</code></p></li><li><p>Check the box for <code>Auto compile</code></p></li></ul><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/88dd7851434c788e7c8b6ac57179d2a5a1a7aa373f543a726c22606f15e887eb.png" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><ul><li><p>Choose <code>Injected Provider - Metamask</code> and connect the wallet to the website.</p></li></ul><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/4e22ed28296fabef4eb4ddf3aec1c7b7a334c188112059dd32d9574a9dd427d9.png" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><ul><li><p>Press the <code>Deploy</code> button and confirm the transaction in Metamask</p></li></ul><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/c5794b5e4de8ba79e23183ec545c420ecc171ce0ff615e801716a05f335131db.png" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><p><strong>Now we have successfully deployed the contract on Base! However, to avoid repeating the same contracts every time, I suggest experimenting and deploying different ones.</strong></p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/4f4dc1dee15e1f9f22873ea87b660cd947ccc4c03e4fe7470a1898842703ab7f.png" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><hr><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/2b87d11214d0cd0342d09c3b27523ca7553ea864d39bbc7b9f91a026d68e3a07.png" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><h2 id="h-scroll" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Scroll</h2><p><strong>Deploy price:</strong> FREE (Goerli ETH) <strong>Bridge:</strong> <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="http://scroll.io/bridge">scroll.io/bridge</a> <strong>Deploy difficulty:</strong> Easy</p><p>To begin with, use the bridge to obtain ETH to your wallet.</p><ul><li><p>Go to <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://chainlist.org/"><strong>Chainlist</strong></a>, find <code>Scroll Alpha Testnet</code> and connect your wallet to it. Make sure you switched the network afterwards.</p></li></ul><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/552828953e2663d8ba96ffbe620ee47d2bf215e7759ca69c24f53039aa69e7a2.png" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><ul><li><p>Go to <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://docs.openzeppelin.com/contracts/4.x/wizard">OpenZeppelin Contracts Wizard</a>.</p></li><li><p>Choose <code>ERC-20</code> token and fill in the parameters according to your preferences. Check the boxes for <code>Mintable</code> and <code>Burnable</code></p></li></ul><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/432535c754f3635d7a7feadf43bd3ab02708d929c44e8de7a191310755333e9f.png" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><ul><li><p>Press <code>Open in Remix</code></p></li><li><p>Check the box for <code>Auto compile</code></p></li></ul><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/88dd7851434c788e7c8b6ac57179d2a5a1a7aa373f543a726c22606f15e887eb.png" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><ul><li><p>Choose <code>Injected Provider - Metamask</code> and connect the wallet to the website.</p></li></ul><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/4e22ed28296fabef4eb4ddf3aec1c7b7a334c188112059dd32d9574a9dd427d9.png" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><ul><li><p>Press the <code>Deploy</code> button and confirm the transaction in <strong>Metamask</strong></p></li></ul><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/c5794b5e4de8ba79e23183ec545c420ecc171ce0ff615e801716a05f335131db.png" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><p><strong>Congratulations! We have successfully deployed our final contract!</strong></p><h3 id="h-if-this-guide-was-useful-share-it-and-follow-my-channels-for-more" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">If this guide was useful, share it and follow my channels for more:</h3><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://twitter.com/roccrypto_tw">https://twitter.com/roccrypto_tw</a></p><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://t.me/roccrypto">https://t.me/roccrypto</a></p>]]></content:encoded>
            <author>roccrypto@newsletter.paragraph.com (The Roccrypto)</author>
            <enclosure url="https://storage.googleapis.com/papyrus_images/ee8a2d01e9e9503207f21713dde12999899a0e21ae1ce924f430d6b48684da76.jpg" length="0" type="image/jpg"/>
        </item>
        <item>
            <title><![CDATA[Продолжаем гонять бич-транзакции]]></title>
            <link>https://paragraph.com/@roccrypto/hTYPqrTckqu4yPZDwpWA</link>
            <guid>hTYPqrTckqu4yPZDwpWA</guid>
            <pubDate>Sun, 18 Jun 2023 14:49:05 GMT</pubDate>
            <description><![CDATA[На этот раз у нас zkSync Era Mainnet. Пост является неким продолжением прошлой статьи о деплое контрактов.Схема работы всего этого довольно проста: • Деплоим свой контракт, который работает в качестве ячейки хранения для баланса. Состоит он из трех функций: Deposit, Withdraw и getBalance.• Взаимодействуем с этим контрактом, отсылая ETH на адрес, вызывая функцию Deposit. • Когда мы прогнали нужное количество транзакций и объем Эфира, вызываем функцию Withdraw, забирая свой баланс обратно на ко...]]></description>
            <content:encoded><![CDATA[<h3 id="h-na-etot-raz-u-nas-zksync-era-mainnet-post-yavlyaetsya-nekim-prodolzheniem-proshloj-stati-o-deploe-kontraktov" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">На этот раз у нас zkSync Era Mainnet. Пост является неким продолжением прошлой статьи о деплое контрактов.</h3><p><strong>Схема работы всего этого довольно проста:</strong> • Деплоим свой контракт, который работает в качестве ячейки хранения для баланса. Состоит он из трех функций: <code>Deposit</code>, <code>Withdraw</code> и <code>getBalance</code>.• Взаимодействуем с этим контрактом, отсылая ETH на адрес, вызывая функцию <code>Deposit</code>. • Когда мы прогнали нужное количество транзакций и объем Эфира, вызываем функцию <code>Withdraw</code>, забирая свой баланс обратно на кошелек.</p><p><strong>Стратегии:</strong></p><ol><li><p>Фарм количества транзакций</p></li><li><p>Прогон объема в ETH (<strong>Transaction Value</strong>, как было в <strong>Arbitrum</strong>)</p></li><li><p>Обычный прогрев кошелька на дистанции, балансируя и количество транзакций и разумный объем.</p></li></ol><p><strong>Цена одной транзакции: ~0.10$ - 0.15$ в ETH</strong></p><p>Разбавляя активность кошельков деплоями своих контрактов, и взаимодействий с ними, мы показываем, что мы некие &quot;билдеры&quot; и хотим сделать свой вклад в развитие сети.</p><p>Уверяю, кастомные контракты - это тема, которую многие недооценивают. Даже самый дебильный, но личный, контракт будет лучше любой очередной транзакции на юзлессной dapp&apos;ке.</p><p><strong>Скрипт</strong></p><p><strong>Без скрипта я вас снова не оставил.</strong> Далее вы найдете пошаговый гайд + <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/Nomzegh/zkSyncTXs">репозиторий с Github</a>, где есть весь опенсорс код скрипта. С ним можно работать на нескольких кошельках, а время между депозитами и количество ETH - рандомное.</p><p><strong>Контракт</strong></p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/5d16f3b64eb821f04a19ec8e9e7ed136e1af0d1c3a08f05a8284889727196b19.png" alt="функции контракта" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="">функции контракта</figcaption></figure><p><strong>В гайде мы будем использовать контракт, который задеплоил я. Сильно настаиваю на том, чтобы вы задеплоили свой, а не использовали мой, так как это свяжет ваши кошельки с другими.</strong> Если вы полный ноль в деплое - сначала <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://mirror.xyz/roccrypto.eth/5nOtVRCnkiwerztfcnFI7h0IHfjEDK111KE9eawTen4">прочитайте прошлую статью</a>. После - прочитайте эту статью до конца, и в конце будет код точно такого же контракта. Но если вы не переживаете за связь кошельков, то пожалуйста:</p><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://explorer.zksync.io/address/0x7442E417C0B53d622d93F5D7BbD84eEd808F26C5#contract">0x7442E417C0B53d622d93F5D7BbD84eEd808F26C5</a>. <strong>Я его верифицировал на zkSync скане, так что код полностью открыт.</strong></p><p><strong>Как было упомянуто раньше, в нем всего 3 простых функции:</strong></p><ul><li><p><strong>Deposit</strong> - депозит ETH на контракт</p></li><li><p><strong>Withdraw</strong> - вывод ETH с контракта</p></li><li><p><strong>getBalance</strong> - проверка баланса, безгазовая функция</p></li></ul><hr><h2 id="h-depozit" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Депозит</h2><p>Чтобы задепозитить вручную, <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://explorer.zksync.io/address/0x7442E417C0B53d622d93F5D7BbD84eEd808F26C5#contract">заходим на контракт</a>, нажимаем на <code>Write</code> и подключаем кошелек кнопкой <code>Connect MetaMask</code>. Далее, <code>deposit</code> и вписуем к-во ETH, например 0.00001.</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/49d9963d268c24b18b321ba9c49e027e91a167c24365a06aac5668a0581e6830.png" alt="компенсация газа" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="">компенсация газа</figcaption></figure><p>В окне транзакции от <strong>Metamask</strong>, мы должны вручную поменять лимит газа, установив его на <strong>500000</strong>. В результате вам покажет цену около 0.20$, но на деле заплатите вы меньше (0.1$-0.15$), так как газ, который не был использован сетью, вернется через <strong>Gas Refund (компенсация газа)</strong>. Подтверждаем транзакцию и мы успешно задепозитили ETH на контракт.</p><h2 id="h-vyvod" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Вывод</h2><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/de4f7740647ef92ed581f9535b948d1294fee2d5bcc4d989a1ddce5685bdaf89.png" alt="eth converter" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="">eth converter</figcaption></figure><p>Чтобы вывести, мы так же заходим в раздел <code>Write</code>. После нажатия на <code>withdraw</code>, мы вписываем в поле количество <strong>ETH</strong>, которое хотим вывести. <strong>Но функция withdraw принимает значения ETH только в Wei,</strong> так что <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://eth-converter.com/">заходим на сайт</a> и конвертируем <strong>Ether</strong> в <strong>Wei</strong>. Подтверждаем транзакцию на кнопку <code>write</code>, и мы успешно вывели свои деньги с контракта!</p><h2 id="h-skript" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Скрипт</h2><p>Если вы не хотите все это делать вручную, я подготовил для этого скрипт. **Внимание! Я не отвечаю за ваши средства, так что все действия вы делаете на свой страх и риск. И мой контракт, и следующий код - opensouce, вы можете сами их проверить, если желаете. ** <strong>Репозиторий:</strong></p><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/Nomzegh/zkSyncTXs">https://github.com/Nomzegh/zkSyncTXs</a></p><hr><p><strong>Конфиг</strong></p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/763e5f8c2f7d4588820099f347a85d4e5d3e008f9ffeeb802316625ad0047e1e.png" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><p>Чтобы нормально начать работать со скриптом, вам нужно выставить значения в конфиге под себя:</p><ul><li><p><code>from_sec</code> : минимальное значение в секундах, от которого код будет ждать между транзакциями</p></li><li><p><code>to_sec</code> : максимальное значение в секундах, до которого код будет ждать между транзакциями</p></li><li><p><code>eth_min</code> : Минимальное значение в ETH, от которого скрипт будет рандомить число ETH для депозита</p></li><li><p><code>eth_max</code> : Максимальное значение в ETH, до которого скрипт будет рандомить число ETH для депозита</p></li><li><p><code>contract_address</code> : Всегда 0x7442E417C0B53d622d93F5D7BbD84eEd808F26C5, либо заменить на свой контракт</p></li><li><p><code>RPC</code> : Всегда <code>https://mainnet.era.zksync.io</code>, либо заменить на свою RPC</p></li></ul><hr><p><strong>Приватные ключи</strong></p><p>Чтобы работал скрипт, нужно вставить приватные ключи аккаунтов, с которыми хотите работать в скрипте.Для этого нужно создать файл <code>keys.txt</code>, который должен находиться возле двух других файлов, необходимых для работы скрипта (<code>cheap_zk.py</code> и <code>abi.py</code>).</p><hr><p><strong>Запуск</strong></p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/5dbcfa1253e59a4d0d877261b8c1bc65cb2c25d2ec4b46298690d63b7b02d8f5.png" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><p><strong>После запуска нам нужно выбрать одну из опций - вписать цифру:</strong></p><p><code>1</code> : <strong>Депозит</strong>. При выборе <code>Deposit</code>, скрипт выберет рандомное значение ETH, которое он задепозитит, исходя из минимальных/максимальных значений в конфиге. <code>2</code> : <strong>Вывод</strong>. При выборе <code>Withdraw</code>, скрипт проверит ваш баланс на контракте, и выведет полную сумму ETH обратно на ваш кошелек. <code>3</code> : <strong>Проверка баланса</strong>. При выборе <code>Check Balance</code>, скрипт проверит ваш баланс на контракте, но выводить его не будет.</p><hr><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/4d5cd52998346b57e7ea8b7153e0c60f84c984edc7e1ad5dfbad9e35354c4545.png" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><h2 id="h-deploj-svoego-kontrakta" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Деплой своего контракта</h2><p><strong>Если вы не хотите пользоваться моим контрактом, вы можете задеплоить личный.</strong></p><p>Эта часть статьи для более продвинутых пользователей, так что если вы пропустили мою прошлую статью о том, как деплоить контракты на zkSyncEra Mainnet, <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://mirror.xyz/roccrypto.eth/5nOtVRCnkiwerztfcnFI7h0IHfjEDK111KE9eawTen4">советую её прочитать</a>, так как не будете понимать следующее.</p><ul><li><p>В hardhat.config.ts , до всего того, что мы вписывали ранее, вписываем импорт:</p></li></ul><pre data-type="codeBlock" text="import &quot;@matterlabs/hardhat-zksync-verify&quot;;
"><code><span class="hljs-keyword">import</span> <span class="hljs-string">"@matterlabs/hardhat-zksync-verify"</span>;
</code></pre><ul><li><p>Заходим в папку <code>contracts</code> и редактируем файл <code>contract.sol</code>:</p></li></ul><pre data-type="codeBlock" text="// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract EtherDeposit {
    mapping(address =&gt; uint256) private balances;

    event Deposit(address indexed account, uint256 amount);
    event Withdrawal(address indexed account, uint256 amount);

    function deposit() external payable {
        require(msg.value &gt; 0, &quot;Invalid deposit amount&quot;);

        balances[msg.sender] += msg.value;
        emit Deposit(msg.sender, msg.value);
    }

    function withdraw(uint256 amount) external {
        require(amount &gt; 0, &quot;Invalid withdrawal amount&quot;);
        require(balances[msg.sender] &gt;= amount, &quot;Insufficient balance&quot;);

        balances[msg.sender] -= amount;

        (bool success, ) = payable(msg.sender).call{value: amount}(&quot;&quot;);
        if (!success) {
            revert(&quot;Withdrawal failed&quot;);
        }

        emit Withdrawal(msg.sender, amount);
    }

    function getBalance() public view returns (uint256) {
        return balances[msg.sender];
    }
}
"><code><span class="hljs-comment">// SPDX-License-Identifier: MIT</span>
<span class="hljs-meta"><span class="hljs-keyword">pragma</span> <span class="hljs-keyword">solidity</span> ^0.8.0;</span>

<span class="hljs-class"><span class="hljs-keyword">contract</span> <span class="hljs-title">EtherDeposit</span> </span>{
    <span class="hljs-keyword">mapping</span>(<span class="hljs-keyword">address</span> <span class="hljs-operator">=</span><span class="hljs-operator">></span> <span class="hljs-keyword">uint256</span>) <span class="hljs-keyword">private</span> balances;

    <span class="hljs-function"><span class="hljs-keyword">event</span> <span class="hljs-title">Deposit</span>(<span class="hljs-params"><span class="hljs-keyword">address</span> <span class="hljs-keyword">indexed</span> account, <span class="hljs-keyword">uint256</span> amount</span>)</span>;
    <span class="hljs-function"><span class="hljs-keyword">event</span> <span class="hljs-title">Withdrawal</span>(<span class="hljs-params"><span class="hljs-keyword">address</span> <span class="hljs-keyword">indexed</span> account, <span class="hljs-keyword">uint256</span> amount</span>)</span>;

    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">deposit</span>(<span class="hljs-params"></span>) <span class="hljs-title"><span class="hljs-keyword">external</span></span> <span class="hljs-title"><span class="hljs-keyword">payable</span></span> </span>{
        <span class="hljs-built_in">require</span>(<span class="hljs-built_in">msg</span>.<span class="hljs-built_in">value</span> <span class="hljs-operator">></span> <span class="hljs-number">0</span>, <span class="hljs-string">"Invalid deposit amount"</span>);

        balances[<span class="hljs-built_in">msg</span>.<span class="hljs-built_in">sender</span>] <span class="hljs-operator">+</span><span class="hljs-operator">=</span> <span class="hljs-built_in">msg</span>.<span class="hljs-built_in">value</span>;
        <span class="hljs-keyword">emit</span> Deposit(<span class="hljs-built_in">msg</span>.<span class="hljs-built_in">sender</span>, <span class="hljs-built_in">msg</span>.<span class="hljs-built_in">value</span>);
    }

    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">withdraw</span>(<span class="hljs-params"><span class="hljs-keyword">uint256</span> amount</span>) <span class="hljs-title"><span class="hljs-keyword">external</span></span> </span>{
        <span class="hljs-built_in">require</span>(amount <span class="hljs-operator">></span> <span class="hljs-number">0</span>, <span class="hljs-string">"Invalid withdrawal amount"</span>);
        <span class="hljs-built_in">require</span>(balances[<span class="hljs-built_in">msg</span>.<span class="hljs-built_in">sender</span>] <span class="hljs-operator">></span><span class="hljs-operator">=</span> amount, <span class="hljs-string">"Insufficient balance"</span>);

        balances[<span class="hljs-built_in">msg</span>.<span class="hljs-built_in">sender</span>] <span class="hljs-operator">-</span><span class="hljs-operator">=</span> amount;

        (<span class="hljs-keyword">bool</span> success, ) <span class="hljs-operator">=</span> <span class="hljs-keyword">payable</span>(<span class="hljs-built_in">msg</span>.<span class="hljs-built_in">sender</span>).<span class="hljs-built_in">call</span>{<span class="hljs-built_in">value</span>: amount}(<span class="hljs-string">""</span>);
        <span class="hljs-keyword">if</span> (<span class="hljs-operator">!</span>success) {
            <span class="hljs-keyword">revert</span>(<span class="hljs-string">"Withdrawal failed"</span>);
        }

        <span class="hljs-keyword">emit</span> Withdrawal(<span class="hljs-built_in">msg</span>.<span class="hljs-built_in">sender</span>, amount);
    }

    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">getBalance</span>(<span class="hljs-params"></span>) <span class="hljs-title"><span class="hljs-keyword">public</span></span> <span class="hljs-title"><span class="hljs-keyword">view</span></span> <span class="hljs-title"><span class="hljs-keyword">returns</span></span> (<span class="hljs-params"><span class="hljs-keyword">uint256</span></span>) </span>{
        <span class="hljs-keyword">return</span> balances[<span class="hljs-built_in">msg</span>.<span class="hljs-built_in">sender</span>];
    }
}
</code></pre><ul><li><p>Заходим в папку <code>deploy</code> и редактируем <code>deploy.ts</code>:</p></li></ul><pre data-type="codeBlock" text="import fs from &quot;fs&quot;;
import { utils, Wallet } from &quot;zksync-web3&quot;;
import * as ethers from &quot;ethers&quot;;
import { HardhatRuntimeEnvironment } from &quot;hardhat/types&quot;;
import { Deployer } from &quot;@matterlabs/hardhat-zksync-deploy&quot;;

const PRIV_KEY = fs.readFileSync(&quot;.secret&quot;).toString();

export default async function (hre: HardhatRuntimeEnvironment) {
  console.log(`Running deploy script for your contract`);

  const wallet = new Wallet(PRIV_KEY);

  const deployer = new Deployer(hre, wallet);
  const artifact = await deployer.loadArtifact(&quot;EtherDeposit&quot;);

  const contract = await deployer.deploy(artifact, []);
  console.log(&quot;constructor args:&quot; + contract.interface.encodeDeploy([]));

  const contractAddress = contract.address;
  console.log(`${artifact.contractName} was deployed to ${contractAddress}`);
}
"><code><span class="hljs-keyword">import</span> <span class="hljs-title">fs</span> <span class="hljs-title"><span class="hljs-keyword">from</span></span> <span class="hljs-string">"fs"</span>;
<span class="hljs-keyword">import</span> { <span class="hljs-title">utils</span>, <span class="hljs-title">Wallet</span> } <span class="hljs-title"><span class="hljs-keyword">from</span></span> <span class="hljs-string">"zksync-web3"</span>;
<span class="hljs-keyword">import</span> <span class="hljs-operator">*</span> <span class="hljs-title"><span class="hljs-keyword">as</span></span> <span class="hljs-title">ethers</span> <span class="hljs-title"><span class="hljs-keyword">from</span></span> <span class="hljs-string">"ethers"</span>;
<span class="hljs-keyword">import</span> { <span class="hljs-title">HardhatRuntimeEnvironment</span> } <span class="hljs-title"><span class="hljs-keyword">from</span></span> <span class="hljs-string">"hardhat/types"</span>;
<span class="hljs-keyword">import</span> { <span class="hljs-title">Deployer</span> } <span class="hljs-title"><span class="hljs-keyword">from</span></span> <span class="hljs-string">"@matterlabs/hardhat-zksync-deploy"</span>;

const PRIV_KEY <span class="hljs-operator">=</span> fs.readFileSync(<span class="hljs-string">".secret"</span>).toString();

export default async <span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params">hre: HardhatRuntimeEnvironment</span>) </span>{
  console.log(`Running deploy script <span class="hljs-keyword">for</span> your <span class="hljs-class"><span class="hljs-keyword">contract</span>`);

  <span class="hljs-title">const</span> <span class="hljs-title">wallet</span> = <span class="hljs-title"><span class="hljs-keyword">new</span></span> <span class="hljs-title">Wallet</span>(<span class="hljs-params">PRIV_KEY</span>);

  <span class="hljs-title">const</span> <span class="hljs-title">deployer</span> = <span class="hljs-title"><span class="hljs-keyword">new</span></span> <span class="hljs-title">Deployer</span>(<span class="hljs-params">hre, wallet</span>);
  <span class="hljs-title">const</span> <span class="hljs-title">artifact</span> = <span class="hljs-title">await</span> <span class="hljs-title">deployer</span>.<span class="hljs-title">loadArtifact</span>(<span class="hljs-params"><span class="hljs-string">"EtherDeposit"</span></span>);

  <span class="hljs-title">const</span> <span class="hljs-title"><span class="hljs-keyword">contract</span></span> = <span class="hljs-title">await</span> <span class="hljs-title">deployer</span>.<span class="hljs-title">deploy</span>(<span class="hljs-params">artifact, []</span>);
  <span class="hljs-title">console</span>.<span class="hljs-title">log</span>(<span class="hljs-params"><span class="hljs-string">"constructor args:"</span> + <span class="hljs-keyword">contract</span>.<span class="hljs-keyword">interface</span>.encodeDeploy(<span class="hljs-params">[]</span>)</span>);

  <span class="hljs-title">const</span> <span class="hljs-title">contractAddress</span> = <span class="hljs-title"><span class="hljs-keyword">contract</span></span>.<span class="hljs-title"><span class="hljs-keyword">address</span></span>;
  <span class="hljs-title">console</span>.<span class="hljs-title">log</span>(<span class="hljs-params">`${artifact.contractName} was deployed to ${contractAddress}`</span>);
}
</span></code></pre><ul><li><p>Не забываем в файл <code>.secrets</code> вписать приватный ключ</p></li><li><p>Компилируем контракт командой:</p></li></ul><pre data-type="codeBlock" text="npx hardhat compile
"><code>npx hardhat <span class="hljs-built_in">compile</span>
</code></pre><ul><li><p>Если контракт успешно скомпилился, деплоим его командой:</p></li></ul><pre data-type="codeBlock" text="npx hardhat deploy-zksync
"><code>npx hardhat deploy<span class="hljs-operator">-</span>zksync
</code></pre><ul><li><p>Верифицируем контракт для zkSync Scan:</p></li></ul><pre data-type="codeBlock" text="npm i -D @matterlabs/hardhat-zksync-verify
"><code>npm i <span class="hljs-operator">-</span>D @matterlabs<span class="hljs-operator">/</span>hardhat<span class="hljs-operator">-</span>zksync<span class="hljs-operator">-</span>verify
</code></pre><pre data-type="codeBlock" text="npx hardhat verify 0xВАШ_АДРЕС_КОНТРАКТА
"><code>npx hardhat verify 0xВАШ<span class="hljs-keyword">_</span>АДРЕС<span class="hljs-keyword">_</span>КОНТРАКТА
</code></pre><h3 id="h-vot-i-vse-vy-zadeploili-svoj-kontrakt-i-teper-adres-kontrakta-s-konfiga-mozhete-zamenit-na-svoj" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">Вот и все, вы задеплоили свой контракт, и теперь адрес контракта с конфига можете заменить на свой.</h3><hr><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://t.me/roccrypto">https://t.me/roccrypto</a></p><div data-type="subscribeButton" class="center-contents"><a class="email-subscribe-button" href="null">Subscribe</a></div>]]></content:encoded>
            <author>roccrypto@newsletter.paragraph.com (The Roccrypto)</author>
            <enclosure url="https://storage.googleapis.com/papyrus_images/233a6b056f7074d9bc15110bd4a400cba712acd9288eb16b8e8cad2a4201fec1.jpg" length="0" type="image/jpg"/>
        </item>
        <item>
            <title><![CDATA[Пошагово деплоим контракты: zkSync Era, Base, Scroll]]></title>
            <link>https://paragraph.com/@roccrypto/zksync-era-base-scroll</link>
            <guid>CbsM6FMpYSZiS2f9duXB</guid>
            <pubDate>Tue, 13 Jun 2023 09:02:34 GMT</pubDate>
            <description><![CDATA[В этой статье вы найдете 3 гайда по деплою контрактов на zkSync Era, Base и Scroll.Приступим!zkSync EraЦена деплоя: ~5$ в ETH Сложность деплоя: 1 способ - классика, сложно. 2 способ - Thirdweb, легкоКачаем Visual Studio Code с оф. сайта https://code.visualstudio.com/Выбираем Английский язык при установке и оставляем дефолтные галочкиПосле установки, создаем папку на робочем столе с названием zksyncЗапускаем VSCode и открываем там же эту папкуКачаем Node.js с офф сайта и устанавливаем. При уст...]]></description>
            <content:encoded><![CDATA[<h3 id="h-v-etoj-state-vy-najdete-3-gajda-po-deployu-kontraktov-na-zksync-era-base-i-scroll" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">В этой статье вы найдете 3 гайда по деплою контрактов на zkSync Era, Base и Scroll.</h3><p><strong>Приступим!</strong></p><hr><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/07130462e9b7e35f3ab1f4dc9adbdd3c594b9ad417cd8b8a84f1e09da9f581db.png" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><h2 id="h-zksync-era" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">zkSync Era</h2><p><strong>Цена деплоя</strong>: ~5$ в ETH <strong>Сложность деплоя:</strong> 1 способ - классика, сложно. 2 способ - Thirdweb, легко</p><ul><li><p>Качаем <strong>Visual Studio Code</strong> с оф. сайта <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://code.visualstudio.com/">https://code.visualstudio.com/</a></p></li><li><p>Выбираем <strong>Английский язык</strong> при установке и оставляем дефолтные галочки</p></li><li><p>После установки, создаем <strong>папку</strong> на робочем столе с названием <code>zksync</code></p></li></ul><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/47e1f50be907fe19b7dffde1336db4519d663a6ba012452b12b9c10544a20ad7.png" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><ul><li><p>Запускаем <strong>VSCode</strong> и открываем там же эту папку</p></li></ul><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/1f4dd5347ee854e77a7c2799c168e1fc458b636805326745946f05dd76cd58fd.png" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><ul><li><p>Качаем <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://nodejs.org/dist/v18.16.0/node-v18.16.0-x64.msi">Node.js</a> с офф сайта и устанавливаем. При установке ничего не меняем. <strong>После перезагружаем ПК.</strong></p></li><li><p>Заходим обратно в <strong>VScode</strong>, нажимаем <strong>CTRL + J,</strong> чтобы снизу открылся терминал.</p></li><li><p>Вставляем туда следующее:</p></li></ul><pre data-type="codeBlock" text="npm init -y
"><code>npm <span class="hljs-keyword">init</span> -y
</code></pre><ul><li><p>Если после команды у вас так, то все отлично:</p></li></ul><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/0ebbbb0ed257b467d0a29877d49a90886d07d2713807a39f59c5597457e72df4.png" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><ul><li><p>Вставляем следующую команду и ждем конца загрузки:</p></li></ul><pre data-type="codeBlock" text="npm add -D typescript ts-node @types/node ethers@^5.7.2 zksync-web3@^0.14.3 @ethersproject/hash @ethersproject/web hardhat @matterlabs/hardhat-zksync-solc @matterlabs/hardhat-zksync-deploy
"><code>npm add <span class="hljs-operator">-</span>D typescript ts<span class="hljs-operator">-</span>node @types<span class="hljs-operator">/</span>node ethers@<span class="hljs-operator">^</span><span class="hljs-number">5.7</span><span class="hljs-number">.2</span> zksync<span class="hljs-operator">-</span>web3@<span class="hljs-operator">^</span><span class="hljs-number">0</span><span class="hljs-number">.14</span><span class="hljs-number">.3</span> @ethersproject<span class="hljs-operator">/</span>hash @ethersproject<span class="hljs-operator">/</span>web hardhat @matterlabs<span class="hljs-operator">/</span>hardhat<span class="hljs-operator">-</span>zksync<span class="hljs-operator">-</span>solc @matterlabs<span class="hljs-operator">/</span>hardhat<span class="hljs-operator">-</span>zksync<span class="hljs-operator">-</span>deploy
</code></pre><ul><li><p>Пишем команду, которая установит библиотеку с контрактами <strong>OpenZeppelin:</strong></p><pre data-type="codeBlock" text="npm install @openzeppelin/contracts
"><code>npm install @openzeppelin/contracts
</code></pre></li><li><p>Жмем плюсик и создаем новый файл с названием <code>hardhat.config.ts</code></p></li></ul><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/bec82bd0f99292842d715d70607b2c5ff337362ba94d87442c1faffa388351ea.png" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><ul><li><p>Вставляем код в <code>hardhat.config.ts</code> и после жмем <strong>CTRL+S</strong>:</p></li></ul><pre data-type="codeBlock" text="import &quot;@matterlabs/hardhat-zksync-deploy&quot;;
import &quot;@matterlabs/hardhat-zksync-solc&quot;;

module.exports = {
  zksolc: {
    version: &quot;1.3.5&quot;,
    compilerSource: &quot;binary&quot;,
    settings: {},
  },
  defaultNetwork: &quot;zkSyncMainnet&quot;,

  networks: {
    zkSyncMainnet: {
      url: &quot;https://zksync2-mainnet.zksync.io&quot;,
      ethNetwork: &quot;mainnet&quot;,
      zksync: true,
    },
  },
  solidity: {
    version: &quot;0.8.17&quot;,
  },
};
"><code>import "<span class="hljs-keyword">@matterlabs</span>/hardhat-zksync-deploy";
import "<span class="hljs-keyword">@matterlabs</span>/hardhat-zksync-solc";

module<span class="hljs-selector-class">.exports</span> = {
  zksolc: {
    version: <span class="hljs-string">"1.3.5"</span>,
    compilerSource: <span class="hljs-string">"binary"</span>,
    settings: {},
  },
  defaultNetwork: <span class="hljs-string">"zkSyncMainnet"</span>,

  networks: {
    zkSyncMainnet: {
      url: <span class="hljs-string">"https://zksync2-mainnet.zksync.io"</span>,
      ethNetwork: <span class="hljs-string">"mainnet"</span>,
      zksync: true,
    },
  },
  solidity: {
    version: <span class="hljs-string">"0.8.17"</span>,
  },
};
</code></pre><ul><li><p>Нажимаем на другой плюсик и создаем папку с названием <code>contracts</code> Нажимаем на папку и создаем файл <code>contract.sol</code> . Любые параметры (те что в “ “) ставим под себя - полное название, тикер токена. Вставляем код контракта:</p></li></ul><pre data-type="codeBlock" text="// SPDX-License-Identifier: MIT
pragma solidity ^0.8.9;

import &quot;@openzeppelin/contracts/token/ERC20/ERC20.sol&quot;;
import &quot;@openzeppelin/contracts/access/Ownable.sol&quot;;

contract Roccrypto is ERC20, Ownable {
    constructor() ERC20(&quot;roccrypto&quot;, &quot;rocc&quot;) {
        _mint(msg.sender, 100 * 10 ** decimals());
    }

    function mint(address to, uint256 amount) public onlyOwner {
        _mint(to, amount);
    }
}
"><code><span class="hljs-comment">// SPDX-License-Identifier: MIT</span>
<span class="hljs-meta"><span class="hljs-keyword">pragma</span> <span class="hljs-keyword">solidity</span> ^0.8.9;</span>

<span class="hljs-keyword">import</span> <span class="hljs-string">"@openzeppelin/contracts/token/ERC20/ERC20.sol"</span>;
<span class="hljs-keyword">import</span> <span class="hljs-string">"@openzeppelin/contracts/access/Ownable.sol"</span>;

<span class="hljs-class"><span class="hljs-keyword">contract</span> <span class="hljs-title">Roccrypto</span> <span class="hljs-keyword">is</span> <span class="hljs-title">ERC20</span>, <span class="hljs-title">Ownable</span> </span>{
    <span class="hljs-function"><span class="hljs-keyword">constructor</span>(<span class="hljs-params"></span>) <span class="hljs-title">ERC20</span>(<span class="hljs-params"><span class="hljs-string">"roccrypto"</span>, <span class="hljs-string">"rocc"</span></span>) </span>{
        _mint(<span class="hljs-built_in">msg</span>.<span class="hljs-built_in">sender</span>, <span class="hljs-number">100</span> <span class="hljs-operator">*</span> <span class="hljs-number">10</span> <span class="hljs-operator">*</span><span class="hljs-operator">*</span> decimals());
    }

    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">mint</span>(<span class="hljs-params"><span class="hljs-keyword">address</span> to, <span class="hljs-keyword">uint256</span> amount</span>) <span class="hljs-title"><span class="hljs-keyword">public</span></span> <span class="hljs-title">onlyOwner</span> </span>{
        _mint(to, amount);
    }
}
</code></pre><ul><li><p>Сохраняем файл на CTRL+S</p></li></ul><p>Тут мы создаем самый обычный ERC20 токен с тикером <code>rocc</code> . Любые другие контракты мы можем брать с документации <strong>OpenZeppelin.</strong> Но чтобы их деплоить, нужно немного понимать <strong>JS/TS</strong>. Если вы захотите деплоить другие контракты, которых нет в гайде, но не знаете эти ЯП - воспользуйтесь <strong>ChatGPT</strong>, чтобы он вам написал <code>deploy.ts</code> скрипт для деплоя ваших контрактов.</p><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://docs.openzeppelin.com/">https://docs.openzeppelin.com/</a></p><ul><li><p>Компилируем контракт командой в терминале:</p><pre data-type="codeBlock" text="npx hardhat compile
"><code>npx hardhat <span class="hljs-built_in">compile</span>
</code></pre></li></ul><p>Если все успешно, у вас должен быть такой результат:</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/c720ed42d9f10aee364488669125d8329dfd421ac97b23e9dcc8f123f67c8846.png" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><ul><li><p>Жмем на общую папку <code>zksync</code> и в ней создаем папку с названием <code>deploy</code> . В этой папке создаем файл <code>deploy.ts</code> , вставляем код и меняем в нем адрес <code>0x123...</code>, на который будут минтиться токены. Сохраняем на <strong>CTRL+S:</strong></p></li></ul><pre data-type="codeBlock" text="import fs from &quot;fs&quot;;
import { utils, Wallet } from &quot;zksync-web3&quot;;
import * as ethers from &quot;ethers&quot;;
import { HardhatRuntimeEnvironment } from &quot;hardhat/types&quot;;
import { Deployer } from &quot;@matterlabs/hardhat-zksync-deploy&quot;;

const PRIV_KEY = fs.readFileSync(&quot;.secret&quot;).toString();

export default async function (hre: HardhatRuntimeEnvironment) {
  console.log(`Running deploy script for the Roccrypto contract`);

  const wallet = new Wallet(PRIV_KEY);

  const deployer = new Deployer(hre, wallet);
  const artifact = await deployer.loadArtifact(&quot;Roccrypto&quot;);

  const roccryptoContract = await deployer.deploy(artifact, []);
  console.log(&quot;constructor args:&quot; + roccryptoContract.interface.encodeDeploy([]));

  const contractAddress = roccryptoContract.address;
  console.log(`${artifact.contractName} was deployed to ${contractAddress}`);

  // Mint some tokens to an address.
  const to = &quot;0x123...&quot;; // Адрес куда минтить токены.
  const amount = ethers.utils.parseEther(&quot;10&quot;); // Сколько токенов нужно заминтить на этот адрес
  const mintHandle = await roccryptoContract.mint(to, amount);
  await mintHandle.wait();

  console.log(`Minted ${amount} tokens to ${to}`);
}
"><code><span class="hljs-keyword">import</span> fs <span class="hljs-keyword">from</span> <span class="hljs-string">"fs"</span>;
<span class="hljs-keyword">import</span> { utils, <span class="hljs-title class_">Wallet</span> } <span class="hljs-keyword">from</span> <span class="hljs-string">"zksync-web3"</span>;
<span class="hljs-keyword">import</span> * <span class="hljs-keyword">as</span> ethers <span class="hljs-keyword">from</span> <span class="hljs-string">"ethers"</span>;
<span class="hljs-keyword">import</span> { <span class="hljs-title class_">HardhatRuntimeEnvironment</span> } <span class="hljs-keyword">from</span> <span class="hljs-string">"hardhat/types"</span>;
<span class="hljs-keyword">import</span> { <span class="hljs-title class_">Deployer</span> } <span class="hljs-keyword">from</span> <span class="hljs-string">"@matterlabs/hardhat-zksync-deploy"</span>;

<span class="hljs-keyword">const</span> <span class="hljs-variable constant_">PRIV_KEY</span> = fs.<span class="hljs-title function_">readFileSync</span>(<span class="hljs-string">".secret"</span>).<span class="hljs-title function_">toString</span>();

<span class="hljs-keyword">export</span> <span class="hljs-keyword">default</span> <span class="hljs-keyword">async</span> <span class="hljs-keyword">function</span> (<span class="hljs-params">hre: HardhatRuntimeEnvironment</span>) {
  <span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(<span class="hljs-string">`Running deploy script for the Roccrypto contract`</span>);

  <span class="hljs-keyword">const</span> wallet = <span class="hljs-keyword">new</span> <span class="hljs-title class_">Wallet</span>(<span class="hljs-variable constant_">PRIV_KEY</span>);

  <span class="hljs-keyword">const</span> deployer = <span class="hljs-keyword">new</span> <span class="hljs-title class_">Deployer</span>(hre, wallet);
  <span class="hljs-keyword">const</span> artifact = <span class="hljs-keyword">await</span> deployer.<span class="hljs-title function_">loadArtifact</span>(<span class="hljs-string">"Roccrypto"</span>);

  <span class="hljs-keyword">const</span> roccryptoContract = <span class="hljs-keyword">await</span> deployer.<span class="hljs-title function_">deploy</span>(artifact, []);
  <span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(<span class="hljs-string">"constructor args:"</span> + roccryptoContract.<span class="hljs-property">interface</span>.<span class="hljs-title function_">encodeDeploy</span>([]));

  <span class="hljs-keyword">const</span> contractAddress = roccryptoContract.<span class="hljs-property">address</span>;
  <span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(<span class="hljs-string">`<span class="hljs-subst">${artifact.contractName}</span> was deployed to <span class="hljs-subst">${contractAddress}</span>`</span>);

  <span class="hljs-comment">// Mint some tokens to an address.</span>
  <span class="hljs-keyword">const</span> to = <span class="hljs-string">"0x123..."</span>; <span class="hljs-comment">// Адрес куда минтить токены.</span>
  <span class="hljs-keyword">const</span> amount = ethers.<span class="hljs-property">utils</span>.<span class="hljs-title function_">parseEther</span>(<span class="hljs-string">"10"</span>); <span class="hljs-comment">// Сколько токенов нужно заминтить на этот адрес</span>
  <span class="hljs-keyword">const</span> mintHandle = <span class="hljs-keyword">await</span> roccryptoContract.<span class="hljs-title function_">mint</span>(to, amount);
  <span class="hljs-keyword">await</span> mintHandle.<span class="hljs-title function_">wait</span>();

  <span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(<span class="hljs-string">`Minted <span class="hljs-subst">${amount}</span> tokens to <span class="hljs-subst">${to}</span>`</span>);
}
</code></pre><ul><li><p>Создаем файл <code>.secret</code> в общей папке <code>zksync</code>. В этот файл мы должны вставить приватный ключ (с балансом, ~5$ в ETH сети zkSync Era), с которого будет деплоится наш контракт. <strong>Не держите много баланса, если не уверены в своих следующих действиях. Советую сначала протестировать, а потом деплоить на мультиакках.</strong></p></li><li><p>Деплоим контракт с помощью команды:</p><pre data-type="codeBlock" text="npx hardhat deploy-zksync
"><code>npx hardhat deploy<span class="hljs-operator">-</span>zksync
</code></pre></li></ul><p><strong>Ура, мы смогли задеплоить контракт и заминтить токены на наш адрес!</strong></p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/19ecea4f30c786c5beaee0da2da9ad56a6a84433a7329caed618b22030ad1230.png" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><p><strong>UPD: BONUS</strong></p><p>Еще контракты на zkSync можно деплоить через сервис <strong>Thirdweb</strong>, и если вам не нравится классический способ/не доверяете ему - юзаем этот.</p><ul><li><p>Заходим на <strong>Thirdweb</strong> и ищем нужный нам контракт - <code>Token</code></p></li></ul><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://thirdweb.com/explore">https://thirdweb.com/explore</a></p><ul><li><p>Нажимаем <code>Deploy now</code></p></li></ul><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/373ebf44b17db02bd65da4daca6bbea6a2af3d5ed63e7d95a9594123edd8b418.png" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><ul><li><p>Заполняем данные нашего токена и обязательно выбираем <code>zkSync Era Mainnet</code></p></li><li><p>Жмем Deploy Now и подписываем транзакцию.</p></li></ul><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/0e25ffaec10619350d74607b0809502cecac2d6aa6de6be87f81a8d52d01af20.png" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><ul><li><p>В результате имеем легкий способ для деплоя контракта</p></li></ul><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/1354636442b4169c41e64aac0e4788921f091b3d8369a6c20e3fdda13d4d975a.png" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><hr><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/73af106100b2806d2f455981c27b125190195a2b075e256f35a5c8473407fbe4.png" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><h2 id="h-base" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Base</h2><p><strong>Цена деплоя:</strong> FREE (Goerlii ETH) <strong>Мост:</strong> <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="http://bridge.base.org/deposit">bridge.base.org/deposit</a>** Сложность деплоя:** Легко</p><p>Для начала пользуемся мостом и получаем нативные ETH на кошелек.</p><ul><li><p>Заходим на <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://chainlist.org/">Chainlist</a>, ищем <code>Base Goerli Testnet</code> и подключаем к нему кошелек. Обязательно переключаем сеть внутри самого кошелька!</p></li></ul><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/832c42a65839e65ee44340cf5928e6c4f56fb329ead658ed197168260e79bac6.png" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><ul><li><p>Заходим на <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://docs.openzeppelin.com/contracts/4.x/wizard">Contracts Wizard</a> от <strong>OpenZeppelin</strong></p></li><li><p>Выбираем <code>ERC20</code> токен и заполняем первый пункт на свой вкус. Ставим галочки на <code>Mintable</code> и <code>Burnable</code></p></li></ul><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/bdad13f96ea7601cd49355040f01ee860f51fd4bc09bc6e0487fce044bc9701a.png" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><ul><li><p>Нажимаем <code>открыть в Remix</code></p></li><li><p>Ставим галочку на <code>Auto compile</code></p></li></ul><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/88dd7851434c788e7c8b6ac57179d2a5a1a7aa373f543a726c22606f15e887eb.png" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><ul><li><p>Выбираем <code>Injected Provider - Metamask</code> и подключем кошелек к сайту</p></li></ul><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/4e22ed28296fabef4eb4ddf3aec1c7b7a334c188112059dd32d9574a9dd427d9.png" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><ul><li><p>Нажимаем <code>Deploy</code>, подтверждаем транзакцию в <strong>Metamask</strong></p></li></ul><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/c5794b5e4de8ba79e23183ec545c420ecc171ce0ff615e801716a05f335131db.png" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><p><strong>Теперь мы успешно задеплоили контракт на Base! Но чтобы каждый раз не повторяться, советую поэкспериментировать и деплоить разные контракты.</strong></p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/4f4dc1dee15e1f9f22873ea87b660cd947ccc4c03e4fe7470a1898842703ab7f.png" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><hr><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/2b87d11214d0cd0342d09c3b27523ca7553ea864d39bbc7b9f91a026d68e3a07.png" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><h2 id="h-scroll" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Scroll</h2><p><strong>Цена деплоя:</strong> FREE (Goerli ETH) <strong>Мост:</strong> <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="http://scroll.io/bridge">scroll.io/bridge</a>** Сложность:** Легко</p><p>Для начала пользуемся мостом и получаем нативные ETH на кошелек.</p><ul><li><p>Заходим на <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://chainlist.org/"><strong>Chainlist</strong></a>, ищем <code>Scroll Alpha Testnet</code> и подключаем к нему кошелек. <strong>Обязательно переключаем сеть внутри самого кошелька!</strong></p></li></ul><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/552828953e2663d8ba96ffbe620ee47d2bf215e7759ca69c24f53039aa69e7a2.png" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><ul><li><p>Заходим на <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://docs.openzeppelin.com/contracts/4.x/wizard">Contracts Wizard</a> от <strong>OpenZeppelin</strong></p></li><li><p>Выбираем <code>ERC20</code> токен и заполняем первый пункт на свой вкус. Ставим галочки на <code>Mintable</code> и <code>Burnable</code></p></li></ul><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/bdad13f96ea7601cd49355040f01ee860f51fd4bc09bc6e0487fce044bc9701a.png" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><ul><li><p>Нажимаем <code>открыть в Remix</code></p></li><li><p>Ставим галочку на <code>Auto compile</code></p></li></ul><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/88dd7851434c788e7c8b6ac57179d2a5a1a7aa373f543a726c22606f15e887eb.png" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><ul><li><p>Выбираем <code>Injected Provider - Metamask</code> и подключем кошелек к сайту</p></li></ul><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/4e22ed28296fabef4eb4ddf3aec1c7b7a334c188112059dd32d9574a9dd427d9.png" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><ul><li><p>Нажимаем <code>Deploy</code>, подтверждаем транзакцию в <strong>Metamask</strong></p></li></ul><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/c5794b5e4de8ba79e23183ec545c420ecc171ce0ff615e801716a05f335131db.png" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><p><strong>Вот мы и задеплоили наш финальный контракт!</strong></p><blockquote><p>Следующая статья будет о том, как правильно <strong>верифицировать</strong> и <strong>взаимодействовать</strong> с нашими свежими контрактами. Ведь мы дофига “билдеры”, и тем самым подходим под нужные критерии несколькими транзакциями: мы <code>задеплоили контракт</code> и <code>будем с ним взаимодействовать</code>, прогнали <code>транзакцию</code> в нужной нам сети, а в будущем даже будем <code>гонять объем</code> через свои контракты, затрагивая пункт <strong>Transaction value.</strong></p></blockquote><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://t.me/roccrypto">https://t.me/roccrypto</a></p><div data-type="subscribeButton" class="center-contents"><a class="email-subscribe-button" href="null">Subscribe</a></div>]]></content:encoded>
            <author>roccrypto@newsletter.paragraph.com (The Roccrypto)</author>
            <enclosure url="https://storage.googleapis.com/papyrus_images/03dc7e064c3c56fa3ea57f41aeaa8d7402d2757d6298abd43a4c31884a66febf.jpg" length="0" type="image/jpg"/>
        </item>
    </channel>
</rss>