# Пошагово деплоим контракты: zkSync Era, Base, Scroll

By [The Roccrypto](https://paragraph.com/@roccrypto) · 2023-06-13

---

### В этой статье вы найдете 3 гайда по деплою контрактов на zkSync Era, Base и Scroll.

**Приступим!**

* * *

![](https://storage.googleapis.com/papyrus_images/07130462e9b7e35f3ab1f4dc9adbdd3c594b9ad417cd8b8a84f1e09da9f581db.png)

zkSync Era
----------

**Цена деплоя**: ~5$ в ETH **Сложность деплоя:** 1 способ - классика, сложно. 2 способ - Thirdweb, легко

*   Качаем **Visual Studio Code** с оф. сайта [https://code.visualstudio.com/](https://code.visualstudio.com/)
    
*   Выбираем **Английский язык** при установке и оставляем дефолтные галочки
    
*   После установки, создаем **папку** на робочем столе с названием `zksync`
    

![](https://storage.googleapis.com/papyrus_images/47e1f50be907fe19b7dffde1336db4519d663a6ba012452b12b9c10544a20ad7.png)

*   Запускаем **VSCode** и открываем там же эту папку
    

![](https://storage.googleapis.com/papyrus_images/1f4dd5347ee854e77a7c2799c168e1fc458b636805326745946f05dd76cd58fd.png)

*   Качаем [Node.js](https://nodejs.org/dist/v18.16.0/node-v18.16.0-x64.msi) с офф сайта и устанавливаем. При установке ничего не меняем. **После перезагружаем ПК.**
    
*   Заходим обратно в **VScode**, нажимаем **CTRL + J,** чтобы снизу открылся терминал.
    
*   Вставляем туда следующее:
    

    npm init -y
    

*   Если после команды у вас так, то все отлично:
    

![](https://storage.googleapis.com/papyrus_images/0ebbbb0ed257b467d0a29877d49a90886d07d2713807a39f59c5597457e72df4.png)

*   Вставляем следующую команду и ждем конца загрузки:
    

    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
    

*   Пишем команду, которая установит библиотеку с контрактами **OpenZeppelin:**
    
        npm install @openzeppelin/contracts
        
    
*   Жмем плюсик и создаем новый файл с названием `hardhat.config.ts`
    

![](https://storage.googleapis.com/papyrus_images/bec82bd0f99292842d715d70607b2c5ff337362ba94d87442c1faffa388351ea.png)

*   Вставляем код в `hardhat.config.ts` и после жмем **CTRL+S**:
    

    import "@matterlabs/hardhat-zksync-deploy";
    import "@matterlabs/hardhat-zksync-solc";
    
    module.exports = {
      zksolc: {
        version: "1.3.5",
        compilerSource: "binary",
        settings: {},
      },
      defaultNetwork: "zkSyncMainnet",
    
      networks: {
        zkSyncMainnet: {
          url: "https://zksync2-mainnet.zksync.io",
          ethNetwork: "mainnet",
          zksync: true,
        },
      },
      solidity: {
        version: "0.8.17",
      },
    };
    

*   Нажимаем на другой плюсик и создаем папку с названием `contracts` Нажимаем на папку и создаем файл `contract.sol` . Любые параметры (те что в “ “) ставим под себя - полное название, тикер токена. Вставляем код контракта:
    

    // SPDX-License-Identifier: MIT
    pragma solidity ^0.8.9;
    
    import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
    import "@openzeppelin/contracts/access/Ownable.sol";
    
    contract Roccrypto is ERC20, Ownable {
        constructor() ERC20("roccrypto", "rocc") {
            _mint(msg.sender, 100 * 10 ** decimals());
        }
    
        function mint(address to, uint256 amount) public onlyOwner {
            _mint(to, amount);
        }
    }
    

*   Сохраняем файл на CTRL+S
    

Тут мы создаем самый обычный ERC20 токен с тикером `rocc` . Любые другие контракты мы можем брать с документации **OpenZeppelin.** Но чтобы их деплоить, нужно немного понимать **JS/TS**. Если вы захотите деплоить другие контракты, которых нет в гайде, но не знаете эти ЯП - воспользуйтесь **ChatGPT**, чтобы он вам написал `deploy.ts` скрипт для деплоя ваших контрактов.

[https://docs.openzeppelin.com/](https://docs.openzeppelin.com/)

*   Компилируем контракт командой в терминале:
    
        npx hardhat compile
        
    

Если все успешно, у вас должен быть такой результат:

![](https://storage.googleapis.com/papyrus_images/c720ed42d9f10aee364488669125d8329dfd421ac97b23e9dcc8f123f67c8846.png)

*   Жмем на общую папку `zksync` и в ней создаем папку с названием `deploy` . В этой папке создаем файл `deploy.ts` , вставляем код и меняем в нем адрес `0x123...`, на который будут минтиться токены. Сохраняем на **CTRL+S:**
    

    import fs from "fs";
    import { utils, Wallet } from "zksync-web3";
    import * as ethers from "ethers";
    import { HardhatRuntimeEnvironment } from "hardhat/types";
    import { Deployer } from "@matterlabs/hardhat-zksync-deploy";
    
    const PRIV_KEY = fs.readFileSync(".secret").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("Roccrypto");
    
      const roccryptoContract = await deployer.deploy(artifact, []);
      console.log("constructor args:" + roccryptoContract.interface.encodeDeploy([]));
    
      const contractAddress = roccryptoContract.address;
      console.log(`${artifact.contractName} was deployed to ${contractAddress}`);
    
      // Mint some tokens to an address.
      const to = "0x123..."; // Адрес куда минтить токены.
      const amount = ethers.utils.parseEther("10"); // Сколько токенов нужно заминтить на этот адрес
      const mintHandle = await roccryptoContract.mint(to, amount);
      await mintHandle.wait();
    
      console.log(`Minted ${amount} tokens to ${to}`);
    }
    

*   Создаем файл `.secret` в общей папке `zksync`. В этот файл мы должны вставить приватный ключ (с балансом, ~5$ в ETH сети zkSync Era), с которого будет деплоится наш контракт. **Не держите много баланса, если не уверены в своих следующих действиях. Советую сначала протестировать, а потом деплоить на мультиакках.**
    
*   Деплоим контракт с помощью команды:
    
        npx hardhat deploy-zksync
        
    

**Ура, мы смогли задеплоить контракт и заминтить токены на наш адрес!**

![](https://storage.googleapis.com/papyrus_images/19ecea4f30c786c5beaee0da2da9ad56a6a84433a7329caed618b22030ad1230.png)

**UPD: BONUS**

Еще контракты на zkSync можно деплоить через сервис **Thirdweb**, и если вам не нравится классический способ/не доверяете ему - юзаем этот.

*   Заходим на **Thirdweb** и ищем нужный нам контракт - `Token`
    

[https://thirdweb.com/explore](https://thirdweb.com/explore)

*   Нажимаем `Deploy now`
    

![](https://storage.googleapis.com/papyrus_images/373ebf44b17db02bd65da4daca6bbea6a2af3d5ed63e7d95a9594123edd8b418.png)

*   Заполняем данные нашего токена и обязательно выбираем `zkSync Era Mainnet`
    
*   Жмем Deploy Now и подписываем транзакцию.
    

![](https://storage.googleapis.com/papyrus_images/0e25ffaec10619350d74607b0809502cecac2d6aa6de6be87f81a8d52d01af20.png)

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

![](https://storage.googleapis.com/papyrus_images/1354636442b4169c41e64aac0e4788921f091b3d8369a6c20e3fdda13d4d975a.png)

* * *

![](https://storage.googleapis.com/papyrus_images/73af106100b2806d2f455981c27b125190195a2b075e256f35a5c8473407fbe4.png)

Base
----

**Цена деплоя:** FREE (Goerlii ETH) **Мост:** [bridge.base.org/deposit](http://bridge.base.org/deposit)\*\* Сложность деплоя:\*\* Легко

Для начала пользуемся мостом и получаем нативные ETH на кошелек.

*   Заходим на [Chainlist](https://chainlist.org/), ищем `Base Goerli Testnet` и подключаем к нему кошелек. Обязательно переключаем сеть внутри самого кошелька!
    

![](https://storage.googleapis.com/papyrus_images/832c42a65839e65ee44340cf5928e6c4f56fb329ead658ed197168260e79bac6.png)

*   Заходим на [Contracts Wizard](https://docs.openzeppelin.com/contracts/4.x/wizard) от **OpenZeppelin**
    
*   Выбираем `ERC20` токен и заполняем первый пункт на свой вкус. Ставим галочки на `Mintable` и `Burnable`
    

![](https://storage.googleapis.com/papyrus_images/bdad13f96ea7601cd49355040f01ee860f51fd4bc09bc6e0487fce044bc9701a.png)

*   Нажимаем `открыть в Remix`
    
*   Ставим галочку на `Auto compile`
    

![](https://storage.googleapis.com/papyrus_images/88dd7851434c788e7c8b6ac57179d2a5a1a7aa373f543a726c22606f15e887eb.png)

*   Выбираем `Injected Provider - Metamask` и подключем кошелек к сайту
    

![](https://storage.googleapis.com/papyrus_images/4e22ed28296fabef4eb4ddf3aec1c7b7a334c188112059dd32d9574a9dd427d9.png)

*   Нажимаем `Deploy`, подтверждаем транзакцию в **Metamask**
    

![](https://storage.googleapis.com/papyrus_images/c5794b5e4de8ba79e23183ec545c420ecc171ce0ff615e801716a05f335131db.png)

**Теперь мы успешно задеплоили контракт на Base! Но чтобы каждый раз не повторяться, советую поэкспериментировать и деплоить разные контракты.**

![](https://storage.googleapis.com/papyrus_images/4f4dc1dee15e1f9f22873ea87b660cd947ccc4c03e4fe7470a1898842703ab7f.png)

* * *

![](https://storage.googleapis.com/papyrus_images/2b87d11214d0cd0342d09c3b27523ca7553ea864d39bbc7b9f91a026d68e3a07.png)

Scroll
------

**Цена деплоя:** FREE (Goerli ETH) **Мост:** [scroll.io/bridge](http://scroll.io/bridge)\*\* Сложность:\*\* Легко

Для начала пользуемся мостом и получаем нативные ETH на кошелек.

*   Заходим на [**Chainlist**](https://chainlist.org/), ищем `Scroll Alpha Testnet` и подключаем к нему кошелек. **Обязательно переключаем сеть внутри самого кошелька!**
    

![](https://storage.googleapis.com/papyrus_images/552828953e2663d8ba96ffbe620ee47d2bf215e7759ca69c24f53039aa69e7a2.png)

*   Заходим на [Contracts Wizard](https://docs.openzeppelin.com/contracts/4.x/wizard) от **OpenZeppelin**
    
*   Выбираем `ERC20` токен и заполняем первый пункт на свой вкус. Ставим галочки на `Mintable` и `Burnable`
    

![](https://storage.googleapis.com/papyrus_images/bdad13f96ea7601cd49355040f01ee860f51fd4bc09bc6e0487fce044bc9701a.png)

*   Нажимаем `открыть в Remix`
    
*   Ставим галочку на `Auto compile`
    

![](https://storage.googleapis.com/papyrus_images/88dd7851434c788e7c8b6ac57179d2a5a1a7aa373f543a726c22606f15e887eb.png)

*   Выбираем `Injected Provider - Metamask` и подключем кошелек к сайту
    

![](https://storage.googleapis.com/papyrus_images/4e22ed28296fabef4eb4ddf3aec1c7b7a334c188112059dd32d9574a9dd427d9.png)

*   Нажимаем `Deploy`, подтверждаем транзакцию в **Metamask**
    

![](https://storage.googleapis.com/papyrus_images/c5794b5e4de8ba79e23183ec545c420ecc171ce0ff615e801716a05f335131db.png)

**Вот мы и задеплоили наш финальный контракт!**

> Следующая статья будет о том, как правильно **верифицировать** и **взаимодействовать** с нашими свежими контрактами. Ведь мы дофига “билдеры”, и тем самым подходим под нужные критерии несколькими транзакциями: мы `задеплоили контракт` и `будем с ним взаимодействовать`, прогнали `транзакцию` в нужной нам сети, а в будущем даже будем `гонять объем` через свои контракты, затрагивая пункт **Transaction value.**

[https://t.me/roccrypto](https://t.me/roccrypto)

[Subscribe](null)

---

*Originally published on [The Roccrypto](https://paragraph.com/@roccrypto/zksync-era-base-scroll)*
