# Продолжаем гонять бич-транзакции

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

---

### На этот раз у нас zkSync Era Mainnet. Пост является неким продолжением прошлой статьи о деплое контрактов.

**Схема работы всего этого довольно проста:** • Деплоим свой контракт, который работает в качестве ячейки хранения для баланса. Состоит он из трех функций: `Deposit`, `Withdraw` и `getBalance`.• Взаимодействуем с этим контрактом, отсылая ETH на адрес, вызывая функцию `Deposit`. • Когда мы прогнали нужное количество транзакций и объем Эфира, вызываем функцию `Withdraw`, забирая свой баланс обратно на кошелек.

**Стратегии:**

1.  Фарм количества транзакций
    
2.  Прогон объема в ETH (**Transaction Value**, как было в **Arbitrum**)
    
3.  Обычный прогрев кошелька на дистанции, балансируя и количество транзакций и разумный объем.
    

**Цена одной транзакции: ~0.10$ - 0.15$ в ETH**

Разбавляя активность кошельков деплоями своих контрактов, и взаимодействий с ними, мы показываем, что мы некие "билдеры" и хотим сделать свой вклад в развитие сети.

Уверяю, кастомные контракты - это тема, которую многие недооценивают. Даже самый дебильный, но личный, контракт будет лучше любой очередной транзакции на юзлессной dapp'ке.

**Скрипт**

