Wallet

Wallet capabilities from the Web3.js plugin for ZKsync

The Web3.js plugin for ZKsync exposes a wallet that allows developers to create, manage, and use ZKsync accounts.

Create a wallet

Once the Web3.js plugin for ZKsync has been registered, it can be used to create a wallet.

import { Web3 } from "web3";
import {
  types,
  Web3ZKsyncL2,
  ZKsyncPlugin,
  ZKsyncWallet,
} from "web3-plugin-zksync";

async function main() {
  const web3: Web3 = new Web3(/* optional L1 provider */);
  web3.registerPlugin(
    new ZKsyncPlugin(
      Web3ZKsyncL2.initWithDefaultProvider(types.Network.Sepolia),
    ),
  );
  const zksync: ZKsyncPlugin = web3.ZKsync;

  const PRIVATE_KEY: string = "<PRIVATE_KEY>";
  const wallet: ZKsyncWallet = new zksync.Wallet(PRIVATE_KEY);

  console.log("Wallet address:", await wallet.getAddress());
}

main()
  .then(() => console.log("✅ Script executed successfully"))
  .catch((error) => console.error(`❌ Error executing script: ${error}`));

Deposit

The ZKsyncWallet.deposit method is used to transfer ETH or any ERC-20 token from the wallet's L1 account to the target account on the ZKsync Era network.

import { TransactionReceipt, utils, Web3 } from "web3";
import {
  constants,
  types,
  Web3ZKsyncL2,
  ZKsyncPlugin,
  ZKsyncWallet,
} from "web3-plugin-zksync";

async function main() {
  const web3: Web3 = new Web3("https://rpc.sepolia.org");
  web3.registerPlugin(
    new ZKsyncPlugin(
      Web3ZKsyncL2.initWithDefaultProvider(types.Network.Sepolia),
    ),
  );
  const zksync: ZKsyncPlugin = web3.ZKsync;

  const PRIVATE_KEY: string = "<PRIVATE_KEY>";
  const wallet: ZKsyncWallet = new zksync.Wallet(PRIVATE_KEY);
  const senderL1BeginningBalance: bigint = await wallet.getBalanceL1();

  const receiver: string = "<RECEIVER_ADDRESS>";
  const receiverL2BeginningBalance: bigint =
    await zksync.L2.getBalance(receiver);

  const tx: types.PriorityOpResponse = await wallet.deposit({
    token: constants.ETH_ADDRESS,
    to: receiver,
    amount: utils.toWei("0.00020", "ether"),
    refundRecipient: wallet.getAddress(),
  });

  const receipt: TransactionReceipt = await tx.waitFinalize();
  console.log("Transaction Hash:", receipt.transactionHash);

  console.log(
    "Sender Change In L1 Balance:",
    (await wallet.getBalanceL1()) - senderL1BeginningBalance,
  );
  console.log(
    "Receiver Change In L2 Balance:",
    (await zksync.L2.getBalance(receiver)) - receiverL2BeginningBalance,
  );
}

main()
  .then(() => console.log("✅ Script executed successfully"))
  .catch((error) => console.error(`❌ Error executing script: ${error}`));

Withdraw

The ZKsyncWallet.withdraw method and ZKsyncWallet.finalizeWithdrawal method are used to transfer ETH or any ERC-20 token from the wallet's account on the ZKsync Era network to the target account on the L1 network.

import { TransactionReceipt, utils, Web3 } from "web3";
import {
  constants,
  types,
  Web3ZKsyncL2,
  ZKsyncPlugin,
  ZKsyncWallet,
} from "web3-plugin-zksync";

async function main() {
  const web3: Web3 = new Web3("https://rpc.sepolia.org");
  web3.registerPlugin(
    new ZKsyncPlugin(
      Web3ZKsyncL2.initWithDefaultProvider(types.Network.Sepolia),
    ),
  );
  const zksync: ZKsyncPlugin = web3.ZKsync;

  const PRIVATE_KEY: string = "<PRIVATE_KEY>";
  const wallet: ZKsyncWallet = new zksync.Wallet(PRIVATE_KEY);
  const senderL2BeginningBalance: bigint = await wallet.getBalance();

  const receiver: string = "<RECEIVER_ADDRESS>";
  const receiverL1BeginningBalance: bigint =
    await web3.eth.getBalance(receiver);

  const withdrawTx: types.PriorityOpResponse = await wallet.withdraw({
    token: constants.ETH_ADDRESS,
    to: receiver,
    amount: utils.toWei("0.00020", "ether"),
  });

  const receipt: TransactionReceipt = await withdrawTx.waitFinalize();
  console.log("Transaction Hash:", receipt.transactionHash);

  console.log(
    "[Before Finalize Withdrawal] Sender Change In L2 Balance:",
    (await wallet.getBalance()) - senderL2BeginningBalance,
  );
  console.log(
    "[Before Finalize Withdrawal] Receiver Change In L1 Balance:",
    (await web3.eth.getBalance(receiver)) - receiverL1BeginningBalance,
  );

  await wallet.finalizeWithdrawal(receipt.transactionHash);

  console.log(
    "[After Finalize Withdrawal] Sender Change In L2 Balance:",
    (await wallet.getBalance()) - senderL2BeginningBalance,
  );
  console.log(
    "[After Finalize Withdrawal] Receiver Change In L1 Balance:",
    (await web3.eth.getBalance(receiver)) - receiverL1BeginningBalance,
  );
}

main()
  .then(() => console.log("✅ Script executed successfully"))
  .catch((error) => console.error(`❌ Error executing script: ${error}`));

Made with ❤️ by the ZKsync Community