Схема работы всего этого довольно проста: • Деплоим свой контракт, который работает в качестве ячейки хранения для баланса. Состоит он из трех функций: Deposit, Withdraw и getBalance.• Взаимодействуем с этим контрактом, отсылая ETH на адрес, вызывая функцию Deposit. • Когда мы прогнали нужное количество транзакций и объем Эфира, вызываем функцию Withdraw, забирая свой баланс обратно на кошелек.
Стратегии:
Фарм количества транзакций
Прогон объема в ETH (Transaction Value, как было в Arbitrum)
Обычный прогрев кошелька на дистанции, балансируя и количество транзакций и разумный объем.
Цена одной транзакции: ~0.10$ - 0.15$ в ETH
Разбавляя активность кошельков деплоями своих контрактов, и взаимодействий с ними, мы показываем, что мы некие "билдеры" и хотим сделать свой вклад в развитие сети.
Уверяю, кастомные контракты - это тема, которую многие недооценивают. Даже самый дебильный, но личный, контракт будет лучше любой очередной транзакции на юзлессной dapp'ке.
Скрипт
Без скрипта я вас снова не оставил. Далее вы найдете пошаговый гайд + репозиторий с Github, где есть весь опенсорс код скрипта. С ним можно работать на нескольких кошельках, а время между депозитами и количество ETH - рандомное.
Контракт

В гайде мы будем использовать контракт, который задеплоил я. Сильно настаиваю на том, чтобы вы задеплоили свой, а не использовали мой, так как это свяжет ваши кошельки с другими. Если вы полный ноль в деплое - сначала прочитайте прошлую статью. После - прочитайте эту статью до конца, и в конце будет код точно такого же контракта. Но если вы не переживаете за связь кошельков, то пожалуйста:
0x7442E417C0B53d622d93F5D7BbD84eEd808F26C5. Я его верифицировал на zkSync скане, так что код полностью открыт.
Как было упомянуто раньше, в нем всего 3 простых функции:
Deposit - депозит ETH на контракт
Withdraw - вывод ETH с контракта
getBalance - проверка баланса, безгазовая функция
Чтобы задепозитить вручную, заходим на контракт, нажимаем на Write и подключаем кошелек кнопкой Connect MetaMask. Далее, deposit и вписуем к-во ETH, например 0.00001.

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

Чтобы вывести, мы так же заходим в раздел Write. После нажатия на withdraw, мы вписываем в поле количество ETH, которое хотим вывести. Но функция withdraw принимает значения ETH только в Wei, так что заходим на сайт и конвертируем Ether в Wei. Подтверждаем транзакцию на кнопку write, и мы успешно вывели свои деньги с контракта!
Если вы не хотите все это делать вручную, я подготовил для этого скрипт. **Внимание! Я не отвечаю за ваши средства, так что все действия вы делаете на свой страх и риск. И мой контракт, и следующий код - opensouce, вы можете сами их проверить, если желаете. ** Репозиторий:
https://github.com/Nomzegh/zkSyncTXs
Конфиг

Чтобы нормально начать работать со скриптом, вам нужно выставить значения в конфиге под себя:
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).
Запуск

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

Если вы не хотите пользоваться моим контрактом, вы можете задеплоить личный.
Эта часть статьи для более продвинутых пользователей, так что если вы пропустили мою прошлую статью о том, как деплоить контракты на zkSyncEra Mainnet, советую её прочитать, так как не будете понимать следующее.
В 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ВАШ_АДРЕС_КОНТРАКТА