**Без скрипта я вас снова не оставил.** Далее вы найдете пошаговый гайд + [репозиторий с Github](https://github.com/Nomzegh/zkSyncTXs), где есть весь опенсорс код скрипта. С ним можно работать на нескольких кошельках, а время между депозитами и количество ETH - рандомное.

**Контракт**

![функции контракта](https://storage.googleapis.com/papyrus_images/5d16f3b64eb821f04a19ec8e9e7ed136e1af0d1c3a08f05a8284889727196b19.png)

функции контракта

**В гайде мы будем использовать контракт, который задеплоил я. Сильно настаиваю на том, чтобы вы задеплоили свой, а не использовали мой, так как это свяжет ваши кошельки с другими.** Если вы полный ноль в деплое - сначала [прочитайте прошлую статью](https://mirror.xyz/roccrypto.eth/5nOtVRCnkiwerztfcnFI7h0IHfjEDK111KE9eawTen4). После - прочитайте эту статью до конца, и в конце будет код точно такого же контракта. Но если вы не переживаете за связь кошельков, то пожалуйста:

[0x7442E417C0B53d622d93F5D7BbD84eEd808F26C5](https://explorer.zksync.io/address/0x7442E417C0B53d622d93F5D7BbD84eEd808F26C5#contract). **Я его верифицировал на zkSync скане, так что код полностью открыт.**

**Как было упомянуто раньше, в нем всего 3 простых функции:**

*   **Deposit** - депозит ETH на контракт
    
*   **Withdraw** - вывод ETH с контракта
    
*   **getBalance** - проверка баланса, безгазовая функция
    

* * *

Депозит
-------

Чтобы задепозитить вручную, [заходим на контракт](https://explorer.zksync.io/address/0x7442E417C0B53d622d93F5D7BbD84eEd808F26C5#contract), нажимаем на `Write` и подключаем кошелек кнопкой `Connect MetaMask`. Далее, `deposit` и вписуем к-во ETH, например 0.00001.

![компенсация газа](https://storage.googleapis.com/papyrus_images/49d9963d268c24b18b321ba9c49e027e91a167c24365a06aac5668a0581e6830.png)

компенсация газа

В окне транзакции от **Metamask**, мы должны вручную поменять лимит газа, установив его на **500000**. В результате вам покажет цену около 0.20$, но на деле заплатите вы меньше (0.1$-0.15$), так как газ, который не был использован сетью, вернется через **Gas Refund (компенсация газа)**. Подтверждаем транзакцию и мы успешно задепозитили ETH на контракт.

Вывод
-----

![eth converter](https://storage.googleapis.com/papyrus_images/de4f7740647ef92ed581f9535b948d1294fee2d5bcc4d989a1ddce5685bdaf89.png)

eth converter

Чтобы вывести, мы так же заходим в раздел `Write`. После нажатия на `withdraw`, мы вписываем в поле количество **ETH**, которое хотим вывести. **Но функция withdraw принимает значения ETH только в Wei,** так что [заходим на сайт](https://eth-converter.com/) и конвертируем **Ether** в **Wei**. Подтверждаем транзакцию на кнопку `write`, и мы успешно вывели свои деньги с контракта!

Скрипт
------

Если вы не хотите все это делать вручную, я подготовил для этого скрипт. \*\*Внимание! Я не отвечаю за ваши средства, так что все действия вы делаете на свой страх и риск. И мой контракт, и следующий код - opensouce, вы можете сами их проверить, если желаете. \*\* **Репозиторий:**

[https://github.com/Nomzegh/zkSyncTXs](https://github.com/Nomzegh/zkSyncTXs)

* * *

**Конфиг**

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

Чтобы нормально начать работать со скриптом, вам нужно выставить значения в конфиге под себя:

*   `from_sec` : минимальное значение в секундах, от которого код будет ждать между транзакциями
    
*   `to_sec` : максимальное значение в секундах, до которого код будет ждать между транзакциями
    
*   `eth_min` : Минимальное значение в ETH, от которого скрипт будет рандомить число ETH для депозита
    
*   `eth_max` : Максимальное значение в ETH, до которого скрипт будет рандомить число ETH для депозита
    
*   `contract_address` : Всегда 0x7442E417C0B53d622d93F5D7BbD84eEd808F26C5, либо заменить на свой контракт
    
*   `RPC` : Всегда `https://mainnet.era.zksync.io`, либо заменить на свою RPC
    

* * *

**Приватные ключи**

Чтобы работал скрипт, нужно вставить приватные ключи аккаунтов, с которыми хотите работать в скрипте.Для этого нужно создать файл `keys.txt`, который должен находиться возле двух других файлов, необходимых для работы скрипта (`cheap_zk.py` и `abi.py`).

* * *

**Запуск**

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

**После запуска нам нужно выбрать одну из опций - вписать цифру:**

`1` : **Депозит**. При выборе `Deposit`, скрипт выберет рандомное значение ETH, которое он задепозитит, исходя из минимальных/максимальных значений в конфиге. `2` : **Вывод**. При выборе `Withdraw`, скрипт проверит ваш баланс на контракте, и выведет полную сумму ETH обратно на ваш кошелек. `3` : **Проверка баланса**. При выборе `Check Balance`, скрипт проверит ваш баланс на контракте, но выводить его не будет.

* * *

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

Деплой своего контракта
-----------------------

**Если вы не хотите пользоваться моим контрактом, вы можете задеплоить личный.**

Эта часть статьи для более продвинутых пользователей, так что если вы пропустили мою прошлую статью о том, как деплоить контракты на zkSyncEra Mainnet, [советую её прочитать](https://mirror.xyz/roccrypto.eth/5nOtVRCnkiwerztfcnFI7h0IHfjEDK111KE9eawTen4), так как не будете понимать следующее.

*   В hardhat.config.ts , до всего того, что мы вписывали ранее, вписываем импорт:
    

    import "@matterlabs/hardhat-zksync-verify";
    

*   Заходим в папку `contracts` и редактируем файл `contract.sol`:
    

    // SPDX-License-Identifier: MIT
    pragma solidity ^0.8.0;
    
    contract EtherDeposit {
        mapping(address => uint256) private balances;
    
        event Deposit(address indexed account, uint256 amount);
        event Withdrawal(address indexed account, uint256 amount);
    
        function deposit() external payable {
            require(msg.value > 0, "Invalid deposit amount");
    
            balances[msg.sender] += msg.value;
            emit Deposit(msg.sender, msg.value);
        }
    
        function withdraw(uint256 amount) external {
            require(amount > 0, "Invalid withdrawal amount");
            require(balances[msg.sender] >= amount, "Insufficient balance");
    
            balances[msg.sender] -= amount;
    
            (bool success, ) = payable(msg.sender).call{value: amount}("");
            if (!success) {
                revert("Withdrawal failed");
            }
    
            emit Withdrawal(msg.sender, amount);
        }
    
        function getBalance() public view returns (uint256) {
            return balances[msg.sender];
        }
    }
    

*   Заходим в папку `deploy` и редактируем `deploy.ts`:
    

    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 your contract`);
    
      const wallet = new Wallet(PRIV_KEY);
    
      const deployer = new Deployer(hre, wallet);
      const artifact = await deployer.loadArtifact("EtherDeposit");
    
      const contract = await deployer.deploy(artifact, []);
      console.log("constructor args:" + contract.interface.encodeDeploy([]));
    
      const contractAddress = contract.address;
      console.log(`${artifact.contractName} was deployed to ${contractAddress}`);
    }
    

*   Не забываем в файл `.secrets` вписать приватный ключ
    
*   Компилируем контракт командой:
    

    npx hardhat compile
    

*   Если контракт успешно скомпилился, деплоим его командой:
    

    npx hardhat deploy-zksync
    

*   Верифицируем контракт для zkSync Scan:
    

    npm i -D @matterlabs/hardhat-zksync-verify
    

    npx hardhat verify 0xВАШ_АДРЕС_КОНТРАКТА
    

### Вот и все, вы задеплоили свой контракт, и теперь адрес контракта с конфига можете заменить на свой.

* * *

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

[Subscribe](null)

---

*Originally published on [The Roccrypto](https://paragraph.com/@roccrypto/hTYPqrTckqu4yPZDwpWA)*
