Signer
This class is to be used in a browser environment. The easiest way to construct it is to
use the getSigner
method of the Web3Provider
. This structure extends ethers.providers.JsonRpcSigner
and so supports all the methods available for it.
import { Web3Provider, Provider, types } from "zksync-ethers";
const browserProvider = new Web3Provider(window.ethereum);
const signer = Signer.from(browserProvider.getSigner(), Provider.getDefaultProvider(types.Network.Sepolia));
getAllBalances
Returns all token balances of the account.
async getAllBalances(): Promise<BalancesMap>
Example
import { Web3Provider, Provider, types } from "zksync-ethers";
const browserProvider = new Web3Provider(window.ethereum);
const signer = Signer.from(browserProvider.getSigner(), Provider.getDefaultProvider(types.Network.Sepolia));
const allBalances = await signer.getAllBalances();
getBalance
Returns the amount of the token the Signer
has.
Inputs
Parameter | Type | Description |
---|---|---|
token? | Address | The address of the token. ETH by default. |
blockTag | BlockTag | In which block a balance should be checked on. committed , i.e. the latest processed one is the default option. |
async getBalance(token?: Address, blockTag: BlockTag = 'committed'): Promise<BigNumber>
Example
Get ETH balance.
import { Web3Provider, Provider, types } from "zksync-ethers";
const browserProvider = new Web3Provider(window.ethereum);
const signer = Signer.from(browserProvider.getSigner(), Provider.getDefaultProvider(types.Network.Sepolia));
console.log(`ETH balance: ${await signer.getBalance()}`);
Get token balance.
import { Web3Provider, Provider, types } from "zksync-ethers";
const browserProvider = new Web3Provider(window.ethereum);
const signer = Signer.from(browserProvider.getSigner(), Provider.getDefaultProvider(types.Network.Sepolia));
const token = "0x6a4Fb925583F7D4dF82de62d98107468aE846FD1";
console.log(`Token balance: ${await signer.getBalance(token)}`);
getDeploymentNonce
Returns the deployment nonce of the account.
async getDeploymentNonce(): Promise<BigNumber>
Example
import { Web3Provider, Provider, types } from "zksync-ethers";
const browserProvider = new Web3Provider(window.ethereum);
const signer = Signer.from(browserProvider.getSigner(), Provider.getDefaultProvider(types.Network.Sepolia));
console.log(`Nonce: ${await signer.getDeploymentNonce()}`);
getL2BridgeContracts
Returns L2 bridge contracts.
async getL2BridgeContracts(): Promise<{
erc20: IL2Bridge;
weth: IL2Bridge;
shared: IL2Bridge;
}>
Example
import { Web3Provider, Provider, types } from "zksync-ethers";
const browserProvider = new Web3Provider(window.ethereum);
const signer = Signer.from(browserProvider.getSigner(), Provider.getDefaultProvider(types.Network.Sepolia));
const l2BridgeContracts = await signer.getL2BridgeContracts();
getNonce
Returns account's nonce number.
Inputs
Parameter | Type | Description |
---|---|---|
blockTag? | BlockTag | In which block a balance should be checked on. committed , i.e. the latest processed one is the default option. |
async getNonce(blockTag?: BlockTag): Promise<number>
Example
import { Web3Provider, Provider, types } from "zksync-ethers";
const browserProvider = new Web3Provider(window.ethereum);
const signer = Signer.from(browserProvider.getSigner(), Provider.getDefaultProvider(types.Network.Sepolia));
const nonce = await signer.getNonce();
transfer
Please note that for now, unlike Ethereum, ZKsync does not support native transfers,
i.e. the value
field of all transactions is equal to 0
. All the token transfers are done
through ERC20 transfer
function calls.
But for convenience, the Wallet
class has transfer
method, which can transfer any ERC20
tokens.
Inputs
Parameter | Type | Description |
---|---|---|
transaction.to | Address | The address of the recipient. |
transaction.amount | BigNumberish | The amount of the token to transfer. |
transaction.token? | Address | The address of the token. ETH by default. |
transaction.paymasterParams? | PaymasterParams | Paymaster parameters. |
transaction.overrides? | ethers.CallOverrides | Transaction's overrides which may be used to pass L2 gasLimit , gasPrice , value , etc. |
async transfer(transaction: {
to: Address;
amount: BigNumberish;
token?: Address;
paymasterParams?: PaymasterParams;
overrides?: ethers.CallOverrides;
}): Promise<ethers.ContractTransaction>
Examples
Transfer ETH.
import { Web3Provider, Provider, Wallet, types } from "zksync-ethers";
import { ethers } from "ethers";
const browserProvider = new Web3Provider(window.ethereum);
const signer = Signer.from(
browserProvider.getSigner(),
Provider.getDefaultProvider(types.Network.Sepolia)
);
const transferTx = await signer.transfer({
to: Wallet.createRandom().address,
amount: ethers.utils.parseEther("0.01"),
});
const receipt = await transferTx.wait();
console.log(`The sum of ${receipt.value} ETH was transferred to ${receipt.to}`);
Transfer ETH using paymaster to facilitate fee payment with an ERC20 token.
import { Web3Provider, Provider, Wallet, types } from "zksync-ethers";
import { ethers } from "ethers";
const token = "0x927488F48ffbc32112F1fF721759649A89721F8F"; // Crown token which can be minted for free
const paymaster = "0x13D0D8550769f59aa241a41897D4859c87f7Dd46"; // Paymaster for Crown token
const browserProvider = new Web3Provider(window.ethereum);
const signer = Signer.from(
browserProvider.getSigner(),
Provider.getDefaultProvider(types.Network.Sepolia)
);
const transferTx = await signer.transfer({
to: Wallet.createRandom().address,
amount: ethers.utils.parseEther("0.01"),
paymasterParams: utils.getPaymasterParams(paymaster, {
type: "ApprovalBased",
token: token,
minimalAllowance: 1,
innerInput: new Uint8Array(),
}),
});
const receipt = await transferTx.wait();
console.log(`The sum of ${receipt.value} ETH was transferred to ${receipt.to}`);
Transfer token.
import { Wallet, Provider, types, utils } from "zksync-ethers";
import { ethers } from "ethers";
const PRIVATE_KEY = "<WALLET_PRIVATE_KEY>";
const browserProvider = new Web3Provider(window.ethereum);
const signer = Signer.from(browserProvider.getSigner(), Provider.getDefaultProvider(types.Network.Sepolia));
const tokenL2 = "0x6a4Fb925583F7D4dF82de62d98107468aE846FD1";
const transferTx = await signer.transfer({
token: tokenL2,
to: Wallet.createRandom().address,
amount: ethers.utils.parseEther("0.01"),
});
const receipt = await transferHandle.wait();
console.log(`The sum of ${receipt.value} token was transferred to ${receipt.to}`);
Transfer token using paymaster to facilitate fee payment with an ERC20 token.
import { Wallet, Provider, types, utils } from "zksync-ethers";
import { ethers } from "ethers";
const PRIVATE_KEY = "<WALLET_PRIVATE_KEY>";
const token = "0x927488F48ffbc32112F1fF721759649A89721F8F"; // Crown token which can be minted for free
const paymaster = "0x13D0D8550769f59aa241a41897D4859c87f7Dd46"; // Paymaster for Crown token
const provider = Provider.getDefaultProvider(types.Network.Sepolia);
const wallet = new Wallet(PRIVATE_KEY, provider);
const tokenL2 = "0x6a4Fb925583F7D4dF82de62d98107468aE846FD1";
const transferTx = await wallet.transfer({
token: tokenL2,
to: Wallet.createRandom().address,
amount: ethers.utils.parseEther("0.01"),
paymasterParams: utils.getPaymasterParams(paymaster, {
type: "ApprovalBased",
token: token,
minimalAllowance: 1,
innerInput: new Uint8Array(),
}),
});
const receipt = await transferTx.wait();
console.log(`The sum of ${receipt.value} token was transferred to ${receipt.to}`);
withdraw
Initiates the withdrawal process which withdraws ETH or any ERC20 token from the associated account on L2 network to the target account on L1 network.
Inputs
Parameter | Type | Description |
---|---|---|
transaction.token | Address | The address of the token. ETH by default. |
transaction.amount | BigNumberish | The amount of the token to withdraw. |
transaction.to? | Address | The address of the recipient on L1. |
transaction.bridgeAddress? | Address | The address of the bridge contract to be used. |
transaction.paymasterParams? | PaymasterParams | Paymaster parameters. |
transaction.overrides? | ethers.CallOverrides | Transaction's overrides which may be used to pass L2 gasLimit , gasPrice , value , etc. |
async withdraw(transaction: {
token: Address;
amount: BigNumberish;
to?: Address;
bridgeAddress?: Address;
paymasterParams?: PaymasterParams;
overrides?: ethers.CallOverrides;
}): Promise<TransactionResponse>
Examples
Withdraw ETH.
import { Web3Provider, Provider, types, utils } from "zksync-ethers";
const browserProvider = new Web3Provider(window.ethereum);
const signer = Signer.from(
browserProvider.getSigner(),
Provider.getDefaultProvider(types.Network.Sepolia)
);
await signer.withdraw({
token: utils.ETH_ADDRESS,
amount: 10_000_000,
});
Withdraw ETH using paymaster to facilitate fee payment with an ERC20 token.
import { Web3Provider, Provider, types, utils } from "zksync-ethers";
const token = "0x927488F48ffbc32112F1fF721759649A89721F8F"; // Crown token which can be minted for free
const paymaster = "0x13D0D8550769f59aa241a41897D4859c87f7Dd46"; // Paymaster for Crown token
const browserProvider = new Web3Provider(window.ethereum);
const signer = Signer.from(
browserProvider.getSigner(),
Provider.getDefaultProvider(types.Network.Sepolia)
);
await signer.withdraw({
token: utils.ETH_ADDRESS,
amount: 10_000_000,
paymasterParams: utils.getPaymasterParams(paymaster, {
type: "ApprovalBased",
token: token,
minimalAllowance: 1,
innerInput: new Uint8Array(),
}),
});
Withdraw token.
import { Wallet, Provider, types, utils } from "zksync-ethers";
const PRIVATE_KEY = "<WALLET_PRIVATE_KEY>";
const provider = Provider.getDefaultProvider(types.Network.Sepolia);
const wallet = new Wallet(PRIVATE_KEY, provider);
const tokenL2 = "0x6a4Fb925583F7D4dF82de62d98107468aE846FD1";
const withdrawTx = await wallet.withdraw({
token: tokenL2,
amount: 10_000_000,
});
Withdraw token using paymaster to facilitate fee payment with an ERC20 token.
import { Wallet, Provider, types, utils } from "zksync-ethers";
const PRIVATE_KEY = "<WALLET_PRIVATE_KEY>";
const token = "0x927488F48ffbc32112F1fF721759649A89721F8F"; // Crown token which can be minted for free
const paymaster = "0x13D0D8550769f59aa241a41897D4859c87f7Dd46"; // Paymaster for Crown token
const provider = Provider.getDefaultProvider(types.Network.Sepolia);
const wallet = new Wallet(PRIVATE_KEY, provider);
const tokenL2 = "0x6a4Fb925583F7D4dF82de62d98107468aE846FD1";
const withdrawTx = await wallet.withdraw({
token: tokenL2,
amount: 10_000_000,
paymasterParams: utils.getPaymasterParams(paymaster, {
type: "ApprovalBased",
token: token,
minimalAllowance: 1,
innerInput: new Uint8Array(),
}),
});